网络爬虫框架Scrapy详解之Request
yuyutoo 2024-10-12 00:33 1 浏览 0 评论
简介: Request类是一个http请求的类,对于爬虫而言是一个很重要的类。通常在Spider中创建这样的一个请求,在Downloader中执行这样的一个请求。同时也有一个子类FormRequest继承于它,用于post请求。
介绍
Request类是一个http请求的类,对于爬虫而言是一个很重要的类。通常在Spider中创建这样的一个请求,在Downloader中执行这样的一个请求。同时也有一个子类FormRequest继承于它,用于post请求。
在Spider中通常用法:
yield scrapy. Request (url = 'zarten.com' )
类属性和方法有:
url method headers body meta copy() replace([url, method, headers, body, cookies, meta, encoding, dont_filter, callback, errback]) Request class scrapy.http.
Request
(url[, callback, method= 'GET' , headers, body, cookies, meta, encoding= 'utf-8' , priority= 0 , dont_filter= False , errback, flags])
参数说明:
url 请求的url
callback 回调函数,用于接收请求后的返回信息,若没指定,则默认为parse()函数
method http请求的方式,默认为GET请求,一般不需要指定。若需要POST请求,用FormRequest即可
headers 请求头信息,一般在settings中设置即可,也可在middlewares中设置
body str类型,为请求体,一般不需要设置(get和post其实都可以通过body来传递参数,不过一般不用)
cookies dict或list类型,请求的cookie dict方式(name和value的键值对):
cookies = { 'name1' : 'value1' , 'name2' : 'value2' }
list方式:
cookies = [ { 'name' : 'Zarten' , 'value' : 'my name is Zarten' , 'domain' : 'example.com' , 'path' : '/currency' } ]
encoding 请求的编码方式,默认为'utf-8'
priority int类型,指定请求的优先级,数字越大优先级越高,可以为负数,默认为0
dont_filter 默认为False,若设置为True,这次请求将不会过滤(不会加入到去重队列中),可以多次执行相同的请求
errback 抛出错误的回调函数,错误包括404,超时,DNS错误等,第一个参数为Twisted Failure实例
from scrapy.spidermiddlewares.httperror import HttpError from twisted.internet.error import DNSLookupError from twisted.internet.error import TimeoutError , TCPTimedOutError class ToScrapeCSSSpider (scrapy. Spider ): name = "toscrape-css" # start_urls = [ # 'http://quotes.toscrape.com/', # ] start_urls = [ "http://www.httpbin.org/" , # HTTP 200 expected "http://www.httpbin.org/status/404" , # Not found error "http://www.httpbin.org/status/500" , # server issue "http://www.httpbin.org:12345/" , # non-responding host, timeout expected "http://www.httphttpbinbin.org/" , # DNS error expected ] def start_requests( self ): for u in self .start_urls: yield scrapy. Request (u, callback= self .parse_httpbin, errback= self .errback_httpbin, dont_filter= True ) def parse_httpbin( self , response): self .logger.info( 'Got successful response from {}' .format(response.url)) # do something useful here... def errback_httpbin( self , failure): # log all failures self .logger.info(repr(failure)) # in case you want to do something special for some errors, # you may need the failure's type: if failure.check( HttpError ): # these exceptions come from HttpError spider middleware # you can get the non-200 response response = failure.value.response self .logger.info( 'HttpError错误 on %s' , response.url) elif failure.check( DNSLookupError ): # this is the original request request = failure.request self .logger.info( 'DNSLookupError错误 on %s' , request.url) elif failure.check( TimeoutError , TCPTimedOutError ): request = failure.request self .logger.info( 'TimeoutError错误 on %s' , request.url)
flags list类型,一般不会用到,发送请求的标志,一般用于日志记录
meta 可用户自定义从Request到Response传递参数,这个参数一般也可在middlewares中处理
yield scrapy. Request (url = 'zarten.com' , meta = { 'name' : 'Zarten' })
在Response中:
my_name = response.meta[ 'name' ]
不过也有scrapy内置的特殊key,也非常有用,它们如下:
proxy 设置代理,一般在middlewares中设置
可以设置http或https代理
request.meta[ 'proxy' ] = 'https://' + 'ip:port'
downloadtimeout 设置请求超时等待时间(秒),通常在settings中设置DOWNLOADTIMEOUT,默认是180秒(3分钟)
maxretrytimes 最大重试次数(除去第一次下载),默认为2次,通常在settings中 RETRY_TIMES设置
dont_redirect 设为True后,Request将不会重定向
dont_retry 设为True后,对于http链接错误或超时的请求将不再重试请求
handlehttpstatuslist http返回码200-300之间都是成功的返回,超出这个范围的都是失败返回,scrapy默认是过滤了这些返回,不会接收这些错误的返回进行处理。不过可以自定义处理哪些错误返回:
yield scrapy. Request (url= 'https://httpbin.org/get/zarten' , meta= { 'handle_httpstatus_list' : [ 404 ]})
在parse函数中可以看到处理404错误:
def parse( self , response): print ( '返回信息为:' ,response.text)
handlehttpstatusall 设为True后,Response将接收处理任意状态码的返回信息
dontmergecookies scrapy会自动保存返回的cookies,用于它的下次请求,当我们指定了自定义cookies时,如果我们不需要合并返回的cookies而使用自己指定的cookies,可以设为True
cookiejar 可以在单个spider中追踪多个cookie,它不是粘性的,需要在每次请求时都带上
def start_requests( self ): urls = [ 'http://quotes.toscrape.com/page/1' , 'http://quotes.toscrape.com/page/3' , 'http://quotes.toscrape.com/page/5' , ] for i ,url in enumerate(urls): yield scrapy. Request (url= url, meta= { 'cookiejar' : i}) def parse( self , response): next_page_url = response.css( "li.next > a::attr(href)" ).extract_first() if next_page_url is not None : yield scrapy. Request (response.urljoin(next_page_url), meta= { 'cookiejar' : response.meta[ 'cookiejar' ]}, callback= self .parse_next) def parse_next( self , response): print ( 'cookiejar:' , response.meta[ 'cookiejar' ])
dont_cache 设为True后,不会缓存
redirect_urls 暂时还不清楚具体的作用,知道的小伙伴们欢迎在评论留言
bindaddress 绑定输出IP
dontobeyrobotstxt 设为True,不遵守robots协议,通常在settings中设置
downloadmaxsize 设置下载器最大下载的大小(字节),通常在settings中设置DOWNLOADMAXSIZE,默认为1073741824 (1024MB=1G),若不设置最大的下载限制,设为0
download_latency 只读属性,获取请求的响应时间(秒)
def start_requests( self ): headers = { 'user-agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' } yield scrapy. Request (url= 'https://www.amazon.com' , headers= headers) def parse( self , response): print ( '响应时间为:' , response.meta[ 'download_latency' ])
downloadfailon_dataloss 很少用到,详情看这里
referrer_policy 设置Referrer Policy
FormRequest
FormRequest 类为Request的子类,用于POST请求
这个类新增了一个参数 formdata,其他参数与Request一样,详细可参考上面的讲述
一般用法为:
yield scrapy. FormRequest (url= "http://www.example.com/post/action" , formdata={ 'name' : 'Zarten' , 'age' : '27' }, callback= self .after_post)
点击“了解更多”看源代码,建议收藏
相关推荐
- 史上最全的浏览器兼容性问题和解决方案
-
微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...
-
- 平面设计基础知识_平面设计基础知识实验收获与总结
-
CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...
-
2025-02-21 16:01 yuyutoo
- 写作排版简单三步就行-工具篇_作文排版模板
-
和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...
- 写一个2048的游戏_2048小游戏功能实现
-
1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...
- 今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……
-
最近的天气暖和得让很多小伙伴们喊“热”!!! 昨天的气温到底升得有多高呢?你家有没有榜上有名?...
- CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式
-
之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...
- 你的自我界限够强大吗?_你的自我界限够强大吗英文
-
我的结果:A、该设立新的界限...
- 行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?
-
行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...
-
- 让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
-
去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...
-
2025-02-21 16:00 yuyutoo
- 今年国家综合性消防救援队伍计划招录消防员15000名
-
记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...
- 一起盘点最新 Chrome v133 的5大主流特性 ?
-
1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...
- 竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使
-
style="text-align:center;"data-mce-style="text-align:...
- 学物理能做什么?_学物理能做什么 卢昌海
-
作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...
-
- 你不知道的关于这只眯眼兔的6个小秘密
-
在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...
-
2025-02-21 16:00 yuyutoo
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)