scrapy下载中间件修改请求参数
1.修改请求头
每次请求随机选择一个ua。
class TestMiddleware:
def __init__(self):
self.user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15',
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
]
def process_request(self, request, spider):
user_agent = random.choice(self.user_agents)
request.headers['User-Agent'] = user_agent
2.修改cookie
# 第一种 在请求头上改
class TestMiddleware:
def process_request(self, request, spider):
request.headers['cookies'] = 'xxx=xxx'
# 第二种 修改cookies
class TestMiddleware:
def process_request(self, request, spider):
request.cookies = {"xxx":xxx}
推荐第二种方式,第一种方式有时设置不成功。
3. 修改请求参数(get请求)
get请求的参数是放在url上,说白了就是修改url
# 爬虫文件
class BlogSpider(scrapy.Spider):
name = 'blog'
class BlogSpider(scrapy.Spider):
name = 'blog'
allowed_domains = ['mumuko.cn']
start_urls = ['https://mumuko.cn/']
def start_requests(self):
self.params = {
"page" : "1",
}
yield scrapy.FormRequest(url=self.start_urls[0], callback=self.parse, method='get', formdata=self.params,)
def parse(self, response):
print(response.url) # https://mumuko.cn/?page=2&sort=0
# 中间件
class TestMiddleware:
def process_request(self, request, spider):
print(request._url) #原始的url https://mumuko.cn/?page=1
# 假如要修改请求参数或者是添加请求参数
params = self.extract_parameters(request._url) # 获取原来的参数
new_params = {'page': '2', 'sort': '0'} # 原来的参数存在就更新 没有的就是添加
params.update(new_params)
base_url = request._url.split('?')[0]
new_url = self.construct_url(base_url,params) #?分隔前面是域名后面是参数
request._set_url(new_url) # 设置新的的url
# 拼接url方法
def construct_url(self,base_url, params):
from urllib.parse import urlencode
query_string = urlencode(params)
full_url = f"{base_url}?{query_string}"
return full_url
# 获取原来的参数
def extract_parameters(self,url):
from urllib.parse import urlparse, parse_qs
parsed_url = urlparse(url)
query_params = parse_qs(parsed_url.query)
for key, value in query_params.items():
if len(value) == 1:
query_params[key] = value[0]
return query_params
4. 修改请求参数(post请求)
有些加密参数需要破解或者用其他的方式拿到,就可以在中间件完成。
class BlogSpider(scrapy.Spider):
name = 'blog'
allowed_domains = ['mumuko.cn',"sentiment.mumuko.cn",'127.0.0.1']
start_urls = ['http://127.0.0.1:8000/api/']
# 本地运行的接口,除了text参数还有一个csrftoken的参数,这时候不知道,没办法设置,就在中间件完成。
def start_requests(self):
self.params = {
'text': '原始请求数据',
}
yield scrapy.FormRequest(url=self.start_urls[2], callback=self.parse, method='post', formdata=self.params)
class TestMiddleware:
def process_request(self, request, spider):
res = requests.get(url='http://127.0.0.1:8000/').text
html = HTML(res)
csrf = html.xpath('//*[@name="csrfmiddlewaretoken"]/@value')[0] # 先获取获取csrftoken
request.headers['cookies'] = f'csrftoken={csrf}' # 这样没效果 不知道为什么
request.cookies = {"csrftoken":csrf} # 设置下cookie
new_data = {
'csrfmiddlewaretoken':csrf
}
# 修改请求参数 request.body是原来的参数,&做链接,再加上新参数
request._body = request.body + "&".encode() + urlencode(new_data).encode('utf-8')
如果文章对你有帮助!可点击按钮打赏哦 ~
发表评论
共 0 条评论
暂无评论