用Python寫爬蟲工具在如今是一種司空見慣的事情,每一個人都但願可以寫一段程序去互聯網上扒一點資料下來,用於數據分析或者乾點別的事情。html
咱們知道,爬蟲的原理無非是把目標網址的內容下載下來存儲到內存中,這個時候它的內容實際上是一堆HTML,而後再對這些HTML內容進行解析,按照本身的想法提取出想要的數據,因此今天咱們主要來說四種在Python中解析網頁HTML內容的方法,各有千秋,適合在不一樣的場合下使用。程序員
首先咱們隨意找到一個網址,這時我腦子裏閃過了豆瓣這個網站。嗯,畢竟是用Python構建的網站,那就拿它來作示範吧。web
咱們找到了豆瓣的Python爬蟲小組主頁,看起來長成下面這樣。正則表達式
讓咱們用瀏覽器開發者工具看看HTML代碼,定位到想要的內容上,咱們想要把討論組裏的帖子標題和連接都給扒出來。瀏覽器
經過分析,咱們發現實際上咱們想要的內容在整個HTML代碼的 這個區域裏,那咱們只須要想辦法把這個區域內的內容拿出來就差很少了。app
如今開始寫代碼。工具
1: 正則表達式大法網站
正則表達式一般被用來檢索、替換那些符合某個模式的文本,因此咱們能夠利用這個原理來提取咱們想要的信息。ui
參考如下代碼。編碼
在代碼第6行和第7行,須要手動指定一下header的內容,裝做本身這個請求是瀏覽器請求,不然豆瓣會視爲咱們不是正常請求會返回HTTP 418錯誤。
在第7行咱們直接用requests這個庫的get方法進行請求,獲取到內容後須要進行一下編碼格式轉換,一樣是由於豆瓣的頁面渲染機制的問題,正常狀況下,直接獲取requests content的內容便可。
Python模擬瀏覽器發起請求並解析內容代碼:
url = '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')
正則的好處是編寫麻煩,理解不容易,可是匹配效率很高,不過期至今日有太多現成的HTMl內容解析庫以後,我我的不太建議再手動用正則來對內容進行匹配了,費時費力。
主要解析代碼:
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庫的網紅程序員 Kenneth Reitz,他在requests的基礎上加上了對html內容的解析,就變成了requests-html這個庫了。
下面咱們來看看範例:
我喜歡用requests-html來解析內容的緣由是由於做者依據幫我高度封裝過了,連請求返回內容的編碼格式轉換也自動作了,徹底可讓個人代碼邏輯簡單直接,更專一於解析工做自己。
主要解析代碼:
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解析內容一樣須要將請求和解析分開,從代碼清晰程度來說還將就,不過在作複雜的解析時代碼略顯繁瑣,整體來說能夠用,看我的喜愛吧。
安裝途徑: pip install beautifulsoup4
4: lxml的XPath
lxml這個庫同時 支持HTML和XML的解析,支持XPath解析方式,解析效率挺高,不過咱們須要熟悉它的一些規則語法才能使用,例以下圖這些規則。
來看看如何用XPath解析內容。
主要解析代碼:
content = doc.xpath("//table[@class='olt']/tr/td/a")
如上圖,XPath的解析語法稍顯複雜,不過熟悉了語法的話也不失爲一種優秀的解析手段,由於。
安裝途徑: pip install lxml
四種方式總結
正則表達式匹配不推薦,由於已經有不少現成的庫能夠直接用,不須要咱們去大量定義正則表達式,還無法複用,在此僅做參考瞭解。
BeautifulSoup是基於DOM的方式,簡單的說就是會在解析時把整個網頁內容加載到DOM樹裏,內存開銷和耗時都比較高,處理海量內容時不建議使用。不過BeautifulSoup不須要結構清晰的網頁內容,由於它能夠直接find到咱們想要的標籤,若是對於一些HTML結構不清晰的網頁,它比較適合。
XPath是基於SAX的機制來解析,不會像BeautifulSoup去加載整個內容到DOM裏,而是基於事件驅動的方式來解析內容,更加輕巧。不過XPath要求網頁結構須要清晰,並且開發難度比DOM解析的方式高一點,推薦在須要解析效率時使用。
requests-html 是比較新的一個庫,高度封裝且源碼清晰,它直接整合了大量解析時繁瑣複雜的操做,同時支持DOM解析和XPath解析兩種方式,靈活方便,這是我目前用得較多的一個庫。
除了以上介紹到幾種網頁內容解析方式以外還有不少解析手段,在此不一一進行介紹了。
寫一個爬蟲,最重要的兩點就是如何抓取數據,如何解析數據,咱們要活學活用,在不一樣的時候利用最有效的工具去完成咱們的目的。