600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > python爬虫之通过xpath获取豆瓣最新上映电影的海报

python爬虫之通过xpath获取豆瓣最新上映电影的海报

时间:2019-10-22 21:06:40

相关推荐

python爬虫之通过xpath获取豆瓣最新上映电影的海报

0.目录

1.分析页面

2.初步代码

3.问题排解

4.下载代码

5.总结

1.分析页面

关于xpath网上有许多的教程了,关于xpath的介绍和语法都不在这里赘述,本篇主要讲解如何用xpath爬取豆瓣最新上映电影的海报,下载并且用电影名来命名文件,也就是我们主要获取海报的url和电影名。那些爬取电影详细资料和豆瓣TOP250也是大同小异的,而选择最新上映的电影是因为其中具有很强的代表性。

首先,进入豆瓣正在上映的页面,右键检查海报,发现我们需要的海报url和电影名都在这个标签下面,那就好办很多了。

2.初步代码:

# encoding: utf-8import requestsfrom lxml import etreefrom urllib import requestdef get_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36','Referer': '/',}response = requests.get(url, headers)return response.textdef get_img(url):text = get_page(url)html = etree.HTML(text)# 获取所有的<img>标签trs = html.xpath("//img")for tr in trs:# 获取<img>内的src和alt属性url_img = tr.xpath("@src")[0]name = tr.xpath("@alt")[0]print(url_img)print(name)print(len(trs))def main():url = '/cinema/nowplaying/guangzhou/'get_img(url)if __name__ == '__main__':main()

展示运行结果的一部分:

3.问题排解

海报的url和电影名能够正常输出,查看正在上映的列表的数量会发现其中只有37个,而这里有47个。拉倒页面最下会发现我们还获取了【即将上映】的电影名,所以我们需要在获取< img >标签前加上限制,比如可以加上只获取< div id=“nowplaying” >标签下的数据。

修改代码:

def get_img(url):text = get_page(url)html = etree.HTML(text)# 获取<div id="nowplaying">标签下的所有数据,而且xpath函数返回的是一个列表ul = html.xpath("//div[@id='nowplaying']")[0]# 获取<div id="nowplaying">标签下的子孙标签<img>trs = ul.xpath(".//img")for tr in trs:# 获取<img>内的src和alt属性url_img = tr.xpath("@src")[0]name = tr.xpath("@alt")[0]print(url_img)print(name)print(num)

展示运行结果的一部分:

4.下载代码

可以发现已经获取到了我们想要的数据,那么下一步就是根据url下载海报,并且用电影名来命名文件。在下载之前,还需要在该程序的所在目录建一个名为:images 的文件夹。

request.urlretrieve(url_img, 'images/' + name + '.jpg')

5.总结

在使用xpath爬取数据时,分析标签是其中最难的部分,整体写起来还是不难的。下一次还会讲解用BeautifulSoup和正则表达式来干相同的事,并且分析其中不同的地方。

如果你想获取评分,可以这样:

ul = html.xpath("//div[@id='nowplaying']")[0]trs = ul.xpath(".//li")for tr in trs:data_score =tr.xpath("@data-score")[0]

附录:完整代码

# encoding: utf-8import requestsfrom lxml import etreefrom urllib import requestdef get_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36','Referer': '/',}response = requests.get(url, headers)return response.textdef get_img(url):text = get_page(url)# 构造了一个XPath解析对象并对HTML文本进行自动修正html = etree.HTML(text)# 获取<div id="nowplaying">标签下的所有数据,而且xpath函数返回的是一个列表ul = html.xpath("//div[@id='nowplaying']")[0]# 获取<div id="nowplaying">标签下的子孙标签<img>trs = ul.xpath(".//img")fns_num = 1num = len(trs)for tr in trs:# 获取<img>内的src和alt属性url_img = tr.xpath("@src")[0]name = tr.xpath("@alt")[0]# 下载剧照request.urlretrieve(url_img, 'images/' + name + '.jpg')# 显示剧照下载的进度print("\r完成进度: {:.2f}%".format(fns_num * 100 / num), end="")fns_num += 1def main():url = '/cinema/nowplaying/guangzhou/'get_img(url)if __name__ == '__main__':main()

运行结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。