Python3+BeautifulSoup+Selenium으로 스크래핑

소개



하고 싶은 것은 단지 스크래핑 하는 것뿐.
단지, 아무래도 대상 Web 페이지가 JavaScript로 쓰여져 있는 탓인지 보통으로는 할 수 없었으므로 망비록으로서 이하를.
덧붙여 이번 스크레이핑 한 것은 「이 멋진 세계에 축복을!(소설가가 되자)」의 생선입니다.

환경·모듈 모듈 등


  • Windows10/Python3.6
  • codecs : 인코딩을 utf-8로 지정하여 파일을 여는
  • BeautifulSoup : 스크래핑 용
  • requests : URL에서 소스 코드를 가져 오는 용
  • htmltopdf : HTML에서 PDF로 변환 (필요 wkhtmltopdf 설치 및 PATH 통해)
  • selenium : DOM 조작용

  • 구현



    소설 부분 스크래핑



    시험에, 제일부・프롤로그 의 긁는을 바.

    scraping.py
    # -*- coding: utf-8 -*-
    from selenium import webdriver
    import lxml.html
    
    def getWithinThoseTargets(contents,target1,target2):
        # contents内のtarget1 ~ target2の間のテキストを取ってくる
        return contents[contents.find(target1):contents.find(target2)]
    
    def getContents(contents):
        # 大体のコンテンツを確保
        after = '<div class="novel_bar">'
        before = "<!--novel_color-->"
        return getWithinThoseTargets(contents,after,before)
    
    def delateDust(contents):
        # 改行削除
        contents = contents.replace('\n','')
        # 空白削除(半角/全角)
        contents = contents.replace(' ', '')
        contents = contents.replace(' ', '')
        # <br>を</p><p>に置き換えると、全ての行が<p></p>で囲むことができる
        contents = contents.replace('<br>','</p><p>')
        # 元々が空白改行の場合、<p></p>となるはずなのでそこは<br>に書き換え
        contents = contents.replace('<p></p>','<br>')
        # ヘッダ・フッタに現れるゴミを削除
        contents = contents.replace('lr-tb;">','')
        contents = contents.replace('</div>','')
        contents = contents.replace('</div','')
        return contents
    
    # 小説をhtml化して返す
    def getMaterial(contents):
        after = 'lr-tb;">'
        before = '<div class="novel_a">'
        return delateDust(getWithinThoseTargets(contents,after,before))
    
    def getTitle(contents):
        target1 = '<div class="chapter_title">'
        target2 = '<div class="novel_view" id="novel_view"'
        # temp = <div class="chapter_title">●部</div>●話</div>の形
        temp = getWithinThoseTargets(contents,target1,target2)
        # titleは必ず●部の形
        title = getWithinThoseTargets(temp,'">',"</div>")[2:]
        subtitle = getWithinThoseTargets(temp,title+"</div>","</div>\n")[8:]
        return title,subtitle
    
    # [部数:話数:中身]のリストを返す
    def getBookInThisPage(url):
        # PhantomJSを用いて、Jvascriptを走らせる
        driver = webdriver.PhantomJS()
        # urlにアクセスする
        driver.get(url)
        # 魚拓のみ~という要素を探して、クリックする
        driver.find_element_by_link_text("魚拓のみの表示はこちら。").click()
        # クリックした先のページのソースコードをtextに保存
        text = getContents(driver.page_source)
        # 何部の何話なのか
        title, subtitle = getTitle(text)
        # 小説部分
        material = getMaterial(text)
        # まとめてリストを返す
        return [title,subtitle,material]
    
    def debug():
        # プロローグをスクレイピング
        print(getBookInThisPage('http://megalodon.jp/2013-1210-2341-05/ncode.syosetu.com/n7145bl/1/'))
    
    debug()
    
    

    아무래도, 건의 어택 사이트에서는 컨텐츠를 iframe과 JavaScript로 표시하고 있는 것 같아(?) 이하의 스크래핑과 같이 하면 안 되었습니다(잘하는 방법 있으면 가르쳐 주었으면 합니다……)

    실행 결과는 다음
    ['一部', 'プロローグ', 'どうも、俺は...</p><br><p>...]
    

    스크래핑



    이쪽(NAVER 정리) 에 소설의 URL이 정리되어 있으므로, 우선은 이쪽으로부터 소설의 URL을 취득합니다. (아래의 빨간색 프레임 부분)


    대상 URL의 소스 코드를 살펴보면
    <a href=URL target="_blank" class="mdMTMWidget01ItemUrl01Link">URL</a>
    

    라고 하는 형태였으므로, 이쪽의 class명 「mdMTMWidget01ItemUrl01Link」로 검색을 걸기로
    구현은 다음

    urls.py
    # -*- coding: utf-8 -*-
    import requests
    from bs4 import BeautifulSoup
    
    url = "https://matome.naver.jp/odai/2145805473376866201"
    res = requests.get(url)
    soup = BeautifulSoup(res.content,'html.parser')
    records = soup.find_all("a", class_ = "mdMTMWidget01ItemUrl01Link")
    
    for record in records:
        print(record.text)
    

    실행 결과:
    http://megalodon.jp/2013-1210-2341-05/ncode.syosetu.com/n7145bl/1/
    http://megalodon.jp/2013-1210-2341-17/ncode.syosetu.com/n7145bl/2/
    http://megalodon.jp/2013-1210-2341-26/ncode.syosetu.com/n7145bl/3/
    ......
    

    남은



    urls.py에서 얻은 URL 각각에 scraping.py를 적응시켜 나가면 k

    감상



    스크래핑은 첫 경험이었지만 놀랍고 재미있었습니다.
    HTML/CSS화해 PDF화하는 부분은 또 다른 기회에도(잊지 않는 한

    GitHub



    htps : // 기주 b. 코 m / 류사 / u b-Sc Rapin g-Py ton

    좋은 웹페이지 즐겨찾기