記錄我的爬蟲之路2-- headers的修改 && 控制訪問頻率
阿新 • • 發佈:2019-02-18
咳咳,人生真的是一波三折,落落起起,大概是9.14那天晚上好像,我前面的同學準備出國,臨時放棄保研,然後名額順延到我了,這幾天就在瘋狂複習資料結構,也沒怎麼看爬蟲,昨天剛保研面試完,不知道結果怎麼樣,但願一切都好吧!今天來學學爬蟲,昨晚買了兩本書, 一本是python程式設計的入門實戰,一本是關於資料探勘的~ 然後在知乎上找到了scrapy的教程,這幾天先打算學一學~ 人生的下一個階段,要比以前更努力才是啊!
一. 修改headers
——————————————————————————————————————————————————
1. 方法一: 通過字典的形式引數傳給request:
因為咱們的爬蟲訪問網站留下的useragent是pythonxxx,人一看就知道是爬蟲了~萬一網站採取反爬措施呢?咱們該怎麼辦呢?今天就介紹一下 userAgent的修改→修改headers
用上個部落格的爬取有道翻譯的例子:
下面我們用定義一個爬蟲函式的過程來講解一下:
1.1 填寫你要爬取的url
def Translation(input):
input = str(input) #使用者的輸入引數
url="http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
1.2 填寫你要傳入的data (每個網站可能格式不同,具體怎麼填寫請參照上一篇博文)
data={} #data是一個字典 data['from'] = 'AUTO' data['to'] = 'AUTO' data['i'] = input #要翻譯的東西是使用者的輸入引數 data['smartresult'] = 'dict' data['client'] = 'fanyideskweb' data['salt'] = '1536132624880' data['sign'] = '84d7547f78c9455a6ad3067cc86baa0d' 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') #data必須是x-www-form-urlencoded格式。所以需要用這個函式來編碼成url
1.3 修改headers
head={}
head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
這裡的引數是怎麼來的呢?我們先用瀏覽器手工開啟有道翻譯的介面:
這裡就是我們的瀏覽器提交的時候的User-Agent啦,我們可以通過修改這個,模擬成瀏覽器訪問~
1.4 將url data head依次賦值給req
req = urllib.request.Request(url, data, head) response = urllib.request.urlopen(req) response = response.read().decode('utf-8') response= json.loads(response) #s表示字串,載入字串變成字典 result = str(response['translateResult'][0][0]['tgt']) print(input, '的翻譯是:', result)
1.5 呼叫
UserIn = str(input('請輸入您要翻譯的內容:\n'))
Translation(UserIn)
2. 方法二: request生成之後,add_header():
只需要把上文的1.3步驟換成如下即可:
# 方法2. request生成之後,add_header()動態追加
req = urllib.request.Request(url, data)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')
——————————————————————————————————————————————————
二. 控制訪問頻率: – 增加訪問間隔 – time
2.1 引入time 模組
import time
只需要在呼叫的時候更改一下間隔:
while True:
UserIn = str(input('\n請輸入您要翻譯的內容:(輸入ESC退出程式)\n'))
if(UserIn != 'ESC'):
Translation(UserIn)
time.sleep(5) #休眠5秒鐘
else:
break