scrapy第⼀次请求⽅式的重写
当起始请求需要设置header,cookie,data时,则要对起始请求做处理,所以需要重写第⼀次请求处理函数start_request(self)
1 设置header与cookie
如果在settings.py⽂件中设置请求头,则所有的蜘蛛⽂件都使⽤该请求头,然⽽不同的蜘蛛⽂件需要不同的请求头,因此需要给每个蜘蛛⽂件的请求设置独⽴的请求头.
设置独⽴的header和cookie⽅法为在蜘蛛⽂件中重写第⼀次请求处理⽅法start_requests
例:
1      2      3      4      5      6# 重写第⼀次请求处理函数,要返回Request对象
def start_requests(self):
start_url ='要请求的链接'
headers ={}
cookies ={}
yield scrapy.Request(url=start_url, headers=headers,callback=self.parse,cookies=cookies)
scrapy.Request函数还有⼀个meta参数,值为字典格式,作⽤是携带数据在指定的回调函数中使⽤,使⽤⽅法:a['键'] 2 携带data数据
同样重写start_requests⽅法,返回FormRequest对象,此时请求⽅式为post
例:
1      2      3      4      5def start_requests(self):
login_url ='要请求的链接'
selenium获取cookie# 发送post请求
data ={}
yield scrapy.FormRequest(url=login_url,formdata=data,callback=self.after_login)
scrapy.FormRequest.from_response⽅法可以从响应中⾃动提取表单POST地址,例如处理登录,需要先返回登录页⾯,再填充表单,然后提交
1      2      3      4      5      6      7# ⾃动提取表单post地址
yield scrapy.FormRequest.from_response( response,
headers=self.header,
formdata=data,
callback=self.after_login,
)
3 设置代理与随机选择请求头
通过下载器中间件来设置请求.
免费代理:
1
收费代理:需要先将账号密码base64编码,再设置给request,然后设置a['proxy']:
1      2      3auth =base64.b64encode({'帐号':'密码'})  #base64需要导⼊request.headers['Proxy-Authorization'] ='Basic '+a['proxy'] =''+'代理IP'
例:
1      2      3      4      5      6      7      8      9      10      11      12      13      14      15      16      17      18      19      20      21#coding:utf8
from settings import USER_AGENS,PROXIES
import random
import base64
# 随机更换浏览器⾝份中间件
class RandomUserAgent(object):
def process_request(self,request,spider):
user_agent =random.choice(USER_AGENS)
request.headers.setdefault('User-Agent',user_agent)
# 随机更换代理ip
class RandomProxy(object):
def process_request(self,request , spider):
proxy =random.choice(PROXIES) # 随机选出⼀个代理
('auth') is None: # 免费代理
else: # 收费代理
auth =base64.b64encode(proxy['auth'])
request.headers['Proxy-Authorization'] ='Basic '+auth
4 在scrapy中使⽤selenium
如果有些页⾯实在难以爬取,可以使⽤selenium⽅式,但是此⽅式会慢,所以尽量去抓包解析页⾯结构爬取.
使⽤: 在下载器中间件中,截取request,使⽤selenium对request的url发送请求,将获取的response返回,不使⽤下载器发送请求.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。