python spider 处理post请求的求解?

处理有道云在线翻译的post请求,代码如下,最后运行代码,为什么运行错误?

from urllib import request

import urllib

#构造请求头信息

header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) App" "leWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.42" "40.198 Safari/537.36"}

# url网址 https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule url=r"http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"

key="自学"

# post请求需要提供的参数

formdata={ "i":key,

"from":"AUTO",

"to":"AUTO",

"smartresult":"dict",

"client":"fanyideskweb",

"salt":"16622993877070",

"sign":"0fb63f31f6937a9f5360cfd32bb241cb",

"lts":"1662299387707",

"bv":"b0ff5d17f404993192085bf8b1e93587",

"doctype":"json",

"version":"2.1",

"keyfrom":"fanyi.web",

"action":"FY_BY_REALTlME" }

# 经过urlencode转码

data=urllib.parse.urlencode(formdata).encode(encoding="utf-8")

# 如果request里的data参数有值,那么这个请求为post请求 req=request.Request(url,data=data,headers=header) reponse=request.urlopen(req).read().decode()

print(reponse)

Python中,要实现长连接爬虫,你可以使用诸如requests库、Scrapy框架或者第三方库如urllib3和socket等方式。这里以requests库为例,因为它相对简单易懂: **使用requests库**: ```python import requests from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry # 设置一个重试策略,包括无限次尝试(max_retries = float('inf'))和超时等待 retry_strategy = Retry(total=5, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504]) adapter = HTTPAdapter(max_retries=retry_strategy) session = requests.Session() session.mount('http://', adapter) session.mount('https://', adapter) # 使用session发起请求,连接会自动重用 for _ in range(10): # 这里模拟多次请求 response = session.get('http://example.com') print(response.text) ``` 在这个例子中,`Session()`创建了一个持久化的连接池,每个请求都会复用之前的连接,除非遇到错误,此时会按照Retry Strategy进行重试。 **使用Scrapy框架**: Scrapy内置了长连接的支持,你可以在中间件(Middleware)中实现,例如使用`DownloaderMiddleware`来重用连接: ```python class CustomDownloaderMiddleware(object): def process_request(self, request, spider): if not request.meta.get('dontReuse', False): request.meta['proxy'] = None # 如果有代理则移除,防止使用代理导致无法复用 request.meta['download_slot'] = None # 请求一个下载槽,让Scrapy知道可以重用连接 def process_response(self, request, response, spider): if request.meta.get('download_slot'): del request.meta['download_slot'] return response ``` 然后在settings.py中启用长连接: ```python DOWNLOADER_MIDDLEWARES = { 'your_spider_module.CustomDownloaderMiddleware': 723, # 中间件的位置 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值