Python3+BeautifulSoup+Selenium으로 스크래핑
13499 단어 PhantomJSPython3셀레늄스크래핑BeautifulSoup
소개
하고 싶은 것은 단지 스크래핑 하는 것뿐.
단지, 아무래도 대상 Web 페이지가 JavaScript로 쓰여져 있는 탓인지 보통으로는 할 수 없었으므로 망비록으로서 이하를.
덧붙여 이번 스크레이핑 한 것은 「이 멋진 세계에 축복을!(소설가가 되자)」의 생선입니다.
환경·모듈 모듈 등
구현
소설 부분 스크래핑
시험에, 제일부・프롤로그 의 긁는을 바.
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
Reference
이 문제에 관하여(Python3+BeautifulSoup+Selenium으로 스크래핑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/RyuSA/items/ce9b5edfa37de985a375
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# -*- 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()
['一部', 'プロローグ', 'どうも、俺は...</p><br><p>...]
<a href=URL target="_blank" class="mdMTMWidget01ItemUrl01Link">URL</a>
# -*- 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/
......
스크래핑은 첫 경험이었지만 놀랍고 재미있었습니다.
HTML/CSS화해 PDF화하는 부분은 또 다른 기회에도(잊지 않는 한
GitHub
htps : // 기주 b. 코 m / 류사 / u b-Sc Rapin g-Py ton
Reference
이 문제에 관하여(Python3+BeautifulSoup+Selenium으로 스크래핑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/RyuSA/items/ce9b5edfa37de985a375텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)