1. 程式人生 > >python3.6爬蟲—有道,百度翻譯爬蟲

python3.6爬蟲—有道,百度翻譯爬蟲

(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)