4.3 瀏覽器模擬--headers屬性
阿新 • • 發佈:2017-09-09
app 末尾 都是 article import chrom 不支持 kit 如何
‘‘‘
4.3 瀏覽器模擬--headers屬性
‘‘‘
‘‘‘
#有的時候,我們無法爬取一些網頁,會出現403錯誤,因為這些網頁為了防止別人惡意
# 采集其信息所以進行了一些反爬蟲的設置。
#那麽,我們該如何如何爬取我們想爬的這些網頁的信息呢?
可以通過設置一些headers信息,模擬成瀏覽器去訪問這些網站。此時,就能解決這個問題。
‘‘‘
#讓爬蟲模擬成瀏覽器訪問網頁的設置方法
‘‘‘
方法一:使用build_opener()修改報頭
由於urlopen()不支持一些HTTP的高級功能,所以,我們如果要修改報頭,可以使用
urllib2.build_opener()進行,要爬取無法爬取的網頁,我們可以使用如下代碼:
‘‘‘
import urllib2
url = "http://blog.csdn.net/weiwei_pig/article/details/51178226"
headers=("User-Agent","Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36")
opener=urllib2.build_opener()
opener.addheaders=[headers]
data=opener.open(url).read()
‘‘‘
上述代碼中,首先,我們定義了一個變量url存儲要爬取的網址,然後再定義一個變量headers存儲對應的User-Agent信息,
定義的格式為(“User-Agent”,具體信息),具體信息我們剛才已經從瀏覽器中獲取了,該信息獲取一次即可,
以後在爬取其他網站的時候可以直接用,所以可以保存起來,不用每次都通過F12去找。
然後,我們需要使用urllib2.build_opener()創建自定義的opener對象並賦給變量opener,接下來,設置opener對象的addheaders,即設置對應的頭信息,
設置格式為:“opener對象名.addheaders=[頭信息]”,設置好頭信息之後,我們就可以使用opener對象的open()方法打開對應的網址了。
此時,打開操作是已經具有頭信息的打開操作行為,即會模仿為瀏覽器去打開,使用格式是“opener對象名.open(url地址)”。
打開對應網址後,再使用read()方法讀取對應數據,並賦給data變量。
‘‘‘
#此時,我們成功實現了模擬瀏覽器去爬取對應的網頁
#可以將對應的內容寫入文件
fhandle=open("E://3.html","wb")
fhandle.write(data)
fhandle.close()
#若未發現報錯,則爬取網頁成功,同時可以看到有相關的3.html文檔
‘‘‘
方法2:使用add_header()添加報頭
‘‘‘
import urllib2
url ="http://blog.csdn.net/weiwei_pig/article/details/51178226"
req=urllib2.Request(url)
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36")
data=urllib2.urlopen(req).read() #對應於python3的data=urlib.request.urlopen(req).read()
‘‘‘
首先,設置要爬取的網址,然後使用urllib2.Request(url)創建一個Request對象
並賦給變量req,創建對象的格式為:urllib2.Request(url地址)。
隨後,使用add_header()方法添加對應的報頭信息,格式為:Request對象名.add_header(字段名,字段值)
此
時,已經成功設置好報頭,然後我們使用urlopen()打開該Request對象即可打開對應網址,所以此時我們使用
data=urllib2.urlopen(req).read()打開了對應網址並讀取了網頁內容,並賦給了data變量。
此時,成功模擬瀏覽器爬取了對應網址的信息。我們同樣可以像方法1中一樣將對應的信息寫入文件。
‘‘‘
‘‘‘
以上兩種方法都可以實現報頭的添加,我們可以發現,這兩種方法都是使用設置報頭中的User-Agent字段信息來將對應的訪問行為模仿成瀏覽器訪問,避免了403錯誤。
只是添加報文的方法有所不同,值得註意的是,方法1中使用的是addheaders()方法,方法2中使用的是add_header()方法,註意末尾有無s以及有無下劃線的區別。
‘‘‘
4.3 瀏覽器模擬--headers屬性