對于大多數朋友而言,爬蟲絕對是學習 python 的最好的起手和入門方式。因為爬蟲思維模式固定,編程模式也相對簡單,一般在細節處理上積累一些經驗都可以成功入門。本文想針對某一網頁對 python 基礎爬蟲的兩大解析庫( BeautifulSoup 和 lxml )和幾種信息提取實現方法進行分析,以開 python 爬蟲之初見。
基礎爬蟲的固定模式
筆者這里所談的基礎爬蟲,指的是不需要處理像異步加載、驗證碼、代理等高階爬蟲技術的爬蟲方法。一般而言,基礎爬蟲的兩大請求庫 urllib 和 requests 中 requests 通常為大多數人所鐘愛,當然 urllib 也功能齊全。兩大解析庫 BeautifulSoup 因其強大的 HTML 文檔解析功能而備受青睞,另一款解析庫 lxml 在搭配 xpath 表達式的基礎上也效率提高。就基礎爬蟲來說,兩大請求庫和兩大解析庫的組合方式可以依個人偏好來選擇。
筆者喜歡用的爬蟲組合工具是:
requests + BeautifulSoup requests + lxml同一網頁爬蟲的四種實現方式
筆者以騰訊新聞首頁的新聞信息抓取為例。
首頁外觀如下:
比如說我們想抓取每個新聞的標題和鏈接,并將其組合為一個字典的結構打印出來。首先查看 HTML 源碼確定新聞標題信息組織形式。
可以目標信息存在于 em 標簽下 a 標簽內的文本和 href 屬性中??芍苯永?nbsp; requests 庫構造請求,并用 BeautifulSoup 或者 lxml 進行解析。
方式一: requests + BeautifulSoup + select css選擇器
# select method 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 })
很常規的處理方式,抓取效果如下:
方式二: requests + BeautifulSoup + find_all 進行信息提取
# find_all method 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 })
新聞熱點
疑難解答