网络爬虫框架Scrapy详解之Request

点击上方“程序员大咖”,选择“置顶公众号”

关键时刻,第一时间送达!640?640?wx_fmt=gif














































































































































































































































































































    先不说楚枫的这般年纪,能够踏入元武一重说明了什么,最主要的是,楚枫在刚刚踏入核心地带时,明明只是灵武七重,而在这两个月不到的时间,连跳两重修为,又跳过一个大境界,踏入了元武一重,这般进步速度,简直堪称变态啊。


    “这楚枫不简单,原来是一位天才,若是让他继续成长下去,绝对能成为一号人物,不过可惜,他太狂妄了,竟与龚师兄定下生死约战,一年时间,他再厉害也无法战胜龚师兄。”有人认识到楚枫的潜力后,为楚枫感到惋惜。


    “哼,何须一年,此子今日就必败,巫九与龚师兄关系甚好,早就看他不顺眼了,如今他竟敢登上生死台挑战巫九,巫九岂会放过他?”但也有人认为,楚枫今日就已是在劫难逃。


    “何人挑战老子?”就在这时,又是一声爆喝响起,而后一道身影自人群之中掠出,最后稳稳的落在了比斗台上。


    这位身材瘦弱,身高平平,长得那叫一个猥琐,金钩鼻子蛤蟆眼,嘴巴一张牙带色儿,说话臭气能传三十米,他若是当面对谁哈口气,都能让那人跪在地上狂呕不止。


    不过别看这位长得不咋地,他在核心地带可是鼎鼎有名,剑道盟创建者,青龙榜第九名,正是巫九是也。


    “你就是巫九?”楚枫眼前一亮,第一次发现,世间还有长得如此奇葩的人。


    巫九鼻孔一张,大嘴一咧,拍着那干瘪的肚子,得意洋洋的道:“老子就是巫九,你挑战老子?”


    “不是挑战你,是要宰了你。”楚枫冷声笑道。


    “好,老子满足你这个心愿,长老,拿张生死状来,老子今日在这里了解了这小子。”巫九扯开嗓子,对着下方吼了一声。


    如果他对内门长老这么说话,也就算了,但是敢这么跟核心长老说话的,他可真是算作胆肥的,就连许多核心弟子,都是倒吸了一口凉气,心想这楚枫够狂,想不到这巫九更狂。


    不过最让人无言的就是,巫九话音落下不久,真有一位核心长老自人群走出,缓缓得来到了比斗台上,左手端着笔墨,右手拿着生死状,来到了巫九的身前。


    “我去,这巫九什么身份,竟能这般使唤核心长老?”有人吃惊不已,那长老修为不低,乃是元武七重,比巫九还要高两个层次,但却这般听巫九的话,着实让人吃惊不已。


    “这你就不知道了吧,巫九在前些时日,拜了钟离长老为师尊,已正式得到钟离长老的亲传。”有人解释道。


    “钟离长老?可是那位性情古怪的钟离一护?”


    “没错,就是他。”


    “天哪,巫九竟然拜入了他的门下?”


    人们再次大吃一惊,那钟离一护在青龙宗可是赫赫有名,若要是论其个人实力,在青龙宗内绝对能够排入前三,连护宗六老单打独斗都不会是他的对手。


    只不过那钟离一护,如同诸葛青云一样,也是一位客卿长老,所以在青龙宗内只是挂个头衔,什么事都不管,更别说传授宗内弟子技艺了,如今巫九竟然能拜入他老人家门下,着实让人羡慕不已。


    “恩怨生死台,的确可以决斗生死,但必须要有所恩怨,你们两个人,可有恩怨?”那位长老开口询问道。





























































































 作者:zarten

zhihu.com/people/zarten

程序员大咖整理发布,转载请联系作者获得授权


介绍

Request类是一个http请求的类,对于爬虫而言是一个很重要的类。通常在Spider中创建这样的一个请求,在Downloader中执行这样的一个请求。同时也有一个子类FormRequest继承于它,用于post请求。

在Spider中通常用法:

 
 
  1. yield scrapy.Request(url = 'zarten.com')

类属性和方法有:

 
 
  1. url

  2. method

  3. headers

  4. body

  5. meta

  6. copy()

  7. replace([url, method, headers, body, cookies, meta, encoding, dont_filter, callback, errback])

Request

 
 
  1. 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的键值对):

 
 
  1. cookies = {'name1' : 'value1' , 'name2' : 'value2'}

list方式:

 
 
  1. cookies = [

  2. {'name': 'Zarten', 'value': 'my name is Zarten', 'domain': 'example.com', 'path': '/currency'}

  3. ]

  • encoding 请求的编码方式,默认为'utf-8'

  • priority int类型,指定请求的优先级,数字越大优先级越高,可以为负数,默认为0

  • dont_filter 默认为False,若设置为True,这次请求将不会过滤(不会加入到去重队列中),可以多次执行相同的请求

  • errback 抛出错误的回调函数,错误包括404,超时,DNS错误等,第一个参数为Twisted Failure实例

 
 
  1. from scrapy.spidermiddlewares.httperror import HttpError

  2. from twisted.internet.error import DNSLookupError

  3. from twisted.internet.error import TimeoutError, TCPTimedOutError

  4. class ToScrapeCSSSpider(scrapy.Spider):

  5.    name = "toscrape-css"

  6.    # start_urls = [

  7.    #     'http://quotes.toscrape.com/',

  8.    # ]

  9.    start_urls = [

  10.        "http://www.httpbin.org/",  # HTTP 200 expected

  11.        "http://www.httpbin.org/status/404",  # Not found error

  12.        "http://www.httpbin.org/status/500",  # server issue

  13.        "http://www.httpbin.org:12345/",  # non-responding host, timeout expected

  14.        "http://www.httphttpbinbin.org/",  # DNS error expected

  15.    ]

  16.    def start_requests(self):

  17.        for u in self.start_urls:

  18.            yield scrapy.Request(u, callback=self.parse_httpbin,

  19.                                 errback=self.errback_httpbin,

  20.                                 dont_filter=True)

  21.    def parse_httpbin(self, response):

  22.        self.logger.info('Got successful response from {}'.format(response.url))

  23.        # do something useful here...

  24.    def errback_httpbin(self, failure):

  25.        # log all failures

  26.        self.logger.info(repr(failure))

  27.        # in case you want to do something special for some errors,

  28.        # you may need the failure's type:

  29.        if failure.check(HttpError):

  30.            # these exceptions come from HttpError spider middleware

  31.            # you can get the non-200 response

  32.            response = failure.value.response

  33.            self.logger.info('HttpError错误 on %s', response.url)

  34.        elif failure.check(DNSLookupError):

  35.            # this is the original request

  36.            request = failure.request

  37.            self.logger.info('DNSLookupError错误 on %s', request.url)

  38.        elif failure.check(TimeoutError, TCPTimedOutError):

  39.            request = failure.request

  40.            self.logger.info('TimeoutError错误 on %s', request.url)

  • flags list类型,一般不会用到,发送请求的标志,一般用于日志记录

  • meta 可用户自定义从Request到Response传递参数,这个参数一般也可在middlewares中处理

 
 
  1. yield scrapy.Request(url = 'zarten.com', meta = {'name' : 'Zarten'})

在Response中:

 
 
  1. my_name = response.meta['name']

不过也有scrapy内置的特殊key,也非常有用,它们如下:

  • proxy 设置代理,一般在middlewares中设置

可以设置http或https代理

 
 
  1. 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默认是过滤了这些返回,不会接收这些错误的返回进行处理。不过可以自定义处理哪些错误返回:

 
 
  1. yield scrapy.Request(url= 'https://httpbin.org/get/zarten', meta= {'handle_httpstatus_list' : [404]})

在parse函数中可以看到处理404错误:

 
 
  1.    def parse(self, response):

  2.        print('返回信息为:',response.text)

  • handlehttpstatusall 设为True后,Response将接收处理任意状态码的返回信息

  • dontmergecookies scrapy会自动保存返回的cookies,用于它的下次请求,当我们指定了自定义cookies时,如果我们不需要合并返回的cookies而使用自己指定的cookies,可以设为True

  • cookiejar 可以在单个spider中追踪多个cookie,它不是粘性的,需要在每次请求时都带上

 
 
  1.    def start_requests(self):

  2.        urls = ['http://quotes.toscrape.com/page/1',

  3.                'http://quotes.toscrape.com/page/3',

  4.                'http://quotes.toscrape.com/page/5',

  5.                ]

  6.        for i ,url in enumerate(urls):

  7.            yield scrapy.Request(url= url, meta= {'cookiejar' : i})

  8.    def parse(self, response):

  9.        next_page_url = response.css("li.next > a::attr(href)").extract_first()

  10.        if next_page_url is not None:

  11.            yield scrapy.Request(response.urljoin(next_page_url), meta= {'cookiejar' : response.meta['cookiejar']}, callback= self.parse_next)

  12.    def parse_next(self, response):

  13.        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 只读属性,获取请求的响应时间(秒)

 
 
  1.    def start_requests(self):

  2.        headers = {

  3.            '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'

  4.        }

  5.        yield scrapy.Request(url= 'https://www.amazon.com', headers= headers)

  6.    def parse(self, response):

  7.        print('响应时间为:', response.meta['download_latency'])

  • downloadfailon_dataloss 很少用到,详情看这里

  • referrer_policy 设置Referrer Policy

FormRequest

FormRequest 类为Request的子类,用于POST请求

这个类新增了一个参数 formdata,其他参数与Request一样,详细可参考上面的讲述

一般用法为:

 
 
  1. yield scrapy.FormRequest(url="http://www.example.com/post/action",

  2.                    formdata={'name': 'Zarten', 'age': '27'},

  3.                    callback=self.after_post)


640?wx_fmt=gif

640?【点击成为源码大神】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy是一个适用于Python的快速、高层次的屏幕抓取和web抓取框架。它可以用于抓取web站点并从页面中提取结构化的数据。Scrapy的用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy是一个框架,可以根据需求进行定制,并提供了多种类型爬虫的基类,如BaseSpider和sitemap爬虫等。最新版本还提供了对web2.0爬虫的支持。 网络爬虫框架Scrapy还有一些基本模块,包括spiders、items、pipelines和middlewares等。其中,spiders下的jingding.py是Scrapy自动生成的爬虫文件,它继承了scrapy.Spider类,这是Scrapy中最基本的类,所有编写的爬虫都必须继承这个类。在jingding.py文件中,可以定义需要取的网站的URL和解析响应的方法等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [爬虫框架 Scrapy 详解](https://blog.csdn.net/m0_67403076/article/details/126081516)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [开源python网络爬虫框架Scrapy.pdf](https://download.csdn.net/download/weixin_72426331/85854755)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值