Scrapy爬取豆瓣读书全站

分析网页

首先打开豆瓣读书中的分类浏览,可以看到其中有很多的分类

分类
分类

豆瓣应该是一个比较好爬的网站,所有的数据都不是ajax加载的,我们打开谷歌的F12或者是火狐的FireBug可以很轻松的找到每一个分类的链接

url所在地
url所在地

这里我们使用scrapy中的一个linkextractors库,这个库的作用是会根据提供的限制,自动爬取和深入每一个页面并且提取需要的链接,如果想要找到每一个分类的url,只需Rule(LinkExtractor(allow='/tag/',restrict_xpaths="//div[@class='article']"),follow=True),这里的allow是一个正则表达式,用来筛选分类url,restrict_xpaths是限制在哪个结构中筛选url,这里限制的是在<div class='article'>这个盒模型中,follow表示是否深入,这里当然是要深入,这里就能得到每一个分类url了,自己可以在回调函数中测试下,输入所得的url,可以使用respose.url

得到所有的分类url,就可以继续深入到每一步作品所在的页面了,如下图!

作品网页
作品网页

但是我们需要不止是这一页,我们要爬的时全站,因此这里必须实现翻页,我们可以看到页面底部清楚的写着下一页,我们通过解析页面同样可以得到url,如下图所示

翻页url
翻页url

可以看到所有的url的规则,我们就可以用正则表达式限制,以获取我们的需要,我们可以写出翻页的代码

Rule(LinkExtractor(allow="\?start=\d+\&type=",restrict_xpaths="//div[@class='pa>ginator']"),follow=True),

最后一步就是打开每一部书的网页得到所需的信息了,我们就可以通过这里通过解析网页还是可以很清楚的知道url,这里就不再详细的说怎么解析了,这里可以看到所有的url都在li标签中,如下图

url
url

我们打开li标签可以很清楚的看大url的规律,因此这里还是用到上面说的库解析深入,连同上面的代码如下

Rule(LinkExtractor(allow='/tag/',restrict_xpaths="/ /div[@class='article']"),follow=True),#第一步
Rule(LinkExtractor(allow="\?start=\d+\&type=",restrict_xpaths="//div[@class='pa>ginator']"),follow=True),  #第二步翻翻页
Rule(LinkExtractor(allow="/subject/\d+/$",restrict_>xpaths="//ul[@class='subject-list']"),callback='parse_item')#得到所需网页的url

到了这里总算是大功告成了,下面就需要解析自己的所需要的信息了,这里附上网页

图片
图片

下面就是写自己解析代码了,这里就不需要详细的说了,详细内容请看源码,值得注意的是爬取的网页速度不要太快,豆瓣会禁IP的,这里可以采用一些反爬虫措施,如请求头的更换,ip地址的更换,下一篇会详细解说。

参考文档:

scrapy中文文档

最后附上本人的github地址,不要忘了给个star哦

本人博客地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,633评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,222评论 4 61
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,468评论 19 139
  • 为什么好多人都要从我的全世界路过 一开始就不该这样的 我好讨厌我自己 未曾见面的人怎么可以这样喜欢的无法自拔 以为...
    xxEffy阅读 2,701评论 0 0
  • 病症:Cell 里面的ImageView 图片是有的,可是就是显示不出来,只有上下滑动才可以显示。 病因:后来发现...
    IOS_Wek阅读 6,885评论 2 3