python爬蟲(chóng)模擬瀏覽器的兩種方法實(shí)例分析
本文實(shí)例講述了python爬蟲(chóng)模擬瀏覽器的兩種方法。分享給大家供大家參考,具體如下:
爬蟲(chóng)爬取網(wǎng)站出現(xiàn)403,因?yàn)檎军c(diǎn)做了防爬蟲(chóng)的設(shè)置
一、Herders 屬性
爬取CSDN博客
import urllib.request url = "http://blog.csdn.net/hurmishine/article/details/71708030"file = urllib.request.urlopen(url)
爬取結(jié)果
urllib.error.HTTPError: HTTP Error 403: Forbidden
這就說(shuō)明CSDN做了一些設(shè)置,來(lái)防止別人惡意爬取信息
所以接下來(lái),我們需要讓爬蟲(chóng)模擬成瀏覽器
任意打開(kāi)一個(gè)網(wǎng)頁(yè),比如打開(kāi)百度,然后按F12,此時(shí)會(huì)出現(xiàn)一個(gè)窗口,我們切換到Network標(biāo)簽頁(yè),然后點(diǎn)擊刷新網(wǎng)站,選中彈出框左側(cè)的“www.baidu.com”,即下圖所示:

往下拖動(dòng) 我們會(huì)看到“User-Agent”字樣的一串信息,沒(méi)錯(cuò) 這就是我們想要的東西。我們將其復(fù)制下來(lái)。
此時(shí)我們得到的信息是:”Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36”
接下來(lái)我們可以用兩種方式來(lái)模擬瀏覽器訪(fǎng)問(wèn)網(wǎng)頁(yè)。
二、方法1:使用build_opener()修改報(bào)頭
由于urlopen()不支持一些HTTP的高級(jí)功能,所以我們需要修改報(bào)頭。可以使用urllib.request.build_opener()進(jìn)行,我們修改一下上面的代碼:
import urllib.request
url = "http://blog.csdn.net/hurmishine/article/details/71708030"headers = ("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
data = opener.open(url).read()
print(data)
上面代碼中我們先定義一個(gè)變量headers來(lái)儲(chǔ)存User-Agent信息,定義的格式是(“User-Agent”,具體信息)
具體信息我們上面已經(jīng)獲取到了,這個(gè)信息獲取一次即可,以后爬取其他網(wǎng)站也可以用,所以我們可以保存下來(lái),不用每次都F12去找了。
然后我們用urllib.request.build_opener()創(chuàng)建自定義的opener對(duì)象并賦值給opener,然后設(shè)置opener的addheaders,就是設(shè)置對(duì)應(yīng)的頭信息,格式為:“opener(對(duì)象名).addheaders = [頭信息(即我們儲(chǔ)存的具體信息)]”,設(shè)置好后我們就可以使用opener對(duì)象的open()方法打開(kāi)對(duì)應(yīng)的網(wǎng)址了。格式:“opener(對(duì)象名).open(url地址)”打開(kāi)后我們可以使用read()方法來(lái)讀取對(duì)應(yīng)數(shù)據(jù),并賦值給data變量。
得到輸出結(jié)果
b'\r\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r\n \r\n <html xmlns="http://www.w3.org/1999/xhtml">\r\n \r\n<head> \r\n\r\n <link rel="canonical" rel="external nofollow" /> ...
三、方法2:使用add_header()添加報(bào)頭
除了上面的這種方法,還可以使用urllib.request.Request()下的add_header()實(shí)現(xiàn)瀏覽器的模擬。
先上代碼
import urllib.request
url = "http://blog.csdn.net/hurmishine/article/details/71708030"req = urllib.request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36')
data = urllib.request.urlopen(req).read()
print(data)
好,我們來(lái)分析一下。
導(dǎo)入包,定義url地址我們就不說(shuō)了,我們使用urllib.request.Request(url)創(chuàng)建一個(gè)Request對(duì)象,并賦值給變量req,創(chuàng)建Request對(duì)象的格式:urllib.request.Request(url地址)
隨后我們使用add_header()方法添加對(duì)應(yīng)的報(bào)頭信息,格式:Request(對(duì)象名).add_header(‘對(duì)象名','對(duì)象值')
現(xiàn)在我們已經(jīng)設(shè)置好了報(bào)頭,然后我們使用urlopen()打開(kāi)該Request對(duì)象即可打開(kāi)對(duì)應(yīng)的網(wǎng)址,多以我們使用
data = urllib.request.urlopen(req).read()打開(kāi)了對(duì)應(yīng)的網(wǎng)址,并讀取了網(wǎng)頁(yè)內(nèi)容,并賦值給data變量。
以上,我們使用了兩種方法實(shí)現(xiàn)了爬蟲(chóng)模擬瀏覽器打開(kāi)網(wǎng)址,并獲取網(wǎng)址的內(nèi)容信息,避免了403錯(cuò)誤。
值得我們注意的是,方法1中使用的是addheaders()方法,方法2中使用的是add_header()方法,注意末尾有無(wú)s以及有無(wú)下劃線(xiàn)的區(qū)別
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專(zhuān)題:《Python Socket編程技巧總結(jié)》、《Python正則表達(dá)式用法總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
解決Jupyter notebook更換主題工具欄被隱藏及添加目錄生成插件問(wèn)題
這篇文章主要介紹了解決Jupyter notebook更換主題工具欄被隱藏及添加目錄生成插件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python編程O(píng)penCV和Numpy圖像處理庫(kù)實(shí)現(xiàn)圖片去水印
這篇文章主要介紹了Python編程中如何實(shí)現(xiàn)圖片去水印本文采用了OpenCV和Numpy的圖像處理的方法來(lái)實(shí)現(xiàn),文中附含詳細(xì)示例代碼,有需要的朋友可以借鑒參考下2021-09-09
LRUCache的實(shí)現(xiàn)原理及利用python實(shí)現(xiàn)的方法
LruCache 是 Android 的一個(gè)內(nèi)部類(lèi),提供了基于內(nèi)存實(shí)現(xiàn)的緩存,而下面這篇文章主要給大家介紹了關(guān)于LRUCache的實(shí)現(xiàn)原理以及利用python實(shí)現(xiàn)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-11-11
Django+uni-app實(shí)現(xiàn)數(shù)據(jù)通信中的請(qǐng)求跨域的示例代碼
這篇文章主要介紹了Django+uni-app實(shí)現(xiàn)數(shù)據(jù)通信中的請(qǐng)求跨域的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Python實(shí)戰(zhàn)之實(shí)現(xiàn)百度智能圖片識(shí)別
這篇文章主要介紹了如何利用Python編寫(xiě)一個(gè)百度智能圖片識(shí)別項(xiàng)目,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2022-01-01
Python將Excel表格按某列拆分為多個(gè)sheet實(shí)現(xiàn)過(guò)程
這篇文章主要為大家介紹了Python實(shí)現(xiàn)將Excel表格按某列拆分為多個(gè)sheet,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05

