파이썬에서 'Yahoo! News'의 주요 뉴스 타이틀을 스크래핑 해 보았습니다.

11890 단어 파이썬scraping

동기



스크래핑으로 하고 싶은 것이 있었으므로, 참고 기사를 읽으면서 배우고 보고 싶다.

참고 기사



초보자를 위해 파이썬으로 웹 스크래핑을하는 방법을 정리합니다 (사무라이 엔지니어 학원)
htps //w w. 세주쿠. 네 t/bぉg/51241

절차



우선은 작업용의 프로젝트 폴더를 작성.
$ mkdir project
$ cd project
$ mkdir scrapingSyllabus
$ ls
scrapingSyllabus
$ cd scrapingSyllabus
$ pwd
~/project/scrapingSyllabus

칸류.

파이썬은 mac 표준 탑재이므로 환경 구축은 필요없다.

「그러고 보면 pyenv 왜 도입하고 있었을까」라고 생각 확인.

pyenv ...python의 버전 관리 툴. rbenv 자매 도구
$ pyenv versions
* system (set by /Users/user/.pyenv/version)
  3.6.5

넣었다.

모처럼 pyenv 넣고 있다면 프로젝트마다 버전 관리하고 싶으면 욕심이 나온다.

토리마 파이썬 버전을 최신 버전으로 만듭니다.
$ pyenv local 3.6.5
$ pyenv versions
  system
* 3.6.5 (set by /Users/user/projects/scrapingSyllabus/.python-version)

칸류.

pip3에서 requests를 넣습니다.
$ pip3 install requests
Collecting requests
  Cache entry deserialization failed, entry ignored
  Using cached https://files.pythonhosted.org/packages/65/47/7e02164a2a3db50ed6d8a6ab1d6d60b69c4c3fdf57a284257925dfc12bda/requests-2.19.1-py2.py3-none-any.whl
Requirement already satisfied: idna<2.8,>=2.5 in /Users/user/.pyenv/versions/3.6.5/lib/python3.6/site-packages (from requests) (2.6)
Collecting urllib3<1.24,>=1.21.1 (from requests)
  Cache entry deserialization failed, entry ignored
  Using cached https://files.pythonhosted.org/packages/bd/c9/6fdd990019071a4a32a5e7cb78a1d92c53851ef4f56f62a3486e6a7d8ffb/urllib3-1.23-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests)
  Cache entry deserialization failed, entry ignored
  Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests)
  Cache entry deserialization failed, entry ignored
  Using cached https://files.pythonhosted.org/packages/df/f7/04fee6ac349e915b82171f8e23cee63644d83663b34c539f7a09aed18f9e/certifi-2018.8.24-py2.py3-none-any.whl
Installing collected packages: urllib3, chardet, certifi, requests
Successfully installed certifi-2018.8.24 chardet-3.0.4 requests-2.19.1 urllib3-1.23
Cache entry deserialization failed, entry ignored
You are using pip version 10.0.1, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

pip가 최신판이 아니라고 화났다. 최신 버전이 아니면 업데이트 할 수 없습니까?

지정된 명령으로 업그레이드합니다.
$ pip install --upgrade pip
Collecting pip
  Using cached https://files.pythonhosted.org/packages/5f/25/e52d3f31441505a5f3af41213346e5b6c221c9e086a166f3703d2ddaf940/pip-18.0-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 10.0.1
    Uninstalling pip-10.0.1:
      Successfully uninstalled pip-10.0.1
Successfully installed pip-18.0

오케.

만나고 requests를 넣는다.
$ pip3 install requests
Requirement already satisfied: requests in /Users/user/.pyenv/versions/3.6.5/lib/python3.6/site-packages (2.19.1)
Requirement already satisfied: certifi>=2017.4.17 in /Users/user/.pyenv/versions/3.6.5/lib/python3.6/site-packages (from requests) (2018.8.24)
Requirement already satisfied: urllib3<1.24,>=1.21.1 in /Users/user/.pyenv/versions/3.6.5/lib/python3.6/site-packages (from requests) (1.23)
Requirement already satisfied: idna<2.8,>=2.5 in /Users/user/.pyenv/versions/3.6.5/lib/python3.6/site-packages (from requests) (2.6)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /Users/user/.pyenv/versions/3.6.5/lib/python3.6/site-packages (from requests) (3.0.4)

오케.

참고 기사를 따라 읽어 보자.scrapingSyllabus.py 를 만들고 import 에서 requests를 지정하고 ...
( content 의 내용이 너무 많아 실행하지 않음)

scrapingSyllabus.py
import requests

r = requests.get('https://news.yahoo.co.jp')

print(r.headers)
print("--------")
print(r.encoding)
#print(r.content)

실행!
$ python scrapingSyllabus.py
{'Date': 'Wed, 12 Sep 2018 14:41:11 GMT', 'P3P': 'policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'X-Frame-Options': 'SAMEORIGIN', 'Vary': 'Accept-Encoding', 'Content-Encoding': 'gzip', 'Content-Length': '9493', 'Content-Type': 'text/html; charset=UTF-8', 'Age': '0', 'Connection': 'keep-alive', 'Via': 'http/1.1 edge1074.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ])', 'Server': 'ATS', 'Set-Cookie': 'TLS=v=1.2&r=1; path=/; domain=.yahoo.co.jp; Secure'}
--------
UTF-8

나왔다.
각각 취득하고 싶은 데이터를 지정해 주면 그 정보만 추출할 수 있다.
headers → ヘッダー
encoding → エンコード情報(UTF-8とか)
content → スクレイピングしてきたhtmlの内容(これが本体)

일단 정보를 빼낼 수 있었으므로, 이번은 beautifulsoup4를 인스톨.
$ pip3 install beautifulsoup4
Collecting beautifulsoup4
  Downloading https://files.pythonhosted.org/packages/21/0a/47fdf541c97fd9b6a610cb5fd518175308a7cc60569962e776ac52420387/beautifulsoup4-4.6.3-py3-none-any.whl (90kB)
    100% |████████████████████████████████| 92kB 1.8MB/s
Installing collected packages: beautifulsoup4
Successfully installed beautifulsoup4-4.6.3

beautifulsoup이란, requests등에서 취해 온 스크레이핑 데이터를 실제로 해석하는 툴입니다. 이른바 파서라고 불리는 것이군요.
스크레이핑 해 온 원시 데이터는, 이것으로 성형하지 않으면 사용물이 되지 않습니다. (아마. 얕은 지식으로 꽤 말하고 있습니다만 실수가 있으면 지적 부탁합니다...)

무기가 갖추어졌으므로, 우선 「Yahoo! 뉴스」의 「토픽(주요)」의 타이틀 일람을 취득해 보겠습니다.import 로 2종의 신기를 지정, 어느 정도 쓴다.

scrapingSyllabus.py
import requests
from bs4 import BeautifulSoup

html = requests.get('https://news.yahoo.co.jp')

yahoo = BeautifulSoup(html.content, "html.parser")

print(yahoo.select("p.ttl"))

일단 실행.
$ python scrapingSyllabus.py
[<p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6296719" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6296719'">被災地 子どもに心のケアを<span class="icVideo">映像</span></a></p>, <p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6296731" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6296731'">路上に箱状の不審物 福岡<span class="icPhoto">写真</span><span class="icNew">new</span></a></p>, <p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6296734" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6296734'">新AppleWatch 心電図を計測<span class="icPhoto">写真</span><span class="icNew">new</span></a></p>, <p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6296729" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6296729'">中部空港 関空被災で混雑続く<span class="icPhoto">写真</span></a></p>, <p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6296727" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6296727'">硫黄島で海底噴火 被害なし<span class="icPhoto">写真</span></a></p>, <p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6296732" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6296732'">滝沢秀明 年内で芸能活動引退<span class="icPhoto">写真</span><span class="icNew">new</span></a></p>, <p class="ttl"><a href="https://news.yahoo.co.jp/pickup/6296733" onmousedown="this.href='https://news.yahoo.co.jp/pickup/6296733'">今井翼が退所 病気治療に専念<span class="icPhoto">写真</span><span class="icNew">new</span></a></p>]

정말 나왔다.
타이틀만 추출하고 싶기 때문에 for문을 이용하여 타이틀을 하나씩 표시시킨다.
(결과는 목록 형식으로 추출되었으므로 for 문으로 돌릴 수 있습니다.)

scrapingSyllabus.py
import requests
from bs4 import BeautifulSoup

html = requests.get('https://news.yahoo.co.jp')

yahoo = BeautifulSoup(html.content, "html.parser")

for title in yahoo.select("p.ttl"):
    print(title.getText())

실행해보십시오.
$ python scrapingSyllabus.py
被災地 子どもに心のケアを映像
路上に箱状の不審物 福岡写真new
新AppleWatch 心電図を計測写真new
中部空港 関空被災で混雑続く写真
硫黄島で海底噴火 被害なし写真
滝沢秀明 年内で芸能活動引退写真new
今井翼が退所 病気治療に専念写真new

나왔다.

아래가 취득원의 「Yahho! News」



일치합니다.

일단 이것으로 스크래핑의 기초는 완료.

이것으로 하고 싶은 일이 있었습니다만, 별건으로 바빠서 일단 지금까지...
(파일의 이름이 scrapingSyllabus.py 그 이유는 대학의 강의를 스크래핑하고 싶었기 때문이었습니다)

거의 튜토리얼의 내용이었습니다. (이것 투고하는 의미 있는 것인가...?)

「사무라이 엔지니어 학원」씨 알기 쉬운 해설을 고맙습니다!

좋은 웹페이지 즐겨찾기