今天用一個有道翻譯的例子來講解如何用 python 來提交表單數(shù)據(jù)。
一、獲取請求信息
我使用的是谷歌瀏覽器,打開調(diào)式模式再輸入中文后提交請求

image.png
點擊 Network -> XHR -> POST提交方法 ->Headers
保存以下信息:
- 請求 Request URL
- User-Agent
- FormData 數(shù)據(jù)
其中 FormData 就是我們提交的表單內(nèi)容
二、python 模擬提交表單
- 將 formdata 構(gòu)造成字典
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'
這是為了防止服務(wù)器識別出是代碼模擬訪問進行攔截
- 發(fā)送請求并獲取響應信息
data = urllib.parse.urlencode(data).encode("UTF-8")#格式化表單內(nèi)容
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) 為請求添加信息
-
測試結(jié)果
image.png
三、隱藏
隱藏是為了服務(wù)器識別出你是正常使用瀏覽器進行預覽還是使用代碼進行爬蟲,通常服務(wù)器會檢測 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'
服務(wù)器會檢測你訪問的次數(shù),如果你在短時間內(nèi)進行 N 多次訪問,那么服務(wù)器可能會為了防止自己遭受攻擊而封你的 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 進行訪問,在使用時為了提高效率可以開啟線程,進行并發(fā)訪問。
