Python爬蟲之爬取靜態網頁

Python爬蟲之爬取靜態網頁

4 人贊了文章

所謂網路爬蟲,通俗的講,就是通過向我們需要的URL發出http請求,獲取該URL對應的http報文主體內容,之後提取該報文主體中我們所需要的信息。所以,想要學習python爬蟲,需要具備一些http的基礎知識,熟悉http請求的基本過程。在本文中,首先會簡單的介紹一下http請求的基本流程,之後介紹python的requests庫,requests庫可以方便地幫助我們完成http請求。因為本文介紹的是爬取靜態網頁,所以請求相應的URL之後,我們需要對其中的信息進行提取,這時候就需要BeautifulSoup庫,它可以輕鬆的找出我們需要的信息,當然,有時候藉助正則表達式會更快地幫助我們抽取網頁中我們需要的信息。最後,我們會通過一個例子,對靜態網頁的爬取過程做一個具體的實現。

http基本知識

當我們通過瀏覽器訪問指定的URL時,需要遵守http協議。本節將介紹一些關於http的基礎知識。

http基本流程

我們打開一個網頁的過程,就是一次http請求的過程。這個過程中,我們自己的主機充當著客戶機的作用,而充當客戶端的是瀏覽器。我們輸入的URL對應著網路中某台伺服器上面的資源,伺服器接收到客戶端發出的http請求之後,會給客戶端一個響應,響應的內容就是請求的URL對應的內容,當客戶端接收到伺服器的響應時,我們就可以在瀏覽器上看見請求的信息了。這一過程如下圖所示:

http請求過程

知道了http的基本請求過程,就可以通過代碼進行體驗了。

通過requests發起http請求

我們可以通過python的requests模塊很方便的發起http請求。requests模塊是第三方模塊,安裝完成之後直接import就能使用。下面介紹一些簡單的用法,更多的使用方法可以參考如下鏈接:

requests{:target="_blank"}

發起請求

import requests# 請求的首部信息headers = { user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36}# 例子的urlurl = https://voice.hupu.com/nba # 虎撲nba新聞# 利用requests對象的get方法,對指定的url發起請求# 該方法會返回一個Response對象res = requests.get(url, headers=headers)# 通過Response對象的text方法獲取網頁的文本信息print(res.text)

上面的代碼中,我們向虎撲的伺服器發送了一個get請求,獲取虎撲首頁的nba新聞。headers參數指的是http請求的首部信息,我們請求的url對應的資源是虎撲nba新聞的首頁。獲取到對應的網頁資源之後,我們需要對其中的信息進行提取。

通過BeautifulSoup提取網頁信息

BeautifulSoup庫提供了很多解析html的方法,可以幫助我們很方便地提取我們需要的內容。我們這裡說的BeautifulSoup指的是bs4。當我們成功抓取網頁之後,就可以通過BeautifulSoup對象對網頁內容進行解析。在BeautifulSoup中,我們最常用的方法就是find()方法和findall()方法,藉助於這兩個方法,可以輕鬆地獲取到我們需要的標籤或者標籤組。關於其他的方法,可以參考bs4的官方文檔:

BeautifulSoup{:target="blank"}

find()方法和find_all()方法的用法如下:

find(name , attrs , recursive , string , **kwargs )# find_all()方法將返迴文檔中符合條件的所有tag,find_all(name , attrs , recursive , string , **kwargs )

大多情況下我們只會用到前兩個參數。具體用法如下:

from bs4 import BeautifulSoup# BeautifulSoup對象接收html文檔字元串# lxml是html解析器soup = Beautiful(res.text, lxml)# 下面的方法找出了所有class為hello的span標籤# 並將所有的結果都放入一個list返回tags = soup.find_all(span, {class: hello})

在我們真正開始爬蟲的時候,還需要對網頁的DOM結構進行分析,這樣才能知道應該如何提取我們需要的信息,下面將會結合一個例子對DOM結構進行分析。

靜態網頁爬蟲實戰

在本節的例子裡面,我們將對虎撲nba首頁所有新聞的標題和來源進行爬取。首先我們導入我們所需要的requests和bs4模塊,然後向目標url發出get請求獲取首頁的html文檔。具體如下:

import requestsfrom bs4 import BeautifulSoupheaders = { user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36}url = https://voice.hupu.com/nba # 虎撲nba新聞res = requests.get(url, headers=headers)

我們的目的是提取新聞的標題和來源,所以下一步需要對新聞首頁的DOM結構進行分析。給出新聞首頁的截圖如下:

虎撲nba新聞首頁

畫紅線的部分就是我們要爬取的信息,下面通過chrome控制台對DOM結構進行分析。結果如下圖:

DOM分析結果

本著從特殊到一般的思路進行搜索,通過一個新聞信息進行分析,找出所有新聞的共性。通過分析發現,我們需要的標題信息是一個a標籤對應的內容,然後我們需要向上進行搜索,可見標題信息的上一級是一個h4標籤,h4標籤的上一級是一個class屬性值為list-hd的div標籤,這個div的上一級是一個li標籤。用通過同樣的思路對來源信息進行分析,我們發現,新聞標題信息和新聞來源信息都在一個li標籤下面,進一步可以發現,其他的新聞信息都在這類li標籤下,這些li標籤都在class屬性值為news-list的div標籤下,而且整片文檔中,class屬性值為news-list的div標籤也只有這一個。

因此,我們可以從這個div入手,找到這個標籤下的每一個li標籤,對每一個li標籤進行遍歷,每一個li標籤下有唯一的h4標籤,該標籤的文本即為我們要找的標題信息;另外,每一個li標籤下也僅僅有一個class屬性值為comeFrom的span標籤,該span標籤下的a標籤對應的文本就是來源信息。分析結束之後,我們就可以通過bs4進行信息提取了。代碼如下:

soup = BeautifulSoup(res.text, lxml)# 找出class屬性值為news-list的divnews_list = soup.find(div, {class: news-list})# 找出news_list下的所有li標籤news = news_list.find_all(li)news_titles = []news_source = []# 遍歷newsfor i in news: try: # 提取新聞標題 title = i.find(h4).get_text().strip() # 提取新聞來源 source = i.find(span, {class: comeFrom}).find(a).get_text().strip() # 存儲爬取結果 news_titles.append(title) news_source.append(source) print(新聞標題:, title) print(新聞來源:, source) print() except AttributeError as e: continue

爬取結果如下圖:

爬取結果

如有錯誤,還請指正

推薦閱讀:

通過requests、BeautifulSoup下載四虎網站上的所有美女圖片
爬取貓眼實時票房數據
入門Python爬蟲需要掌握哪些技能和知識點?
開發經驗高達8年的大神分享爬蟲入門。
美女爬蟲器,簡單版

TAG:python爬蟲 | Python入門 |