1. 程式人生 > >【1】python爬蟲入門,利用bs4以及requests獲取靜態網頁

【1】python爬蟲入門,利用bs4以及requests獲取靜態網頁

注:本文僅適用於爬蟲初級入門者,並不涉及太多技術本質

感謝您閱讀此文。最近放假在家,閒時無聊,開始入門了python爬蟲,可以完成一些基本的資料爬取(對於一些反爬取例如JS渲染,介面加密等頁面仍然處於學習之中),本文就是簡單總結最近已熟練掌握的爬取靜態網頁的方法。

若是從未接觸過相關知識的朋友,在開始之前,需至少掌握python入門知識,詳見廖雪峰的官方網站,另外若要深入探究爬蟲的本質以及希望更好地爬取所需資料的朋友,那麼就需要熟悉web前端知識(HTML,JS,CSS,jQ,Ajax等),在此文中並不會過深涉及,故不加闡述。

接下來簡單介紹一下BeautifulSoup庫和requests庫(另外還需安裝lxml庫):

Beautiful Soup是python的一個庫,最主要的功能是從網頁抓取資料。官方解釋如下: Beautiful Soup提供一些簡單的、python式的函式用來處理導航、搜尋、修改分析樹等功能。它是一個工具箱,通過解析文件為使用者提供需要抓取的資料,因為簡單,所以不需要多少程式碼就可以寫出一個完整的應用程式。

Beautiful Soup自動將輸入文件轉換為Unicode編碼,輸出文件轉換為utf-8編碼。你不需要考慮編碼方式,除非文件本身就沒有指定一個編碼方式,這時,Beautiful Soup就不能自動識別編碼方式了。詳見BeautifulSoup4.2.0官方文件

Requests 是用Python語言編寫,基於 urllib 的 HTTP 庫。它比 urllib 更加方便,可以節約我們大量的工作,可以滿足 HTTP 測試需求。可參照

Python第三方庫request詳解這篇文章。

1.首先,匯入我們所需的庫:

from bs4 import BeautifulSoup
import requests
2.接著我們用url確定我們的目標網址:
url='http://study.163.com/curricula/cs.htm'
URL是統一資源定位符,基本URL包含協議、伺服器名稱(或IP地址)、路徑和檔名,如“協議://授權/路徑?查詢”

而我們載入網頁的過程基本就是客戶端向伺服器以某一方式傳送request,而伺服器處理後,會給我們response

而請求方式有多種:get,post,head,put,options等等,而一般常用的只有get和post兩種,對於一般的網頁,我們通常只使用get方式即可。

get和post的區別-知乎
3.接下來,我們開始利用requests.get()來獲取網頁並利用bs4解析網頁:

response=requests.get(url)
soup=BeautifulSoup(response.text,'lxml')

soup=BeautifulSoup(html #目標網址文字內容# ,’lxml’#解析器# )

4.此時,我們就需要人工到目標網站上尋找自己想要的資料的位置:

基本步驟:進入網頁後,開啟開發者工具(F12),or右鍵點選網頁檢查,or直接找到需要的內容右鍵檢查


我們希望把計算機專業在大學本科階段的所有課程全部爬取下來,那麼我們就要找到所需資料的定位位置,複製它的定位路徑無論是類名還是selector路徑等都可以,關鍵是要滿足我們可以通過它來準確找到所需要的資料。

而在獲取同一類資料時,我們要注意觀察他們之間的標籤等有沒有共同點,分析出後即可利用select()統一篩選放入list。

而常用的路徑描述有兩種:CSS Selector和XPATH,而soup.select()不支援XPATH。select方法詳解

經過分析,我們發現所有課程有兩種不同的特徵路徑,利用這兩種特徵路徑找到路徑,我們就可以篩選出所需資料了:

data0=soup.select('span.f-thide.cataName.f-ib')
data1=soup.select('#j-package > div > div > div > a')
5.最後我們需要把資料打印出來:
for x in data0:
    print(x.get_text())
for y in data1:
    print(y.get_text())
此處由於我們僅僅篩選出單一資料,僅做範例。

若是多個有關聯的資料,可以利用正則匹配等方法處理資料,整理到一個字典中再打印出來或者儲存到檔案以及資料庫等等。

由於筆者能力有限,所以對很多地方實在不敢妄加贅述,如有不足之處,望及時指出

在此簡單總結一下本文:
靜態網頁爬取步驟:

1.利用bs4和requests來獲取網址的response以及解析網頁

2.觀察,尋找所需資料的位置,加以篩選

3.處理標籤中文字,若資料大且有所關聯則歸整到字典

我們當然可以將一些基本操作封裝成函式,以便操作:

def get_wb_data(url,label,headers=None):
    if(headers==None):
        response = requests.get(url)
    else:
        response=requests.get(url,headers=headers)
    soup=BeautifulSoup(response.text,'lxml')
    data=soup.select(label)
    return data
def print_data(data):
    for x in data:
        print(x.get_text())
所以,我們在針對一個或同一類網站若需要長期獲取某一類資訊,可以封裝函式,可以更加便利。


想必看閱本文的都是希望接觸python爬蟲的初學者,在此建議:

多動手操作,去大膽爬取自己想要的資訊,在這個過程中,會發現有許多東西爬不下來,這時,我們可以進一步去探索非同步載入的處理,即如何應對動態網頁的知識。

並且我們可能會遇到僅僅get是不足以獲取資料的情況,那麼就需要我們瞭解Headers,讓爬蟲去模仿人訪問等知識。

再進一步,我們發現有的網站很多東西不斷更新,專門進行反爬取,那麼我們可能會接觸破解驗證碼,如何避免封IP等問題。

…………(假裝分界線)

筆者實在能力有限,對之後的種種還無法熟練操控,若筆者自認可以繼續進一步講解時,或許會有後續文章。

希望此文可以幫助一些初級入門的朋友,再次感謝。