Scrapy 小技巧(一):使用 scrapy 自带的函数(follow & follow_all)优雅的生成下一个请求
前言
如何优雅的获取同一个网站上下一次爬取的链接并放到生成一个 Scrapy Response 呢?
样例
from urllib import parse
import scrapy
class SitoiSpider(scrapy.Spider):
name = "sitoi"
start_urls = [
'https://sitoi.cn',
]
def parse(self, response):
href_list = response.xpath("//div[@class='card']/a/@href").extract()
for href in href_list:
url = parse.urljoin(response.url, href)
yield scrapy.Request(url=url, callback=self.parse_next)
def parse_next(self, response):
print(response.url)
方式一:使用 urllib 库来拼接 URL
这个方式是通过 urllib 库来对下一个 url 进行补全成完整的 url,再使用 scrapy.Request 的方式进行下一个页面的爬取。
优点
- 在处理每一个 href 的时候可以添加一些自定义的内容(例如记录一下当前第几页了等等)
缺点
- 需要引入其他的库
def parse(self, response):
href_list = response.xpath("//div[@class='card']/a/@href").extract()
for href in href_list:
url = parse.urljoin(response.url, href)
yield scrapy.Request(url=url, callback=self.parse_next)
方式二:使用 response 自带的 urljoin
这个方式是通过 Scrapy response 自带的 urljoin 对下一个 url 进行补全成完整的 url,再使用 scrapy.Request 的方式进行下一个页面的爬取。(和方式一基本相同)
优点
- 不再需要在 spider 文件中引入多的第三方库。
def parse(self, response):
href_list = response.xpath("//div[@class='card']/a/@href").extract()
for href in href_list:
url = response.urljoin(href)
yield scrapy.Request(url=url, callback=self.parse_next)
方式三:使用 response 自带的 follow
这个方式是通过 Scrapy response 自带的 follow 进行下一个页面的爬取。
优点
- 不再需要在 spider 文件中引入多的第三方库。
- 不需要写
extract()来提取 href 字符串,只需要传入 href 这个Selector(可选) - 不需要写 url 拼接
xpath只需要编写到a标签即可,可以省略掉@href,即不需要获取 href 的Selector,直接传递 a 的Selector(可选)
def parse(self, response):
href_list = response.xpath("//div[@class='card']/a/@href").extract()
for href in href_list:
yield response.follow(url=href, callback=self.parse_next)
变种一
- 不写
extract()来提取 href 字符串,传入 href 这个Selector
def parse(self, response):
href_list = response.xpath("//div[@class='card']/a/@href")
for href in href_list:
yield response.follow(url=href, callback=self.parse_next)
变种二
- 不写
extract()来提取 href 字符串,传入 href 这个Selector xpath不写@href,直接传递 a 的Selector
def parse(self, response):
href_list = response.xpath("//div[@class='card']/a/")
for href in href_list:
yield response.follow(url=href, callback=self.parse_next)
方式四:使用 response 自带的 follow_all
这个方式是通过 Scrapy response 自带的 follow_all 进行下一个页面的爬取。
优点
- 不再需要在 spider 文件中引入多的第三方库。
- 不需要写
extract()来提取 href 字符串,只需要传入 href 这个 selector(可选) - 不需要写 url 拼接
- 只需要编写到
a标签即可,可以省略掉@href,即不需要获取 href 的SelectorList,直接传递 a 的SelectorList(可选) - 不需要编写遍历,直接把抓到的 url 的
SelectorList放入即可
缺点
- 如果中间还有什么逻辑,就不太适用了(例如记录一下当前第几页了等等)
def parse(self, response):
href_list = response.xpath("//div[@class='card']/a")
yield from response.follow_all(urls=href_list, callback=self.parse_next)
变种
注:前方高能
一行代码搞定。
def parse(self, response):
yield from response.follow_all(xpath="//div[@class='card']/a", callback=self.parse_next)
欢迎访问我的个人博客:https://sitoi.cn
Scrapy 小技巧(一):使用 scrapy 自带的函数(follow & follow_all)优雅的生成下一个请求的更多相关文章
- 芝麻HTTP:Scrapy小技巧-MySQL存储
这两天上班接手,别人留下来的爬虫发现一个很好玩的 SQL脚本拼接. 只要你的Scrapy Field字段名字和 数据库字段的名字 一样.那么恭喜你你就可以拷贝这段SQL拼接脚本.进行MySQL入库处理 ...
- 芝麻HTTP: Scrapy小技巧-MySQL存储
这两天上班接手,别人留下来的爬虫发现一个很好玩的 SQL脚本拼接. 只要你的Scrapy Field字段名字和 数据库字段的名字 一样.那么恭喜你你就可以拷贝这段SQL拼接脚本.进行MySQL入库处理 ...
- Scrapy小技巧-MySQL存储, MYSQL拼接
这两天上班接手,别人留下来的爬虫发现一个很好玩的 SQL脚本拼接. 只要你的Scrapy Field字段名字和 数据库字段的名字 一样.那么恭喜你你就可以拷贝这段SQL拼接脚本.进行MySQL入库处理 ...
- 【小技巧】只用css实现带小三角的对话框样式
一个小小的技巧: 如图所示,这种小三角,不用图片,只用css怎么实现呢? 直接上代码吧: <!DOCTYPE html> <html> <head> <tit ...
- Extjs 项目中常用的小技巧,也许你用得着(5)--设置 Ext.data.Store 传参的请求方式
1.extjs 给怎么给panel设背景色 设置bodyStyle:'background:#ffc;padding:10px;', var resultsPanel = Ext.create('Ex ...
- 10个提升MySQL性能的小技巧
从工作量分析到索引的三条规则,这些专家见解肯定会让您的MySQL服务器尖叫. 在所有的关系数据库中,MySQL已经被证明了完全是一头野兽,只要通知停止运行就绝对不会让你多等一秒钟,使你的应用置于困境之 ...
- 模仿也是提高,纯css小技巧实现头部进度条
刚开始的时候我也觉得不可能,但是就是这么神奇,总有大神给你意想不到的惊喜. 快来感受一下把.(仔细看看头部黄色条的变化) 思考一下啊,怎么出现的那,其实作者使用了一点小技巧,那就是背景色渐变和遮挡产生 ...
- Python 中的一些小技巧
这里是本人收集的一些 Python 小技巧,目前主要是一些实用函数,适合有一定基础的童鞋观看(不会专门介绍使用到的标准库函数).. 一.函数式编程 函数式编程用来处理数据,感觉很方便.(要是再配上管道 ...
- 【js】中的小技巧
本文主要介绍一些JS中用到的小技巧 1. 类型强制转换 1.1 string强制转换为数字 可以用*1来转化为数字(实际上是调用.valueOf方法) 然后使用Number.isNaN来判断是否为 ...
随机推荐
- 我的linux学习日记day4
一.打包压缩与搜索命令 1.tar命令 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包里有哪些文件 -j 用bzip2来压缩或解压 -z 用gzip压缩或解压 -v 显示过程 -f 目标文件 ...
- 黑马程序员_毕向东_Java基础视频教程——类型转换(随笔)
类型转换 class Test{ public static void main(String[] args) { byte b = 3; // b = b + 2; /* Test.java:5: ...
- zsy后台管理系统-界面
自研平台:(java+vue+mysql+docker) 欢迎大家预览,指导! http://www.zsyai.top/dist 流程引擎 自定义定时任务: 一键生成前后端代码:
- Java子父类间静态代码块、非静态代码块、构造方法的执行顺序
子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A ...
- linux常用命令---域名服务
域名服务
- VueRouter小手册
目录 一. 了解router 二. 工作流程 三. 简单的Demo 四. 理解template和route的组合 五. Vue-Router-GoBack记录返回 六. Router-Link 七. ...
- 排序算法的总结——Java实现
前言 简单归纳一下最近学习的排序算法,如果有什么错误的地方还请大家指教. 本文介绍了七种经典排序算法,包括冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序以及堆排序,并且讨论了各种算法的进一 ...
- vscode环境配置(一)——C Program运行
ctrl + shift +p 打开应用商店 搜索 C/C++ 和 Code Runner(一键编译运行)
- Spring_api方式实现aop
第一步: public interface UserService { public void add(); public void update(int a); public void delete ...
- linux:安装
安装准备 1.虚拟机:VMware® Workstation 12 Pro 2.系统:CentOS-6.5-i386-bin-DVD1.iso 新建虚拟机 网络设置: NAT:配置好后Windows与 ...