python scrapy request_python——scrapy中Request参数

介绍

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)

5c8d878c5dfcf8c275245099df1828f0.png

946df913849c76d9ee77372342b66cc8.png

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'

download_timeout

设置请求超时等待时间(秒),通常在settings中设置DOWNLOAD_TIMEOUT,默认是180秒(3分钟)

最大重试次数(除去第一次下载),默认为2次,通常在settings中 RETRY_TIMES设置

dont_redirect

设为True后,Request将不会重定向

dont_retry

设为True后,对于http链接错误或超时的请求将不再重试请求

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)

567bc9074d7e8a7f68d802e4f8e31cef.png

8c842fb3cb801cef42a820acb6913186.png

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

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

可以在单个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'])

d0be446d3cb0c83f110edd2d6a7a1e80.png

4f67690d4a7189b201cb60522c60ba75.png

设为True后,不会缓存

暂时还不清楚具体的作用,知道的小伙伴们欢迎在评论留言

绑定输出IP

设为True,不遵守robots协议,通常在settings中设置

设置下载器最大下载的大小(字节),通常在settings中设置DOWNLOAD_MAXSIZE,默认为1073741824 (1024MB=1G),若不设置最大的下载限制,设为0

只读属性,获取请求的响应时间(秒)

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'])

8855c7719ddbc28da655a992ff90858a.png

6a5e84095ef8707233512b8d835d09df.png

很少用到,详情看这里

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值