python3.6爬蟲—有道,百度翻譯爬蟲
阿新 • • 發佈:2019-01-04
(1)通過headers反爬蟲:從使用者請求的Headers反爬蟲是最常見的反爬蟲策略,很多網站都會對Headers的User-Agent進行檢測,遇到這種情況,可以直接在爬蟲中新增Headers,將瀏覽器的User-Agent複製到Headers中。一般有兩種方法:
第1種方法:在Request生成之前先設定好,然後傳遞給Request
有道翻譯,翻譯語言是自動的 #import urllib.request延遲提交時間 import urllib.parse import json import time while True: content=input('請輸入翻譯內容(輸入"q!"退出程式):') #可以根據輸入內容實現自動翻譯 if content=='q!': break url='http://fanyi.youdao.com/translate' head={}#在Request生成之前先設定好,然後傳遞給Request head['User-Agent']='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36' data={} data['i']=content#翻譯的內容必須有 data['doctype']='json'#指定翻譯結果為json格式 data=urllib.parse.urlencode(data).encode('utf-8')#轉換為伺服器可以理解的編碼方式 req=urllib.request.Request(url,data,head)#urllib.request.Request是進一步的包裝請求,目的是加上頭資訊,偽裝成瀏覽器訪問 response=urllib.request.urlopen(req)#返回response物件,返回資訊儲存在此物件裡 html=response.read().decode('utf-8')#伺服器返回結果讀取 #print(html)輸出字串,字串包含字典結構 translate_results=json.loads(html)##字串載入得到字典結構 #print(translate_results)輸出結果:{'type': 'EN2ZH_CN', 'errorCode': 0, 'elapsedTime': 0, 'translateResult': [[{'src': 'I love you', 'tgt': '我愛你'}]]} translate_results=translate_results['translateResult'][0][0]['tgt']#translateResult字典中包含兩層列表,[0][0]表示去除兩層列表,['tgt']表示訪問translateResult字典中的'tgt'值 print(translate_results) #time.sleep(5)睡眠時間5s後才可以進行下一次翻譯
百度翻譯,翻譯語言可根據要求設定 import urllib.request import urllib.parse import json content=input('請輸入內容:') url='https://fanyi.baidu.com/transapi'#百度翻譯 head={} head['User-Agent']='Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36' data={"query":content,"from":'en',"to":'zh'}#en代表英語,zh代表中文;可以設定翻譯語言 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') #print(html)輸出字串,字串包含字典結構 trans_result=json.loads(html)#字串載入得到字典 #print(trans_result)輸出結果:{'from': 'en', 'to': 'zh', 'domain': 'all', 'type': 2, 'status': 0, 'data': [{'dst': '愛情', 'prefixWrap': 0, 'src': 'Love', 'relation': [], 'result': [[0, '愛情', ['0|4'], [], ['0|4'], ['0|6']]]}]} trans_result=trans_result['data'][0]['dst']#data資料中包含一層列表,去除後在訪問得到需要的值 print(trans_result)
第2種方法:在Request生成之後設定
有道翻譯,翻譯語言是自動的 #import urllib.request#延遲提交時間 import urllib.parse import json import time while True: content=input('請輸入翻譯內容(輸入"q!"退出程式):') #可以根據輸入內容實現自動翻譯 if content=='q!': break url='http://fanyi.youdao.com/translate'#有道翻譯,翻譯語言是自動的 data={} data['i']=content#翻譯的內容必須有 data['doctype']='json'#指定翻譯結果為json格式 data=urllib.parse.urlencode(data).encode('utf-8')#轉換為伺服器可以理解的編碼方式 req=urllib.request.Request(url,data)#urllib.request.Request是進一步的包裝請求 req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36')#在Request生成之後 response=urllib.request.urlopen(req)#返回response物件,返回資訊儲存在此物件裡 html=response.read().decode('utf-8')#伺服器返回結果讀取 #print(html)輸出字串,字串包含字典結構 translate_results=json.loads(html)##字串載入得到字典結構 #print(translate_results)輸出結果:{'type': 'EN2ZH_CN', 'errorCode': 0, 'elapsedTime': 0, 'translateResult': [[{'src': 'I love you', 'tgt': '我愛你'}]]} translate_results=translate_results['translateResult'][0][0]['tgt']#translateResult字典中包含兩層列表,[0][0]表示去除兩層列表,['tgt']表示訪問translateResult字典中的'tgt'值 print(translate_results) #time.sleep(5)#睡眠時間5s後才可以進行下一次翻譯
百度翻譯,翻譯語言可根據要求設定
import urllib.request
import urllib.parse
import json
content=input('請輸入內容:')
url='https://fanyi.baidu.com/transapi'#百度翻譯
data={"query":content,"from":'en',"to":'zh'}#en代表英語,zh代表中文;可以設定翻譯語言
data=urllib.parse.urlencode(data).encode('utf-8')
req=urllib.request.Request(url,data)
req.add_header('User-Agent','Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36')
response=urllib.request.urlopen(req)
html=response.read().decode('utf-8')
#print(html)輸出字串,字串包含字典結構
trans_result=json.loads(html)#字串載入得到字典
#print(trans_result)輸出結果:{'from': 'en', 'to': 'zh', 'domain': 'all', 'type': 2, 'status': 0, 'data': [{'dst': '愛情', 'prefixWrap': 0, 'src': 'Love', 'relation': [], 'result': [[0, '愛情', ['0|4'], [], ['0|4'], ['0|6']]]}]}
trans_result=trans_result['data'][0]['dst']#data資料中包含一層列表,去除後在訪問得到需要的值
print(trans_result)
(2)基於使用者行為的反爬蟲:大多數網站都是前一種情況,對於這種情況,使用IP代理就可以解決。可以專門寫一個爬蟲,爬取網上公開的代理ip,檢測後全部儲存起來。這樣的代理ip爬蟲經常會用到,最好自己準備一個。有了大量代理ip後可以每請求幾次更換一個ip,這在requests或者urllib2中很容易做到,這樣就能很容易的繞過第一種反爬蟲。使用代理IP步驟如下圖:
使用IP(隨便找的)代理如下:
iplist=['119.101.116.77:9999',
'49.86.183.39:9999',
'121.40.78.138:3128']
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 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}]#新增Headers
urllib.request.install_opener(opener)