(附源码)Python爬虫之豆瓣攻坚战

本文转载于“和你学Python”,关注公众号后回复“douban”即可获取源码

我:好无聊鸭~有没有好电影推荐一下鸭?

惨绿青年:你不是会制作python爬虫了吗?自己去豆瓣top250爬一下呗。

我:诶,居然还有这样的网站,让我赶紧去瞧瞧。

于是Paradoxical就打开了豆瓣top250的网址https://movie.douban.com/top250,然后就开始制作爬虫了。按照之前小哥哥教的步骤,先获取页面,再提取数据,然后保存下来。

诶(#°Д°)……这个418是啥东东鸭???

惨绿青年:大概是触发了反爬虫机制,这是程序猿和你开的小玩笑。先在get()里加个headers参数试试吧。

我:headers参数是啥鸭???

惨绿青年:打开浏览器,按F12查看网络请求,刷新一下页面,然后在Network里随便点击一个请求看一下Request Headers。创建一个headers字典,把Request Headers里面的User-Agent和值放进字典。最后把headers字典放到get()里面就行了。这个User-Agent表示发出请求的设备。

按照小哥哥的指示来做
成功了!


接下来就是获取电影的数据了,Paradoxical观察了页面,决定获取电影的名字、评分和简介。然后观察页面的html代码,词条信息部分在

里,电影名在第一个里,评分在里,简介在里。接下来开始写代码吧~

这次使用css选择器去提取数据。虽然不太熟悉,花的时间比较多,但还是不难的嘛¯ω¯

获取了一部电影怎么够呢,去获取一页数据吧~

我真聪明¯ω¯


然后就是获取所有页面的数据了,冲鸭~

翻到第二页发现页面链接后面多了个“?star=25&filter=”字符串,再翻回第一页页面链接后面多了个“?star=0&filter=”字符串,看来中间的数字就是关键了。数了一下一页刚好有25部电影,我真是个小机灵鬼鸭~

可以看到红框部分是重复的


嗯?怎么回事?怎么每一页的数据都是一样的?(#°Д°)在浏览器输入格式化后的url也是一样……在多次尝试后只能去请教惨绿青年小哥哥了。

惨绿青年:对于你说的问题,我也去验证了一下,确实通过url直接访问只能得到第一页的数据。我现在没什么时间去研究,教你一个粗暴的方法吧,挺适合用于这种数据比较少的情况。

我:是什么鸭?

惨绿青年:Python有一个叫做selenium的库,这个库是用来自动化测试的。因为这个库可以通过代码模拟人操作浏览器并且能获取html代码,所以也能用来做爬虫。但是这个要操作浏览器的话就会消耗一些电脑资源(内存、cpu),所以不会优先考虑。

惨绿青年:你先去装这个库吧,跟以前一样在命令行输入“pip install selenium”就行。

惨绿青年:安装完成后,还要去下载一个驱动器,Python代码就是通过驱动器去控制浏览器的。selenium支持市面上大多数主流浏览器,要根据浏览器和对应的版本去下载。我记得你安装了谷歌浏览器吧?打开这个网址http://chromedriver.storage.googleapis.com/index.html,找到对应的版本然后点进去下载(谷歌浏览器可以在网址栏输入“chrome://version”或者点击右上角的省略号然后在弹出的菜单点击“设置”查看)。下载后解压到Python的安装路径里。其他浏览器可以在百度搜“浏览器名+driver”,下载方式是类似的。

在网址栏查看版本
在设置查看版本


寻找对应版本的driver
对应自己的系统下载
解压到python的安装路径


惨绿青年:selenium的使用也比较简单,如下图所示:

出现上面的画面就是成功启动了  
和requests一样用get()


惨绿青年:接下来教你一些常用的获取html标签的方法吧。find_element_by_id()是通过标签的id属性去获取标签,此外把id改为nameclass即可以通过对应的属性和属性值去获取。find_element_by_xpath()和find_element_by_css_selector()分别通过xpathcss选择器获取标签。

find_element_by_link_text(),find_element_by_partial_link_text()这个两个方法是专门用于标签的,第一个方法需要传入里的完整文字内容,第二个方法只需要传入里的部分文字内容。

惨绿青年:以上的方法都是返回第一个找到的标签,如果要找全部标签的话,可以在element后面加个s,例如find_element_by_css_selector()改为find_elements_by_css_selector()。对了,你可以把代码里的css选择器内容搬到find_element_by_css_selector(),就不用重新写了。

我:哇,好厉害鸭,我赶紧试试。

真的可以诶


我:emmm……那怎么换页鸭?我刚刚试过在网址栏输入网址但是只能获取第一页。

惨绿青年:这时候就可以使用click()方法了,当找到标签时使用该方法可以模拟人用鼠标点击这个标签,达到换页的目的。

我:嗯嗯,我这就去找换页的标签。

找到了
哈哈我真是个小机灵鬼

接下来就把代码优化一下,首先传入的是第一页的url,然后还剩9页,也就是说重复9次就行了。emmm……好像还有第一页要获取,那就加个判断好了。然后把数据加入一个字典,把字典存入一个列表,最后保存起来。

最终结果

刚学爬虫就遇到这么多坑,真是困难鸭~幸好没有放弃,最终还是成功了~

今天也学到了很多东西呢,明天有什么新知识呢?真期待鸭~如果喜欢文章可以关注我哦~

你可能感兴趣的:((附源码)Python爬虫之豆瓣攻坚战)