xpath解析器を用いて豆弁映画top 250を這い出す
16936 ワード
まず使用するライブラリを宣言します.もちろんosライブラリも使用して、作業パスを指定したパスに変更しました.os.chdir(r"C:\Users…")
豆弁top 250は全部で10ページあり、1ページあたり25本の映画があり、1ページあたりのurlは規則的で、1ページ目のurlは「https://movie.douban.com/top250」、2ページ目のurlは「https://movie.douban.com/top250?start=25&filter=つまりstartパラメータはページ番号とともに変化し、トップページはstart=0であり、まずget_を実現するPage()メソッドとパラメータurlの転送
このように実行するとトップページのソースコードが得られ,次にページを解析し,情報を抽出する.Xpathを使用して、対応する情報の抽出を行います.
これにより、映画の名前、採点、ランキング、映画評論などの内容が抽出された.辞書として割り当てられ、データ化構造を形成します.その後、抽出した結果をファイルに書き込みます.辞書形式ではtxtを直接書き込むことができないので、JSONライブラリのdumps()メソッドを使用します.
次はウェブサイトを構築して、豆弁top 250は全部で10ページあって、1ページあたり25本の映画、1ページあたりのurlはすべて規則的で、1ページ目のurlは"https://movie.douban.com/top250」、2ページ目のurlは「https://movie.douban.com/top250?start=25&filter=」つまりstartパラメータはページ番号とともに変化し、トップページはstart=0です.
すべてのコードは次のとおりです.
現在、ある映画に映画評論がなければ、映画評論が錯乱する現象が発生し、リストの長さが一致しないことが問題となっている.個人のブログ、白い1つ、噴き出さないでください.
from lxml import etree
import requests
import time
import json
豆弁top 250は全部で10ページあり、1ページあたり25本の映画があり、1ページあたりのurlは規則的で、1ページ目のurlは「https://movie.douban.com/top250」、2ページ目のurlは「https://movie.douban.com/top250?start=25&filter=つまりstartパラメータはページ番号とともに変化し、トップページはstart=0であり、まずget_を実現するPage()メソッドとパラメータurlの転送
def get_page(url):
headers={"User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'}
# F12
response=requests.get(url,headers=headers)
response.encoding=response.apparent_encoding
# , response.apparent_encoding 。
return response.text
このように実行するとトップページのソースコードが得られ,次にページを解析し,情報を抽出する.Xpathを使用して、対応する情報の抽出を行います.
def get_message(text)
""":parse text
xpath , , """
html=etree.xpath(text)
rank=html.xpath('//div[@class="pic"]/em/text()')
name=html.xpath('//div[@class="hd"]/a/span[1]/text()')
score=html.xpath('//div[@class="star"]/span[contains(@class,"rating_num")]/text()')
words=html.xpath('//p[@class="quote"]/span/text()')
for items in range(len(rank)):
yield {"rank":rank[items],"name":name[items],
"score":score[items],"words":words[items]}
これにより、映画の名前、採点、ランキング、映画評論などの内容が抽出された.辞書として割り当てられ、データ化構造を形成します.その後、抽出した結果をファイルに書き込みます.辞書形式ではtxtを直接書き込むことができないので、JSONライブラリのdumps()メソッドを使用します.
def write_file(content):
with open("result.txt","a",encoding="gb18030") as f:
f.write(json.dumps(content,ensure_ascii=False)+'
')
次はウェブサイトを構築して、豆弁top 250は全部で10ページあって、1ページあたり25本の映画、1ページあたりのurlはすべて規則的で、1ページ目のurlは"https://movie.douban.com/top250」、2ページ目のurlは「https://movie.douban.com/top250?start=25&filter=」つまりstartパラメータはページ番号とともに変化し、トップページはstart=0です.
def change_url(start):
url="https://movie.douban.com/top250?start="+str(start)+"&filter="
return url
def main(start):
url=change_url(start)
text=get_page(url)
for i in get_message(text):
print(i)
write_file(i)
if __name__=="__main__":
for i in range(10):
start=25*10
main(start)
time.sleep(3) # , ,
すべてのコードは次のとおりです.
from lxml import etree
import requests
import time
import json
def get_page(url):
headers={"User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'}
response=requests.get(url,headers=headers)
response.encoding=response.apparent_encoding
return response.text
def get_message(text):
html=etree.xpath(text)
rank=html.xpath('//div[@class="pic"]/em/text()')
name=html.xpath('//div[@class="hd"]/a/span[1]/text()')
score=html.xpath('//div[@class="star"]/span[contains(@class,"rating_num")]/text()')
words=html.xpath('//p[@class="quote"]/span/text()')
for items in range(len(rank)):
yield {"rank":rank[items],"name":name[items],"score":score[items],"words":words[items]}
def write_file(content):
with open("result.txt","a",encoding="gb18030") as f:
f.write(json.dumps(content,ensure_ascii=False)+'
')
def change_url(start):
url="https://movie.douban.com/top250?start="+str(start)+"&filter="
return url
def main(start):
url=change_url(start)
text=get_page(url)
for i in get_message(text):
print(i)
write_file(i)
if __name__=="__main__":
for i in range(10):
start=25*10
main(start)
time.sleep(3) # , ,
現在、ある映画に映画評論がなければ、映画評論が錯乱する現象が発生し、リストの長さが一致しないことが問題となっている.個人のブログ、白い1つ、噴き出さないでください.