网络爬虫框架Scrapy详解之Request
点击上方“程序员大咖”,选择“置顶公众号”
关键时刻,第一时间送达!
先不说楚枫的这般年纪,能够踏入元武一重说明了什么,最主要的是,楚枫在刚刚踏入核心地带时,明明只是灵武七重,而在这两个月不到的时间,连跳两重修为,又跳过一个大境界,踏入了元武一重,这般进步速度,简直堪称变态啊。
“这楚枫不简单,原来是一位天才,若是让他继续成长下去,绝对能成为一号人物,不过可惜,他太狂妄了,竟与龚师兄定下生死约战,一年时间,他再厉害也无法战胜龚师兄。”有人认识到楚枫的潜力后,为楚枫感到惋惜。
“哼,何须一年,此子今日就必败,巫九与龚师兄关系甚好,早就看他不顺眼了,如今他竟敢登上生死台挑战巫九,巫九岂会放过他?”但也有人认为,楚枫今日就已是在劫难逃。
“何人挑战老子?”就在这时,又是一声爆喝响起,而后一道身影自人群之中掠出,最后稳稳的落在了比斗台上。
这位身材瘦弱,身高平平,长得那叫一个猥琐,金钩鼻子蛤蟆眼,嘴巴一张牙带色儿,说话臭气能传三十米,他若是当面对谁哈口气,都能让那人跪在地上狂呕不止。
不过别看这位长得不咋地,他在核心地带可是鼎鼎有名,剑道盟创建者,青龙榜第九名,正是巫九是也。
“你就是巫九?”楚枫眼前一亮,第一次发现,世间还有长得如此奇葩的人。
巫九鼻孔一张,大嘴一咧,拍着那干瘪的肚子,得意洋洋的道:“老子就是巫九,你挑战老子?”
“不是挑战你,是要宰了你。”楚枫冷声笑道。
“好,老子满足你这个心愿,长老,拿张生死状来,老子今日在这里了解了这小子。”巫九扯开嗓子,对着下方吼了一声。
如果他对内门长老这么说话,也就算了,但是敢这么跟核心长老说话的,他可真是算作胆肥的,就连许多核心弟子,都是倒吸了一口凉气,心想这楚枫够狂,想不到这巫九更狂。
不过最让人无言的就是,巫九话音落下不久,真有一位核心长老自人群走出,缓缓得来到了比斗台上,左手端着笔墨,右手拿着生死状,来到了巫九的身前。
“我去,这巫九什么身份,竟能这般使唤核心长老?”有人吃惊不已,那长老修为不低,乃是元武七重,比巫九还要高两个层次,但却这般听巫九的话,着实让人吃惊不已。
“这你就不知道了吧,巫九在前些时日,拜了钟离长老为师尊,已正式得到钟离长老的亲传。”有人解释道。
“钟离长老?可是那位性情古怪的钟离一护?”
“没错,就是他。”
“天哪,巫九竟然拜入了他的门下?”
人们再次大吃一惊,那钟离一护在青龙宗可是赫赫有名,若要是论其个人实力,在青龙宗内绝对能够排入前三,连护宗六老单打独斗都不会是他的对手。
只不过那钟离一护,如同诸葛青云一样,也是一位客卿长老,所以在青龙宗内只是挂个头衔,什么事都不管,更别说传授宗内弟子技艺了,如今巫九竟然能拜入他老人家门下,着实让人羡慕不已。
“恩怨生死台,的确可以决斗生死,但必须要有所恩怨,你们两个人,可有恩怨?”那位长老开口询问道。
作者:zarten
zhihu.com/people/zarten
程序员大咖整理发布,转载请联系作者获得授权
介绍
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)
【点击成为源码大神】
网络爬虫框架Scrapy详解之Request相关推荐
- 网络爬虫框架Scrapy简介
作者: 黄进(QQ:7149101) 一. 网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本:它是一个自动提取网页的程序,它为搜索引擎从万维 ...
- Python网络爬虫框架 Scrapy简介
Scrapy 网络爬虫框架 Scrapy的安装 cmd 执行: pip install scrapy测试安装: scrapy -h Scrapy介绍 Scrapy不是一个函数功能库,而是一个爬虫框架. ...
- 开源 Python网络爬虫框架 Scrapy
开源 Python 网络爬虫框架 Scrapy:http://blog.csdn.net/zbyufei/article/details/7554322 介绍 所谓网络爬虫,就是一个在网上到处或定向抓 ...
- 网络爬虫工作原理详解
网络爬虫工作原理详解 一.通用网络爬虫运行原理 二.聚焦网络爬虫运行原理
- 【Python学习系列五】Python网络爬虫框架Scrapy环境搭建
1.网络爬虫库Scrapy 网络爬虫,是在网上进行数据抓取的程序,使用它能够抓取特定网页的HTML数据.Scrapy是一个使用Python编写的,轻量级的,简单轻巧,并且使用起来非常的方便.Scrap ...
- python中spider的用法_python网络爬虫 CrawlSpider使用详解
CrawlSpider 作用:用于进行全站数据爬取 CrawlSpider就是Spider的一个子类 如何新建一个基于CrawlSpider的爬虫文件 scrapy genspider -t craw ...
- 网络爬虫框架——Scrapy框架解析
一.为什么使用Scrapy框架? Scrapy是一个快速.高层次的屏幕抓取和web抓取的框架,可用于数据挖掘.监测和自动化检测,任何人都可以根据需要去进行修改. 二.Scrapy框架每个组件介绍 1. ...
- java爬虫入门_Java 网络爬虫新手入门详解
这是 Java 网络爬虫系列文章的第一篇,如果你还不知道 Java 网络爬虫系列文章,请参看Java 网络爬虫基础知识入门解析.第一篇是关于 Java 网络爬虫入门内容,在该篇中我们以采集虎扑列表新闻 ...
- Python网络爬虫之Xpath详解
1.什么是Xpath XPath 是一门在 XML 文档中查找信息的语言. 所谓 Xpath,是指 XML path language,path 就是路径, Xpath 主要是通过路径来查找元素. 咱 ...
- 解析python网络爬虫pdf 黑马程序员_正版 解析Python网络爬虫 核心技术 Scrapy框架 分布式爬虫 黑马程序员 Python应用编程丛书 中国铁道出版社...
商品参数 书名:Python应用编程丛书:解析Python网络爬虫:核心技术.Scrapy框架.分布式爬虫 定价:52.00元 作者:[中国]黑马程序员 出版社:中国铁道出版社 出版日期:2018-0 ...
最新文章
- 虚拟机备份oracle异常,客户端连接虚拟机Oracle服务器异常
- (*长期更新)软考网络工程师学习笔记——Section 10 网络安全
- 通讯录小程序android,通讯录小程序,找回青春的回忆
- WSGI Middleware
- Python字典学习
- ffmpeg命令基本语法和常见命令
- 基于微信小程序的毕业设计题目(29)php家政服务预约小程序(含开题报告、任务书、中期报告、答辩PPT、论文模板)
- Linux常用命令学习
- 程序员的小情诗,记录我们爱的轨迹
- 地理位置坐标标准以及转换
- 计算机组成原理中,数据总线与地址总线位数
- java的class文件批量反编译
- 详细分析什么是进程?如何理解进程状态?
- 2022年武汉市工业产品绿色设计示范企业申报条件流程
- 北航计算机九推经验,前辈种树 | 工科九推经验贴
- 网红姓名被抢注商标,你自己的名字还安全吗?
- DNS主从服务器的构建
- Python技法之简单递归下降Parser的实现方法
- 解决多线程并发安全问题
- 蓝桥杯刷题021——填字母游戏(DFS)
热门文章
- CSS3的content属性详解
- vue 购物 WebApp
- KNX协议 楼宇自动化
- 多模态感知论文阅读笔记 | CVPR 2023, Depth Estimation from Camera Image and mmWave Radar Point Cloud
- 【目标检测】YOLO v5 打电话手机目标检测模型
- java dispatchevent_java – 使用dispatchevent生成mousemove事件?
- 频率计的交流耦合和直流耦合的区别_数字示波器通道耦合与触发耦合的区别
- Win7 x64下的_EPROCESS结构记录
- 两轮独立驱动电动汽车控制策略。 分为低速和高速两种策略优化分配驱动力矩
- 人工智能导论实验四 / 深度学习算法及应用