最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python爬蟲解析網(wǎng)頁的4種方式實例及原理解析

 更新時間:2019年12月30日 09:40:33   作者:Python學(xué)習(xí)啊  
這篇文章主要介紹了Python爬蟲解析網(wǎng)頁的4種方式實例及原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

這篇文章主要介紹了Python爬蟲解析網(wǎng)頁的4種方式實例及原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

用Python寫爬蟲工具在現(xiàn)在是一種司空見慣的事情,每個人都希望能夠?qū)懸欢纬绦蛉セヂ?lián)網(wǎng)上扒一點資料下來,用于數(shù)據(jù)分析或者干點別的事情。​

我們知道,爬蟲的原理無非是把目標網(wǎng)址的內(nèi)容下載下來存儲到內(nèi)存中,這個時候它的內(nèi)容其實是一堆HTML,然后再對這些HTML內(nèi)容進行解析,按照自己的想法提取出想要的數(shù)據(jù),所以今天我們主要來講四種在Python中解析網(wǎng)頁HTML內(nèi)容的方法,各有千秋,適合在不同的場合下使用。

首先我們隨意找到一個網(wǎng)址,這時我腦子里閃過了豆瓣這個網(wǎng)站。嗯,畢竟是用Python構(gòu)建的網(wǎng)站,那就拿它來做示范吧。

我們找到了豆瓣的Python爬蟲小組主頁,看起來長成下面這樣。

讓我們用瀏覽器開發(fā)者工具看看HTML代碼,定位到想要的內(nèi)容上,我們想要把討論組里的帖子標題和鏈接都給扒出來。

通過分析,我們發(fā)現(xiàn)實際上我們想要的內(nèi)容在整個HTML代碼的 這個區(qū)域里,那我們只需要想辦法把這個區(qū)域內(nèi)的內(nèi)容拿出來就差不多了。

現(xiàn)在開始寫代碼。

1: 正則表達式大法

正則表達式通常被用來檢索、替換那些符合某個模式的文本,所以我們可以利用這個原理來提取我們想要的信息。

參考以下代碼。

在代碼第6行和第7行,需要手動指定一下header的內(nèi)容,裝作自己這個請求是瀏覽器請求,否則豆瓣會視為我們不是正常請求會返回HTTP 418錯誤。

在第7行我們直接用requests這個庫的get方法進行請求,獲取到內(nèi)容后需要進行一下編碼格式轉(zhuǎn)換,同樣是因為豆瓣的頁面渲染機制的問題,正常情況下,直接獲取requests content的內(nèi)容即可。

Python模擬瀏覽器發(fā)起請求并解析內(nèi)容代碼:

rl = 'https://www.douban.com/group/491607/'headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0"}response = requests.get(url=url,headers=headers).content.decode('utf-8') 

正則的好處是編寫麻煩,理解不容易,但是匹配效率很高,不過時至今日有太多現(xiàn)成的HTMl內(nèi)容解析庫之后,我個人不太建議再手動用正則來對內(nèi)容進行匹配了,費時費力。

主要解析代碼:

re_div = r'<table\s+class=\"olt\">[\W|\w]+</table>'pattern = re.compile(re_div)content = re.findall(pattern, str(response))re_link = r'<a .*?>(.*?)</a>'mm = re.findall(re_link, str(content), re.S|re.M)urls=re.findall(r"<a.*?href=.*?<\/a>", str(content), re.I|re.S|re.M) 

2: requests-html

這個庫其實是我個人最喜歡的庫,作則是編寫requests庫的網(wǎng)紅程序員 Kenneth Reitz,他在requests的基礎(chǔ)上加上了對html內(nèi)容的解析,就變成了requests-html這個庫了。

下面我們來看看范例:

我喜歡用requests-html來解析內(nèi)容的原因是因為作者依據(jù)幫我高度封裝過了,連請求返回內(nèi)容的編碼格式轉(zhuǎn)換也自動做了,完全可以讓我的代碼邏輯簡單直接,更專注于解析工作本身。

主要解析代碼:

links = response.html.find('table.olt', first=True).find('a') 

安裝途徑: pip install requests-html

3: BeautifulSoup

大名鼎鼎的 BeautifulSoup庫,出來有些年頭了,在Pyhton的HTML解析庫里屬于重量級的庫,其實我評價它的重量是指比較臃腫,大而全。

還是來先看看代碼。

soup = BeautifulSoup(response, 'html.parser')links = soup.findAll("table", {"class": "olt"})[0].findAll('a') 

BeautifulSoup解析內(nèi)容同樣需要將請求和解析分開,從代碼清晰程度來講還將就,不過在做復(fù)雜的解析時代碼略顯繁瑣,總體來講可以用,看個人喜好吧。

安裝途徑: pip install beautifulsoup4

4: lxml的XPath

lxml這個庫同時 支持HTML和XML的解析,支持XPath解析方式,解析效率挺高,不過我們需要熟悉它的一些規(guī)則語法才能使用,例如下圖這些規(guī)則。

來看看如何用XPath解析內(nèi)容。

主要解析代碼:

content = doc.xpath("http://table[@class='olt']/tr/td/a") 

如上圖,XPath的解析語法稍顯復(fù)雜,不過熟悉了語法的話也不失為一種優(yōu)秀的解析手段,因為。

安裝途徑: pip install lxml

四種方式總結(jié)

正則表達式匹配不推薦,因為已經(jīng)有很多現(xiàn)成的庫可以直接用,不需要我們?nèi)ゴ罅慷x正則表達式,還沒法復(fù)用,在此僅作參考了解。

BeautifulSoup是基于DOM的方式,簡單的說就是會在解析時把整個網(wǎng)頁內(nèi)容加載到DOM樹里,內(nèi)存開銷和耗時都比較高,處理海量內(nèi)容時不建議使用。不過BeautifulSoup不需要結(jié)構(gòu)清晰的網(wǎng)頁內(nèi)容,因為它可以直接find到我們想要的標簽,如果對于一些HTML結(jié)構(gòu)不清晰的網(wǎng)頁,它比較適合。

XPath是基于SAX的機制來解析,不會像BeautifulSoup去加載整個內(nèi)容到DOM里,而是基于事件驅(qū)動的方式來解析內(nèi)容,更加輕巧。不過XPath要求網(wǎng)頁結(jié)構(gòu)需要清晰,而且開發(fā)難度比DOM解析的方式高一點,推薦在需要解析效率時使用。

requests-html 是比較新的一個庫,高度封裝且源碼清晰,它直接整合了大量解析時繁瑣復(fù)雜的操作,同時支持DOM解析和XPath解析兩種方式,靈活方便,這是我目前用得較多的一個庫。

除了以上介紹到幾種網(wǎng)頁內(nèi)容解析方式之外還有很多解析手段,在此不一一進行介紹了。

寫一個爬蟲,最重要的兩點就是如何抓取數(shù)據(jù),如何解析數(shù)據(jù),我們要活學(xué)活用,在不同的時候利用最有效的工具去完成我們的目的。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解python中DRF框架的數(shù)據(jù)校驗方式

    詳解python中DRF框架的數(shù)據(jù)校驗方式

    這篇文章主要為大家詳細介紹了python中DRF框架的數(shù)據(jù)校驗方式,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-10-10
  • Python如何拆分ZIP文件

    Python如何拆分ZIP文件

    這篇文章主要介紹了Python如何拆分ZIP文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python實現(xiàn)可設(shè)置持續(xù)運行時間、線程數(shù)及時間間隔的多線程異步post請求功能

    Python實現(xiàn)可設(shè)置持續(xù)運行時間、線程數(shù)及時間間隔的多線程異步post請求功能

    這篇文章主要介紹了Python實現(xiàn)可設(shè)置持續(xù)運行時間、線程數(shù)及時間間隔的多線程異步post請求功能,涉及Python網(wǎng)絡(luò)請求的創(chuàng)建、發(fā)送、響應(yīng)、處理等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • 詳解Python解決抓取內(nèi)容亂碼問題(decode和encode解碼)

    詳解Python解決抓取內(nèi)容亂碼問題(decode和encode解碼)

    這篇文章主要介紹了Python解決抓取內(nèi)容亂碼問題(decode和encode解碼),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • PyCharm中的庫Flask安裝以及如何使用詳解

    PyCharm中的庫Flask安裝以及如何使用詳解

    在學(xué)習(xí)flask的過程中關(guān)于flask安裝的過程中遇到了很多的問題,通過自己的摸索和搜尋最終終于能夠成功運行,下面這篇文章主要給大家介紹了關(guān)于PyCharm中庫Flask安裝以及如何使用的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • python全面解析接口返回數(shù)據(jù)

    python全面解析接口返回數(shù)據(jù)

    這篇文章主要介紹了python接口返回數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • python3.x上post發(fā)送json數(shù)據(jù)

    python3.x上post發(fā)送json數(shù)據(jù)

    這篇文章通過代碼示例給大家講述了python3.x上post發(fā)送json數(shù)據(jù)的詳細方法,一起學(xué)習(xí)下。
    2018-03-03
  • Python?SQLAlchemy庫的實現(xiàn)示例

    Python?SQLAlchemy庫的實現(xiàn)示例

    SQLAlchemy庫是一個強大的工具,為開發(fā)人員提供了便捷的方式來處理與數(shù)據(jù)庫的交互,本文主要介紹了Python?SQLAlchemy庫的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • 使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò)的操作指南

    使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò)的操作指南

    PyTorch 是一個在研究領(lǐng)域廣泛使用的深度學(xué)習(xí)框架,提供了大量的靈活性和效率,本文將向你介紹如何使用 PyTorch 構(gòu)建你的第一個神經(jīng)網(wǎng)絡(luò),感興趣的小伙伴可以參考閱讀
    2023-07-07
  • Django 限制用戶訪問頻率的中間件的實現(xiàn)

    Django 限制用戶訪問頻率的中間件的實現(xiàn)

    這篇文章主要介紹了Django 限制用戶訪問頻率的中間件的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08

最新評論

南漳县| 泽库县| 名山县| 土默特左旗| 宜都市| 昭觉县| 南溪县| 东乌| 滁州市| 霍山县| 霍州市| 房产| 怀来县| 喀喇沁旗| 尖扎县| 洪湖市| 望奎县| 栖霞市| 房产| 云阳县| 榆树市| 遵义县| 云霄县| 龙江县| 黎平县| 巴林右旗| 花莲市| 黄陵县| 合川市| 明星| 琼结县| 桐庐县| 扎鲁特旗| 宜州市| 蒙城县| 云龙县| 稷山县| 开封县| 新绛县| 梁山县| 桃园市|