python-13:解決header的問題

前面咱們已經講了header是什麼以及怎樣用代碼假裝header,如今來看看修改後的代碼並看看運行結果python

#!/usr/bin/env python
# -*- coding:UTF-8 -*-
__author__ = '217小月月坑'

import urllib2

url = 'http://www.qiushibaike.com/'
user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko
/20100101 Firefox/40.0'
headers = {'User-Agent':user_agent}
request = urllib2.Request(url,headers)
response = urllib2.urlopen(request)
print response.read()

額......又出錯了,W T F,媽蛋。爬蟲太難寫了我要去玩LOL函數

......
......
......
好了,你們好,我是217小月月坑,我又回來了
先來看看錯誤提示
url

 
TypeError: must be string or buffer, not dict
類型錯誤:必須是字符串或緩衝區數據,不能是字典

好的這又是一種錯誤類型,這種類型就叫"即便給了你錯誤信息也很難判斷是什麼錯誤"
關於對這種類型的錯誤我如今還找不出行之有效的方法,我是在百度的時候無心中看到,而後試了一下才成功的。
其實這個錯誤的緣由是,urllib2.Request 中有不少個參數,若是你按照函數原型中的參數一一對應的傳入值的話,程序就會自動識別你輸入的參數,就好比:
你先定義了url、data、 headers、 origin_req_host、 unverifiable 這幾個變量並賦給他們相應的值,而後依次傳入就像這樣:
code

urllib2.Request(url, data, headers, origin_req_host, unverifiable)

由於你是嚴格按照函數原型裏面的參數來傳值的,參數的個數和順序都是和函數原型一一對應的,因此程序能夠識別這些參數,程序的運行不會報錯,可是,你要是給參數換一下位置,
字符串

urllib2.Request(url, headers, data, origin_req_host, unverifiable)

這樣就會報錯,第二個參數原本是data參數,它有本身的數據類型,而如今傳入的headers參數的數據類型跟data的數據類型不同,程序運行就會報錯
像如今這樣,咱們只寫入兩個參數,並且還不是第一個和第二個參數,程序就不可以識別獲得你傳入的參數對應的是哪個,如今報的錯誤是TypeError,是由於程序將headers當成是傳給data這個參數的值,而,這兩個參數的數據類型不同,因此會報類型錯誤

解決的方法是:在傳入時指明你傳入的是哪個參數的值
request = urllib2.Request(url,headers=headers)
原型

或者是不傳入到參數用None代替 
request = urllib2.Request(url,None,headers)string

我比較喜歡第一種寫法,由於這樣能很清楚的知道是哪一個變量
class

若是按照上面的步驟來的話,你的程序看起來應該是這樣子的:
import

#!/usr/bin/env python
# -*- coding:UTF-8 -*-
__author__ = '217小月月坑'

import urllib2

url = 'http://www.qiushibaike.com/'
user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Geck
o/20100101 Firefox/40.0'
headers = {'User-Agent':user_agent}
request = urllib2.Request(url,headers=headers)
response = urllib2.urlopen(request)
print response.read()
相關文章
相關標籤/搜索