Scrapy 小技巧(一):使用 scrapy 自带的函数(follow & follow_all)优雅的生成下一个请求
前言
如何优雅的获取同一个网站上下一次爬取的链接并放到生成一个 Scrapy Response 呢?
样例
1 | from urllib import parse |
方式一:使用 urllib 库来拼接 URL
这个方式是通过 urllib
库来对下一个 url 进行补全成完整的 url,再使用 scrapy.Request
的方式进行下一个页面的爬取。
优点
- 在处理每一个 href 的时候可以添加一些自定义的内容(例如记录一下当前第几页了等等)
缺点
- 需要引入其他的库
1 | def parse(self, response): |
方式二:使用 response 自带的 urljoin
这个方式是通过 Scrapy response 自带的 urljoin
对下一个 url 进行补全成完整的 url,再使用 scrapy.Request
的方式进行下一个页面的爬取。(和方式一基本相同)
优点
- 不再需要在 spider 文件中引入多的第三方库。
1 | def parse(self, response): |
方式三:使用 response 自带的 follow
这个方式是通过 Scrapy response 自带的 follow
进行下一个页面的爬取。
优点
- 不再需要在 spider 文件中引入多的第三方库。
- 不需要写
extract()
来提取 href 字符串,只需要传入 href 这个Selector
(可选) - 不需要写 url 拼接
xpath
只需要编写到a
标签即可,可以省略掉@href
,即不需要获取 href 的Selector
,直接传递 a 的Selector
(可选)
1 | def parse(self, response): |
变种一
- 不写
extract()
来提取 href 字符串,传入 href 这个Selector
1 | def parse(self, response): |
变种二
- 不写
extract()
来提取 href 字符串,传入 href 这个Selector
xpath
不写@href
,直接传递 a 的Selector
1 | def parse(self, response): |
方式四:使用 response 自带的 follow_all
这个方式是通过 Scrapy response 自带的 follow_all
进行下一个页面的爬取。
优点
- 不再需要在 spider 文件中引入多的第三方库。
- 不需要写
extract()
来提取 href 字符串,只需要传入 href 这个 selector(可选) - 不需要写 url 拼接
- 只需要编写到
a
标签即可,可以省略掉@href
,即不需要获取 href 的SelectorList
,直接传递 a 的SelectorList
(可选) - 不需要编写遍历,直接把抓到的 url 的
SelectorList
放入即可
缺点
- 如果中间还有什么逻辑,就不太适用了(例如记录一下当前第几页了等等)
1 | def parse(self, response): |
变种
注:前方高能
一行代码搞定。
1 | def parse(self, response): |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Sitoi!
评论