Python爬蟲之爬取靜態(tài)網(wǎng)頁

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

http基本知識

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

http基本流程

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

http請求過程.png

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

通過requests發(fā)起http請求

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

發(fā)起請求

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'
}
# 例子的url
url = 'https://voice.hupu.com/nba' # 虎撲nba新聞
# 利用requests對象的get方法,對指定的url發(fā)起請求
# 該方法會返回一個Response對象
res = requests.get(url, headers=headers)
# 通過Response對象的text方法獲取網(wǎng)頁的文本信息
print(res.text)

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

通過BeautifulSoup提取網(wǎng)頁信息

BeautifulSoup庫提供了很多解析html的方法,可以幫助我們很方便地提取我們需要的內容。我們這里說的BeautifulSoup指的是bs4。當我們成功抓取網(wǎng)頁之后,就可以通過BeautifulSoup對象對網(wǎng)頁內容進行解析。在BeautifulSoup中,我們最常用的方法就是find()方法和find_all()方法,借助于這兩個方法,可以輕松地獲取到我們需要的標簽或者標簽組。關于其他的方法,可以參考bs4的官方文檔:BeautifulSoup
find()方法和find_all()方法的用法如下:

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

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

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

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

靜態(tài)網(wǎng)頁爬蟲實戰(zhàn)

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

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/65.0.3325.146 Safari/537.36'
}
url = 'https://voice.hupu.com/nba' # 虎撲nba新聞
res = requests.get(url, headers=headers)

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

虎撲nba新聞首頁.png

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

DOM分析結果.png

本著從特殊到一般的思路進行搜索,通過一個新聞信息進行分析,找出所有新聞的共性。通過分析發(fā)現(xiàn),我們需要的標題信息是一個a標簽對應的內容,然后我們需要向上進行搜索,可見標題信息的上一級是一個h4標簽,h4標簽的上一級是一個class屬性值為list-hd的div標簽,這個div的上一級是一個li標簽。用通過同樣的思路對來源信息進行分析,我們發(fā)現(xiàn),新聞標題信息和新聞來源信息都在一個li標簽下面,進一步可以發(fā)現(xiàn),其他的新聞信息都在這類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的div
news_list = soup.find('div', {'class': 'news-list'})
# 找出news_list下的所有l(wèi)i標簽
news = news_list.find_all('li')
news_titles = []
news_source = []

# 遍歷news
for 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

爬取結果如下圖:

爬取結果.png

如有錯誤,還請指正

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 聲明:本文講解的實戰(zhàn)內容,均僅用于學習交流,請勿用于任何商業(yè)用途! 一、前言 強烈建議:請在電腦的陪同下,閱讀本文...
    Bruce_Szh閱讀 13,018評論 6 28
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,680評論 19 139
  • 在之前一篇抓取漫畫圖片的文章里,通過實現(xiàn)一個簡單的Python程序,遍歷所有漫畫的url,對請求所返回的html源...
    msq3閱讀 13,033評論 14 88
  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,843評論 6 427
  • 沒有什么特別的地方,因為記性特別不好,所以想要記錄下來。 2016年7月18號,在科目三的練習途中,一...
    花花不愛醬閱讀 382評論 10 9

友情鏈接更多精彩內容