利用xpath解析器爬取豆瓣电影top250
首先声明需要用的库,当然我还用到了os库,将工作路径修改到了我指定的路径。os.chdir(r"C:Users…")
from lxml import etree import requests import time import json
豆瓣top250总共有10页,每页25部电影,每页的url都是有规律的,第一页的url是“https://movie.douban.com/top250”,第二页的url是“https://movie.douban.com/top250?start=25&filter=”也就是start参数会随着页码变化,首页就是start=0,我们首先实现get_page()方法并传入参数url
这样运行后就获得了首页的源代码了,接下来就是解析网页,提取信息。 我们使用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)+ )
接下来就是构建网址,豆瓣top250总共有10页,每页25部电影,每页的url都是有规律的,第一页的url是“https://movie.douban.com/top250”,第二页的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) #防止反爬虫,如果速度过快可能会无响应,设置延时等待
全部代码,如下:
目前发现问题就是如果某部电影没有影评就会出现影评错乱的现象导致列表长度无法匹配,求大神指教。个人博客,小白一个,勿喷。