在初步了解網絡爬蟲之后,我們接下來就要動手運用Python來爬取網頁了。
我們知道,網絡爬蟲應用一般分為兩個步驟:
1.通過網頁鏈接獲取內容;
2.對獲得的網頁內容進行處理
這兩個步驟需要分別使用不同的函數庫:requests和beautifulsoup4。所以我們要安裝這兩個第三方庫。
我所用的編輯器是 Pycharm,它帶有一整套可以幫助用戶在使用Python語言開發時提高其效率的工具,比如調試、語法高亮、Project管理、代碼跳轉、智能提示、自動完成等。本次安裝第三方庫是在Pycharm下進行安裝的。
Pychram安裝第三方庫:
安裝第三方庫有很多方法,我這里用的是Pycharm自帶功能進行下載安裝:(當然也可以用pip方法進行安裝)
打開:File→Settings→Project: cc(這里的文件名是cc)→Project Interpreter ,就會顯示你已經安裝好的庫。
這里我已經安裝好了requests和beautifulsoup4庫,所以下圖顯示出來了。

點擊“+”,在彈出的搜索框中輸入要安裝第三方庫的名稱,例如“requests”。

在彈出的選項中選中需要安裝的庫后,點擊“Install Package”。待下載完成后就安裝成功了。
同理,安裝beautifulsoup4時,在搜索框里搜索“beautifulsoup4”,進行安裝就可以了、
下面介紹一下第三方庫:
requests庫
requests庫是一個簡潔且簡單的處理HTTP請求的第三方庫,它的最大優點是程序編寫過程更接近正常URL訪問過程。這個庫建立在Python語言的urllib3庫的基礎上,類似這種在其他函數庫之上再封裝功能、提供更友好函數的方式在Python 語言中十分常見。
requests庫支持非常豐富的鏈接訪問功能,包括國際域名和URL獲取、HTTP長連接和連接緩存、HTTP會話和Cookie保持、瀏覽器使用風格的SSL驗證、基本的摘要認證、有效的鍵值對Cookie記錄、自動解壓縮、自動內容解碼、文件分塊上傳、HTTP(S)代理功能、連接超時處理、流數據下載等。
如何使用requests庫?requests庫提供了一些常用函數如下:
requests庫中的網頁請求函數
| 函數 | 描述 |
| get(url, [timeout=n]) | 對應於HTTP的GRT方式,獲取網頁最常用的方法,可以增加timeout=n參數,設定每次請求超時時間為n秒 |
| post(url,data={''key}:''value) | 對應於HTTP的DELETE方式 |
| delete(url) | 對應於HTTP的HEAD方式 |
| head(url) | 對應於HTTP的HEAD方式 |
| option(url) | 對應於HTTP的OPTION方式 |
| put(url,data={'key':'value'}) | 對應於HTTP的PUT方式,其中字典用於傳遞客戶數據 |
一般運用這些函數的方法是requests.函數名(),不同的函數有不同的功能。
import requests r=requests.get("http://www.baidu.com/") r.encoding="utf-8" #編碼方式為utf-8,不加的話會出現中文亂碼 print(r.text)
代碼運行結果為:

和瀏覽器的交互過程一樣,用requests.get()代表請求,它返回的Response代表響應。返回的內容作為一個對象更便於操作,下面是Response對象的屬性
Response對象的屬性
| 屬性 | 描述 |
| status_code | HTTP請求的返回狀態,整數,200表示連接成功,404表示失敗 |
| text | HTTP響應內容的字符串形式,即url對應的頁面內容 |
| encoding | HTTP響應內容的編碼方式 |
| content | HTTP響應內容的二進制形式 |
import requests r=requests.get("http://www.baidu.com/") print(r.status_code) print(r.text) print(r.encoding) print(r.content)
運行結果如下,可以看到爬取網頁的一系列信息。

Response對象還有一些方法。
Response對象的方法
| 方法 | 描述 |
| json() | 如果HTTP響應內容包括JSON格式數據,則該方法解析JSON數據 |
| raise_for_status() | 如果不是200,則產生異常 |
使用requests 庫獲取HTML頁面並將其轉換成字符串后,需要進一步解析HTML頁面格式,提取有用信息,這需要處理HTML和XML的函數庫。
beautifulsoup4庫
beautifulsoup4庫,也稱為Beautiful Soup 庫或bs4庫,用於解析和處理HTML和XML。需要注意的是,它不是BeautifulSoup庫。它的最大優點是能根據HTML和XML語法建立解析樹,進而高效解析其中的內容。
HTML建立的Web頁面一般非常復雜, 除了有用的內容信息外,還包括大量用於頁面格式的元素,直接解析一個Web網頁需要深入了解HTML語法,而且比較復雜。beautifulsoup4 庫將專業的Web頁面格式解析部分封裝成函數,提供了若干有用且便捷的處理函數。
beautifulsoup4庫采用面向對象思想實現,簡單地說,它把每個頁面當作一個對象,通過<a>.<b>的方式調用對象的屬性(即包含的內容),或者通過<a>.<b>0的方式調用方法(即處理函數)。在使用beautifulsoup4庫之前,需要進行引用,由於這個庫的名字非常特殊且采用面向對象方式組織,可以用from-import方式從庫中直接引用BeautifulSoup 類。
例如:
from bs4 import BeautifulSoup
HTML中主要結構都變成了BeautifulSoup對象的一個屬性,可以通過<a>.<b>獲得,下面是BeautifulSoup中常用的一些屬性:
BeautifulSoup對象的常用屬性
| 屬性 | 描述 |
| head | HTML頁面的<head>內容 |
| title | HTML頁面標題,在<head>之中,由<title>標記 |
| body | HTML頁面的<body>內容 |
| p | HTML頁面中第一個<p>內容 |
| strings | HTML頁面所有呈現在Web上的字符串,即標簽上的內容 |
| stripped_strings | HTML頁面所有呈現在Web上的非空格字符串 |
import requests from bs4 import BeautifulSoup r=requests.get("http://www.baidu.com/") r.encoding="utf-8" soup=BeautifulSoup(r.text) print(soup.head) print(soup.title) print(soup.strings)
結果如下:

BeautifulSoup屬性與HTML屬性的標簽名稱相同。每一個Tag標簽在beautifulsoup4庫中也是一個對象,成為Tag對象。所以可以通過Tag對象的屬性多的相應的內容,Tag對象的屬性如下所示:
標簽對象的常用屬性
| 屬性 | 描述 |
| name | 字符串,標簽的名字,比如div |
| attrs | 字典,包含了原來頁面Tag所有的屬性,比如href |
| contents | 列表,這個Tag下所有子Tag的內容 |
| string | 字符串,Tag所包圍的文本,網頁中真實的文字 |
import requests from bs4 import BeautifulSoup r=requests.get("http://www.baidu.com/") r.encoding="utf-8" soup=BeautifulSoup(r.text) print(soup.a) print(soup.a.string)
結果如下:

由於HTML語法可以在標簽中嵌套其他標簽,所以,string 屬性的返回值遵循如下原則。
(1)如果標簽內部沒有其他標簽,string 屬性返回其中的內容。
(2)如果標簽內部還有其他標簽,但只有一個標簽,string 屬性返回最里面標簽的內容。
(3)如果標簽內部有超過1層嵌套的標簽,string 屬性返回None (空字符串)。HTML語法中同一個標簽會有很多內容,例如<a>標簽,百度首頁一共有13處,直接調用soup.a只能返回第一個。
遇到的問題:
1.在Pycharm使用Python爬取網頁時,爬取的網頁源碼顯示在一行,網頁源碼沒有換行。
例如:
import requests r=requests.get("http://www.baidu.com/") r.encoding="utf-8" print(r.text)
運行上述代碼,你會發現你爬取的網頁源碼顯示在一行內。

解決辦法:點擊箭頭所指的按鈕,控制台就會自動換行了。

2.Pycharm在安裝好第三方庫時,在新建一個項目時,你會發現之前已經安裝的第三方庫不能使用。
新建一個項目,你會發現它沒有之前安裝的第三方庫了

這時,你可以點擊下拉框,再在下拉框中選擇“show all”

這時,你可以找到上一個你已經安裝好第三方庫的項目,選中然后確認

再點擊確定

然后運行代碼,你就會發現可以使用第三方庫了

