今天用一个有道翻译的例子来讲解如何用 python 来提交表单数据。
一、获取请求信息
我使用的是谷歌浏览器,打开调式模式再输入中文后提交请求
image.png
点击 Network -> XHR -> POST提交方法 ->Headers
保存以下信息:
- 请求 Request URL
- User-Agent
- FormData 数据
其中 FormData 就是我们提交的表单内容
二、python 模拟提交表单
- 将 formdata 构造成字典
data['i'] = content
data['from'] = 'AUTO'
data['to'] = 'AUTO'
data['smartresult'] = ['dict']
data['client'] = ['fanyideskweb']
data['salt'] = '1529068716890'
data['sign'] = 'e352f557c7770386ab1a2ce3667fa09b'
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['action'] = 'FY_BY_CLICKBUTTION'
data['typoResult'] = 'false'
- 添加请求头信息
head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
这是为了防止服务器识别出是代码模拟访问进行拦截
- 发送请求并获取响应信息
data = urllib.parse.urlencode(data).encode("UTF-8")#格式化表单内容
req = urllib.request.Request(url,data,head)
response = urllib.request.urlopen(req)
html = response.read().decode("utf-8")
taget = json.loads(html)
res = taget['translateResult'][0][0]['tgt']
使用 urllib.request.Request(url,data,head) 为请求添加信息
-
测试结果
image.png
三、隐藏
隐藏是为了服务器识别出你是正常使用浏览器进行预览还是使用代码进行爬虫,通常服务器会检测 User-Agent 的信息,所以这就是要加上 headers 的原因。
head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
服务器会检测你访问的次数,如果你在短时间内进行 N 多次访问,那么服务器可能会为了防止自己遭受攻击而封你的 IP
可以通过加入定时器进行解决。
while True:
#Code
time.sleep(3)
还有一种就是使用 ip 代理进行访问
ipList = {'138.255.111.240:8080','178.209.108.238:8080','115.223.196.1:9000'}
proxy_support = urllib.request.ProxyHandler({'http':random.choice(ipList)})
opener = urllib.request.build_opener(proxy_support)
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36')]
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url)
随机使用一个 ip 进行访问,在使用时为了提高效率可以开启线程,进行并发访问。
网友评论