【Python55--爬蟲:代理】
阿新 • • 發佈:2018-12-07
一、反爬蟲之隱藏
1、網站檢查訪問的是正常使用者還是程式,關鍵在於User-Agent
1)、第一種方法:採用header
--修改header(兩種方法):
--> 在Request之前通過headers引數修改
--> 在Request之後通過Request.add_header()修改
import urllib.request import urllib.parse import json import random import time import hashlib #使用者輸入翻譯的內容 content = input('請輸入需要翻譯的內容:') #連線url地址 url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' #第一種方法: #head = {} #head['User-Agent']='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36' #傳送給伺服器請求的資料 data = {} #此部分資料來源於:FromData data['i']= content data['from']= 'AUTO' data['to']= 'AUTO' data['smartresult']= 'dict' data['client']= 'fanyideskweb' data['salt']= '15439012305959' data['sign']= 'ba81b8cb1c6dc64c253bf6d250cbc09b' data['ts']= '1543901230595' data['bv']= '6d37ec4625573a83fa9ca0cb1e144ce5' data['doctype']= 'json' data['version']= '2.1' data['keyfrom']= 'fanyi.web' data['action']= 'FY_BY_CLICKBUTTION' data['typoResult']= 'false' #對資料進行編碼處理 data = urllib.parse.urlencode(data).encode('utf-8') #建立一個request物件,把url和data傳進去,並且使用POS請求 request = urllib.request.Request(url = url,data=data,method='POST') #第二種方法: request.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36') #開啟請求 reponsend =urllib.request.urlopen(request) #讀取返回來的資料 html = reponsend.read().decode('utf-8') #把返回來的json字串解析成字典 line = json.loads(html) #print(line) #獲取翻譯結果 print('翻譯的結果:%s'%(line['translateResult'][0][0]['tgt']))
2)、要想爬取很多內容,修改header就達不到這種效果了,就需要採用代理
-- 兩種方法:
--> time.sleep() 方法 (效率低)
--> 使用代理
#time.sleep()方法
import urllib.request import urllib.parse import json import random import time import hashlib while True: #使用者輸入翻譯的內容 content = input('請輸入需要翻譯的內容(輸入q!退出程式):') if content=='q!': break #連線url地址 url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' #傳送給伺服器請求的資料 data = {} #此部分資料來源於:FromData data['i']= content data['from']= 'AUTO' data['to']= 'AUTO' data['smartresult']= 'dict' data['client']= 'fanyideskweb' data['salt']= '15439012305959' data['sign']= 'ba81b8cb1c6dc64c253bf6d250cbc09b' data['ts']= '1543901230595' data['bv']= '6d37ec4625573a83fa9ca0cb1e144ce5' data['doctype']= 'json' data['version']= '2.1' data['keyfrom']= 'fanyi.web' data['action']= 'FY_BY_CLICKBUTTION' data['typoResult']= 'false' #對資料進行編碼處理 data = urllib.parse.urlencode(data).encode('utf-8') #建立一個request物件,把url和data傳進去,並且使用POS請求 request = urllib.request.Request(url = url,data=data,method='POST') #開啟請求 reponsend =urllib.request.urlopen(request) #讀取返回來的資料 html = reponsend.read().decode('utf-8') #把返回來的json字串解析成字典 line = json.loads(html) #print(line) #獲取翻譯結果 print('翻譯的結果:%s'%(line['translateResult'][0][0]['tgt'])) time.sleep(3) 執行結果: 請輸入需要翻譯的內容(輸入q!退出程式):愛國 翻譯的結果:patriotic 請輸入需要翻譯的內容(輸入q!退出程式):乘法 翻譯的結果:The multiplication 請輸入需要翻譯的內容(輸入q!退出程式):q! >>>