114培訓(xùn)網(wǎng)歡迎您來(lái)到全國(guó)python學(xué)習(xí)中心!

13289378727

全國(guó)統(tǒng)一學(xué)習(xí)專(zhuān)線 9:00-21:00

如何用Python爬蟲(chóng)抓取網(wǎng)頁(yè)內(nèi)容?

爬蟲(chóng)流程
其實(shí)把網(wǎng)絡(luò)爬蟲(chóng)抽象開(kāi)來(lái)看,它無(wú)外乎包含如下幾個(gè)步驟
模擬請(qǐng)求網(wǎng)頁(yè)。模擬瀏覽器,打開(kāi)目標(biāo)網(wǎng)站。
獲取數(shù)據(jù)。打開(kāi)網(wǎng)站之后,就可以自動(dòng)化的獲取我們所需要的網(wǎng)站數(shù)據(jù)。
保存數(shù)據(jù)。拿到數(shù)據(jù)之后,需要持久化到本地文件或者數(shù)據(jù)庫(kù)等存儲(chǔ)設(shè)備中。
那么我們?cè)撊绾问褂?Python 來(lái)編寫(xiě)自己的爬蟲(chóng)程序呢,在這里我要重點(diǎn)介紹一個(gè) Python 庫(kù):Requests。
Requests 使用
Requests 庫(kù)是 Python 中發(fā)起 HTTP 請(qǐng)求的庫(kù),使用非常方便簡(jiǎn)單。
模擬發(fā)送 HTTP 請(qǐng)求
發(fā)送 GET 請(qǐng)求
當(dāng)我們用瀏覽器打開(kāi)豆瓣首頁(yè)時(shí),其實(shí)發(fā)送的最原始的請(qǐng)求就是 GET 請(qǐng)求
import requests
res = requests.get('
print(res)
print(type(res))
>>>
<Response [200]>
<class 'requests.models.Response'>

python爬蟲(chóng)如何分析一個(gè)將要爬取的網(wǎng)站?

首先,你去爬取一個(gè)網(wǎng)站,

你會(huì)清楚這個(gè)網(wǎng)站是屬于什么類(lèi)型的網(wǎng)站(新聞,論壇,貼吧等等)。

你會(huì)清楚你需要哪部分的數(shù)據(jù)。

你需要去想需要的數(shù)據(jù)你將如何編寫(xiě)表達(dá)式去解析。

你會(huì)碰到各種反爬措施,無(wú)非就是各種百度各種解決。當(dāng)爬取成本高于數(shù)據(jù)成本,你會(huì)選擇放棄。

你會(huì)利用你所學(xué)各種語(yǔ)言去解決你將要碰到的問(wèn)題,利用各種語(yǔ)言的client組件去請(qǐng)求你想要爬取的URL,獲取到HTML,利用正則,XPATH去解析你想要的數(shù)據(jù),然后利用sql存儲(chǔ)各類(lèi)數(shù)據(jù)庫(kù)。

4種Python爬蟲(chóng)(3. 微信小程序,如,超級(jí)猩猩)

目錄:
1. PC網(wǎng)頁(yè)爬蟲(chóng)
2. H5網(wǎng)頁(yè)爬蟲(chóng)
3. 微信小程序爬蟲(chóng)
4. 手機(jī)APP爬蟲(chóng)

爬取超級(jí)猩猩的課表,該平臺(tái)僅提供了微信小程序這一個(gè)途徑,前面兩種針對(duì)html網(wǎng)頁(yè)的爬取方式都不再適用。

采用抓包分析是我們制定方案的*步。

我用的Mac電腦,fiddler只有一個(gè)簡(jiǎn)化版,所以另找了Charles這個(gè)類(lèi)似的軟件。啟動(dòng)Charles的代理,在手機(jī)WIFI中設(shè)置好對(duì)應(yīng)的代理就可以開(kāi)抓了。但是,抓到的https包的內(nèi)容都是亂碼,咋辦?

Charles中提供了ssl證書(shū),在手機(jī)端安裝證書(shū)即可。推薦使用iPhone,直接安裝描述文件即可。Android手機(jī)必須使用系統(tǒng)版本在7.0以下的才行,7.0以上還需要反編譯什么的,太麻煩了。

很容易的定位到了超級(jí)猩猩微信小程序載入課表的后臺(tái)接口。拿這個(gè)URL在瀏覽器里訪問(wèn)試試,直接返回了json結(jié)果!超級(jí)猩猩很友好!

提取對(duì)應(yīng)的URL,放到瀏覽器中驗(yàn)證,也可以支持返回json包,剩下就是分析一下這個(gè)json的數(shù)據(jù)結(jié)構(gòu),按照需要的方式導(dǎo)出了。

直接通過(guò)接口的爬取效率非常高,幾秒鐘就拉取了*各個(gè)門(mén)店的排課,相當(dāng)舒心。(下圖的錄屏沒(méi)有進(jìn)行加速)

*一個(gè)挑戰(zhàn)就是對(duì)只有Android/iOS的APP端應(yīng)用數(shù)據(jù)的爬取。請(qǐng)看下一章

請(qǐng)點(diǎn)擊: <下一頁(yè)>

Python網(wǎng)頁(yè)解析庫(kù):用requests-html爬取網(wǎng)頁(yè)

Python 中可以進(jìn)行網(wǎng)頁(yè)解析的庫(kù)有很多,常見(jiàn)的有 和 lxml 等。在網(wǎng)上玩爬蟲(chóng)的文章通常都是介紹 這個(gè)庫(kù),我平常也是常用這個(gè)庫(kù),最近用 Xpath 用得比較多,使用 就不大習(xí)慣,很久之前就知道 Reitz 大神出了一個(gè)叫 Requests-HTML 的庫(kù),一直沒(méi)有興趣看,這回可算歹著機(jī)會(huì)用一下了。

使用 pip install requests-html 安裝,上手和 Reitz 的其他庫(kù)一樣,輕松簡(jiǎn)單:

這個(gè)庫(kù)是在 requests 庫(kù)上實(shí)現(xiàn)的,r 得到的結(jié)果是 Response 對(duì)象下面的一個(gè)子類(lèi),多個(gè)一個(gè) html 的屬性。所以 requests 庫(kù)的響應(yīng)對(duì)象可以進(jìn)行什么操作,這個(gè) r 也都可以。如果需要解析網(wǎng)頁(yè),直接獲取響應(yīng)對(duì)象的 html 屬性:

不得不膜拜 Reitz 大神太會(huì)組裝技術(shù)了。實(shí)際上 是繼承自 requests.Session 這個(gè)核心類(lèi),然后將 requests.Session 類(lèi)里的 requests 方法改寫(xiě),返回自己的一個(gè) 對(duì)象,這個(gè)類(lèi)又是繼承自 requests.Response,只是多加了一個(gè) _from_response 的方法來(lái)構(gòu)造實(shí)例:

之后在 里定義屬性方法 html,就可以通過(guò) html 屬性訪問(wèn)了,實(shí)現(xiàn)也就是組裝 PyQuery 來(lái)干。核心的解析類(lèi)也大多是使用 PyQuery 和 lxml 來(lái)做解析,簡(jiǎn)化了名稱(chēng),挺討巧的。

元素定位可以選擇兩種方式:

方法名非常簡(jiǎn)單,符合 Python 優(yōu)雅的風(fēng)格,這里不妨對(duì)這兩種方式簡(jiǎn)單的說(shuō)明:

定位到元素以后勢(shì)必要獲取元素里面的內(nèi)容和屬性相關(guān)數(shù)據(jù),獲取文本:

獲取元素的屬性:

還可以通過(guò)模式來(lái)匹配對(duì)應(yīng)的內(nèi)容:

這個(gè)功能看起來(lái)比較雞肋,可以深入研究?jī)?yōu)化一下,說(shuō)不定能在 github 上混個(gè)提交。

除了一些基礎(chǔ)操作,這個(gè)庫(kù)還提供了一些人性化的操作。比如一鍵獲取網(wǎng)頁(yè)的所有超鏈接,這對(duì)于整站爬蟲(chóng)應(yīng)該是個(gè)福音,URL 管理比較方便:

內(nèi)容頁(yè)面通常都是分頁(yè)的,一次抓取不了太多,這個(gè)庫(kù)可以獲取分頁(yè)信息:

結(jié)果如下:

通過(guò)迭代器實(shí)現(xiàn)了智能發(fā)現(xiàn)分頁(yè),這個(gè)迭代器里面會(huì)用一個(gè)叫 _next 的方法,貼一段源碼感受下:

通過(guò)查找 a 標(biāo)簽里面是否含有指定的文本來(lái)判斷是不是有下一頁(yè),通常我們的下一頁(yè)都會(huì)通過(guò) 下一頁(yè) 或者 加載更多 來(lái)引導(dǎo),他就是利用這個(gè)標(biāo)志來(lái)進(jìn)行判斷。默認(rèn)的以列表形式存在全局: ['next','more','older'] 。我個(gè)人認(rèn)為這種方式非常不靈活,幾乎沒(méi)有擴(kuò)展性。 感興趣的可以往 github 上提交代碼優(yōu)化。

也許是考慮到了現(xiàn)在 js 的一些異步加載,這個(gè)庫(kù)支持 js 運(yùn)行時(shí),官方說(shuō)明如下:

使用非常簡(jiǎn)單,直接調(diào)用以下方法:

*次使用的時(shí)候會(huì)下載 Chromium,不過(guò)國(guó)內(nèi)你懂的,自己想辦法去下吧,就不要等它自己下載了。render 函數(shù)可以使用 js 腳本來(lái)操作頁(yè)面,滾動(dòng)操作單獨(dú)做了參數(shù)。這對(duì)于上拉加載等新式頁(yè)面是非常友好的。

如何利用python爬取網(wǎng)頁(yè)內(nèi)容

利用python爬取網(wǎng)頁(yè)內(nèi)容需要用scrapy(爬蟲(chóng)框架),但是很簡(jiǎn)單,就三步

定義item類(lèi)

開(kāi)發(fā)spider類(lèi)

開(kāi)發(fā)pipeline

想學(xué)習(xí)更深的爬蟲(chóng),可以用《瘋狂python講義》

用python爬取網(wǎng)頁(yè)數(shù)據(jù)

用python爬取網(wǎng)頁(yè)數(shù)據(jù)就三步,用scrapy(爬蟲(chóng)框架)
1. 定義item類(lèi)
2. 開(kāi)發(fā)spider類(lèi)
3. 開(kāi)發(fā)pipeline
如果有不會(huì)的,可以看一看《瘋狂python講義》

溫馨提示:為不影響您的學(xué)業(yè),來(lái)校區(qū)前請(qǐng)先電話咨詢(xún),方便我校安排相關(guān)的專(zhuān)業(yè)老師為您解答
相關(guān)資料
  • 作者最新文章
  • 在線報(bào)名
申請(qǐng)?jiān)嚶?tīng)課程

只要一個(gè)電話
我們免費(fèi)為您回電

姓名不能為空
手機(jī)號(hào)格式錯(cuò)誤