對於大多數朋友而言,爬蟲絕對是學習python的最好的起手和入門方式。因為爬蟲思維模式固定,編程模式也相對簡單,一般在細節處理上積累一些經驗都可以成功入門。本文想針對某一網頁對python基礎爬蟲的兩大解析庫(BeautifulSoup和lxml)和幾種信息提取實現方法進行分析,以開python爬蟲之初見。
基礎爬蟲的固定模式筆者這裡所談的基礎爬蟲,指的是不需要處理像異步加載、驗證碼、代理等高階爬蟲技術的爬蟲方法。一般而言,基礎爬蟲的兩大請求庫urllib和requests中requests通常為大多數人所鍾愛,當然urllib也功能齊全。兩大解析庫BeautifulSoup因其強大的HTML文檔解析功能而備受青睞,另一款解析庫lxml在搭配xpath表達式的基礎上也效率提高。就基礎爬蟲來說,兩大請求庫和兩大解析庫的組合方式可以依個人偏好來選擇。
筆者喜歡用的爬蟲組合工具是:
requests+BeautifulSoup
requests+lxml
同一網頁爬蟲的四種實現方式
筆者以騰訊新聞首頁的新聞信息抓取為例。
首頁外觀如下:
比如說我們想抓取每個新聞的標題和連結,並將其組合為一個字典的結構列印出來。首先查看HTML源碼確定新聞標題信息組織形式。
可以目標信息存在於em標籤下a標籤內的文本和href屬性中。可直接利用requests庫構造請求,並用BeautifulSoup或者lxml進行解析。
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}url = 'http://news.qq.com/'
Soup = BeautifulSoup(requests.get(url=url, headers=headers).text.encode("utf-8"), 'lxml')em = Soup.select('em[class="f14 l24"] a')
for i in em: title = i.get_text() link = i['href'] print({'標題': title,
'連結': link })
很常規的處理方式,抓取效果如下:
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}url = 'http://news.qq.com/'
Soup = BeautifulSoup(requests.get(url=url, headers=headers).text.encode("utf-8"), 'lxml')em = Soup.find_all('em', attrs={'class': 'f14 l24'})for i in em: title = i.a.get_text() link = i.a['href'] print({'標題': title,
'連結': link })
同樣是requests+BeautifulSoup的爬蟲組合,但在信息提取上採用了find_all的方式。效果如下:
import requests
from lxml import etreeheaders = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}url = 'http://news.qq.com/'
html = requests.get(url = url, headers = headers)con = etree.HTML(html.text)title = con.xpath('//em[@class="f14 l24"]/a/text()')link = con.xpath('//em[@class="f14 l24"]/a/@href')
for i in zip(title, link): print({'標題': i[0],
'連結': i[1] })
使用lxml庫下的etree模塊進行解析,然後使用xpath表達式進行信息提取,效率要略高於BeautifulSoup+select方法。這裡對兩個列表的組合採用了zip方法。效果如下:
import requests
import lxml.html as HTMLheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}url = 'http://news.qq.com/'
con = HTML.fromstring(requests.get(url = url, headers = headers).text)title = con.xpath('//em[@class="f14 l24"]/a/text()')link = con.xpath('//em[@class="f14 l24"]/a/@href')
for i in zip(title, link): print({'標題': i[0],'連結': i[1] })
跟方法三類似,只是在解析上使用了lxml庫下的html.fromstring模塊。抓取效果如下:
很多人覺得爬蟲有點難以掌握,因為知識點太多,需要懂前端、需要python熟練、還需要懂資料庫,更不用說正則表達式、XPath表達式這些。其實對於一個簡單網頁的數據抓取,不妨多嘗試幾種抓取方案,舉一反三,也更能對python爬蟲有較深的理解。長此以往,對於各類網頁結構都有所涉獵,自然經驗豐富,水到渠成。
往期精彩:
談談過擬合
一個統計方向畢業生的2017年數據科學從業之路總結
以虎嗅網4W+文章的文本挖掘為例,展現數據分析的一整套流程
gganimate:構建R語言可視化gif動圖
使用jupyter notebook搭建數據科學最佳交互式環境
R Markdown|可能是你數據分析報告最好的解決方案
如何寫出整潔規範的R代碼?是時候討論一下代碼規範性了
[譯]為什麼R語言是當今最值得學習的數據科學語言
一個數據科學從業者的學習歷程