Python

크롤링(Crawl) 2편

크레이지제이 2019. 10. 27. 11:32
반응형
crawl2_webdriver

Crawling 2 WebDriver

브라우저로 볼때는 분명 데이터가 있는데, 크롤링으로 HTML을 가져와서 보면 없는 경우가 있다.
이것은 브라우저에는 JS를 구동기능이 포함되어 HTML 문서가 동적으로 변화하기 때문에 단순하게 네트웍으로 HTML 문서를 받은 것과 항상 일치한다는 보장이 없기 때문이다
따라서 브라우저처럼 작동하여 변화된 HTML을 만들면 원하는 정보를 얻을 수 있는데 이것이 web driver이다.

구글 크롬 브라우저의 경우 이러한 것을 제공한다.
파이썬에서는 selenium 패키지를 설치하고, 운영체제에는 ChromeDriver를 설치해야 한다.
중요한 것은 현재 크롬브라우저의 버전과 ChromeDriver의 버전이 일치해야 한다!!!
버전이 다르다면 작동하지 않을 것이다.

https://sites.google.com/a/chromium.org/chromedriver/downloads
image

여기에서 자신의 크롬브라우저와 같은 버전의 드라이버를 받는다. 드라이버는 실행파일인데, PATH에 연결된 경로에 실행파일을 복사하면 준비가 다 된것이다.

전에 실패한 실시간 기사 조회

전에 코드에서 html 을 urllib으로 가져오지 말고 web driver를 구동하여 가져와서 파싱해 보자.

from selenium import webdriver
from bs4 import BeautifulSoup

url = 'https://m.media.daum.net/m/media/economic'

options = webdriver.ChromeOptions()
options.add_argument('headless')
browser = webdriver.Chrome(chrome_options=options)
browser.implicitly_wait(3)

browser.get(url)
html = browser.page_source
soup = BeautifulSoup(html, 'html.parser')

subnews = soup.find("div", "section_sub")
realnews = subnews.find("div", "box_realtime")
print(realnews)

browser.quit()


output

<div class="box_g box_realtime">
<h3 class="tit_g">실시간 주요 경제 뉴스</h3>
<ul category="economic" class="list_thumb">
<li>
<a class="link_news #MAIN_NEWS#article @1" href="http://v.media.daum.net/v/20191023201603468?f=m">
<div class="wrap_thumb">
<img alt="삼성물산 '1조6천억 분식회계' 적발..수천억 손실이 순익 둔갑" class="thumb_g" height="68" src="//t1.daumcdn.net/thumb/F240x180ht.u/?fname=https%3A%2F%2Ft1.daumcdn.net%2Fnews%2F201910%2F23%2Fhani%2F20191023201603606uvoz.jpg"/>
</div>
<div class="cont_thumb">
<strong class="tit_thumb">
<span class="txt_g">삼성물산 '1조6천억 분식회계' 적발..수천억 손실이 순익 둔갑</span>
<span class="txt_cp">5분전</span>
</strong>
</div>
</a>
</li>
<li>
<a class="link_news #MAIN_NEWS#article @2" href="http://v.media.daum.net/v/20191023191757086?f=m">
<div class="wrap_thumb">
<img alt='野, 기재부에 "민부론 검토자료 내놔라"..與 "제출 의무 없어"' class="thumb_g" height="68" src="//t1.daumcdn.net/thumb/F240x180ht.u/?fname=https%3A%2F%2Ft1.daumcdn.net%2Fnews%2F201910%2F23%2Fnewsis%2F20191023191757773esif.jpg"/>
</div>
<div class="cont_thumb">
<strong class="tit_thumb">
<span class="txt_g">野, 기재부에 "민부론 검토자료 내놔라"..與 "제출 의무 없어"</span>
<span class="txt_cp">1시간전</span>

전에는 ul 태그 내부가 비었었는데 이제 내용을 가져올 수 있게 되었다.
코드를 정리하여 기사 제목만 가져와보자. 이것도 좀 더 쉽게 하려면 F12키로 개발자모드로 간 다음 추출할 부분에 대해 selector 값을 쉽게 가져올 수 있다.
image
selector를 적당히 수정하면 목록을 쉽게 추출할 수있다.

# news = soup.select('#kakaoContent > div.section_sub > div.box_g.box_realtime > ul > li:nth-child(1) > a > div.cont_thumb > strong > span.txt_g')
news = soup.select('#kakaoContent > div.section_sub > div.box_g.box_realtime > ul > li > a > div.cont_thumb > strong > span.txt_g')
for item in news:
    print(item.text)

output

삼성물산 '1조6천억 분식회계' 적발..수천억 손실이 순익 둔갑
野, 기재부에 "민부론 검토자료 내놔라"..與 "제출 의무 없어"
은행권 "예대율 낮춰라".. 예금 확보 비상
경기 하강기 커지는 재정 역할.."세계 주요국도 확장 정책"
文 시정 연설 두고 '소득주도성장 실패' 공방 벌인 여야(종합)
한진그룹 총수일가, GS홈쇼핑에 지분 팔아 상속세 마련?
홍남기 "법인세 인하 투자증가로 연결 안 돼..신중한 입장"
김영진, 기재위 국감서 '황교안 계엄령 개입' 의혹 언급..野 반발
[단독]에어부산, 괌에서 '기체결함'으로 긴급 회항..13시간 지연 출항
[단독]정부 '직무급 도입-임금체계 개편' 병합 논의

전에 단순한 방식으로 안되는 작업이 이제 원하는 부분을 깔끔하게 추출하였다.

추가로…

아래는 만약 같은 페이지내에서 뭔가를 클릭해야 내용이 더 보여서 그 내용도 추출하기 위한 작업이다.

다음 실시간 검색어 조회

모바일용 웹 주소를 이용하였다. 일반 PC용 주소로 사용하면 데이터가 많아서 느릴 수 있으니 텍스트 위주의 페이지로 접근하는 것이 더 용이하다.
중간에 보면 실시간 검색어 목록이 다 나오도록 확장 버튼을 클릭하는 것을 추가하였다.

from selenium import webdriver
from bs4 import BeautifulSoup

def getTop10Daum():
    url = "https://m.daum.net"

    # browser = webdriver.PhantomJS()
    # browser.implicitly_wait(3)

    options = webdriver.ChromeOptions()
    options.add_argument('headless')
    # browser = webdriver.Chrome(options=options)
    # browser = webdriver.Chrome()
    browser = webdriver.Chrome(chrome_options=options)
    browser.implicitly_wait(3)

    browser.get(url)
    browser.save_screenshot("web1.png")

    # mAside > div.head_issue > div.roll_issue.\#searchrank\#rolling > strong > a

    # browser.find_element_by_xpath('//*[@id="mAside"]/div[1]/div[1]/strong/a').click()
    browser.find_element_by_css_selector('div.roll_issue.\#searchrank\#rolling > strong > a').click()
    browser.save_screenshot("web2.png")

    html = browser.page_source
    soup = BeautifulSoup(html, 'html.parser')
    # print(soup)
    notices = soup.select('div.realtime_layer div.panel')

    resultlist = []

    for n in notices:
        # print ('aria-hidden-', n['aria-hidden'])
        if n['aria-hidden']=='false':
            lis = n.select('li')
            for l in lis:
                result = dict()
                result['rank'] = l.select_one('.num_issue').text
                result['title']= l.select_one('.txt_issue').text
                result['url'] = l.a['href']
                # print(l.select_one('.num_issue').text)
                # print(l.select_one('.txt_issue').text)
                # print('href=',l.a['href'])
                resultlist.append(result)
    browser.quit()

    # print(resultlist)
    return resultlist


if __name__ == '__main__':
    items = getTop10Daum()
    for it in items:
        print(it['rank'], it['title'], it['url'])

output

1 서효림 https://m.search.daum.net/search?w=tot&q=%EC%84%9C%ED%9A%A8%EB%A6%BC&DA=ATG&nil_mtopsearch=issuekwd&logical=issue&pin=issue
2 이다희 https://m.search.daum.net/search?w=tot&q=%EC%9D%B4%EB%8B%A4%ED%9D%AC&DA=ATG&nil_mtopsearch=issuekwd&logical=issue&pin=issue
3 김칠준 변호사 https://m.search.daum.net/search?w=tot&q=%EA%B9%80%EC%B9%A0%EC%A4%80+%EB%B3%80%ED%98%B8%EC%82%AC&DA=ATG&nil_mtopsearch=issuekwd&logical=issue&pin=issue
4 정경심 교수 https://m.search.daum.net/search?w=tot&q=%EC%A0%95%EA%B2%BD%EC%8B%AC+%EA%B5%90%EC%88%98&DA=ATG&nil_mtopsearch=issuekwd&logical=issue&pin=issue
5 송성문 https://m.search.daum.net/search?w=tot&q=%EC%86%A1%EC%84%B1%EB%AC%B8&DA=ATG&nil_mtopsearch=issuekwd&logical=issue&pin=issue
6 김준기 https://m.search.daum.net/search?w=tot&q=%EA%B9%80%EC%A4%80%EA%B8%B0&DA=ATG&nil_mtopsearch=issuekwd&logical=issue&pin=issue
7 오재일 https://m.search.daum.net/search?w=tot&q=%EC%98%A4%EC%9E%AC%EC%9D%BC&DA=ATG&nil_mtopsearch=issuekwd&logical=issue&pin=issue
8 김수미 아들 https://m.search.daum.net/search?w=tot&q=%EA%B9%80%EC%88%98%EB%AF%B8+%EC%95%84%EB%93%A4&DA=ATG&nil_mtopsearch=issuekwd&logical=issue&pin=issue
9 인헌고등학교 https://m.search.daum.net/search?w=tot&q=%EC%9D%B8%ED%97%8C%EA%B3%A0%EB%93%B1%ED%95%99%EA%B5%90&DA=ATG&nil_mtopsearch=issuekwd&logical=issue&pin=issue
10 이승호 https://m.search.daum.net/search?w=tot&q=%EC%9D%B4%EC%8A%B9%ED%98%B8&DA=ATG&nil_mtopsearch=issuekwd&logical=issue&pin=issue

Author: crazyj7@gmail.com