xpath解析器を用いて豆弁映画top 250を這い出す

16936 ワード

まず使用するライブラリを宣言します.もちろんosライブラリも使用して、作業パスを指定したパスに変更しました.os.chdir(r"C:\Users…")
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つ、噴き出さないでください.