運行環境
- windows10
- anaconda3 ( python3都行)
- pycharm 社區版
- 谷歌瀏覽器 ( 其他的也行 )
本次Demo用到的庫及其作用如下:
- requests庫 模擬用戶提交 HTTP請求,獲取網頁的內容
- re庫 對字符串進行正則表達式匹配,用於獲取目標內容
- bs4庫,對網頁字符串進行格式化,可通過類名、ID、標簽名三種方式定義對應的標簽
- pandas庫,將爬取的內容存入DataFrame二維表,方便查看與導出
首先導入需要用到的庫
import requests
import re
from bs4 import BeautifulSoup
import pandas as pd
提示:若在運行中報錯,則可能是因為python環境中缺少對應的庫,可以在python shell里安裝
pip install 庫名
#3.x版本
pip3 install 庫名
@
爬蟲模板
# 一、導庫
import requests, re, pandas as pd
from bs4 import BeautifulSoup
# 二、設置請求網頁的信息: 網址url + header請求頭
url = '爬取的網站地址'
headers = {
'User-Agent': '通過瀏覽器調試工具查看',
}
# 三、使用 requests庫 獲取網頁響應的結果文件
html = requests.get(url, headers=headers).text
# 四、使用 BeautifulSoup庫 解析HTML網頁內容
soup = BeautifulSoup(html)
# 五、結果bs庫和re庫的正則表達式提取需要的數據
data = []
for x in soup.select("定位標簽"):
data.append(re.search('>([^<]+)<', str(x)).group(1))
# 六、將結果保存到 DataFrame對象,並將結果導出到本地文件
df = pd.DataFrame({'中國省份' : data})
df.to_csv('導出的文件名.txt', sep='\t',index=False, header=None)
爬蟲第一步:獲取 URL,設置請求頭User-Agent
現在許多網站都有反扒機制,比如筆者在嘗試爬取京東購物網時,發現需要登錄才能爬取,而且第一頁和第二頁的網址URL不僅僅是單個參數的變化,不過肯定是有相應的爬蟲技術解決這個問題的,這里基於筆者的知識面暫時只做簡單的入門。
1.1 獲取URL
以當當購物網 http://www.dangdang.com/ 為例,瀏覽器里顯示的地址,加上http:// 前綴就是我們要設置的URL,有的網站是https:// ,這表示http協議的一種加密協議。

1.2 設置請求頭
查看請求頭 User-Agent 通常使用瀏覽器的調試工具,快捷鍵 F12
在調試工具中 切換到 [ NetWork ]、中文版的話就是 [ 網絡 ]
點擊后,設置錄制狀態,並刷新網頁,等待一段時間則會顯示獲取到的網站資源

選擇 www.dangdang.com 這個資源,可以查看底部有一個JSON 格式的鍵值對 User-Agent : ...
其后面的內容就是我們要設置的請求頭,這樣在向網頁發送請求時,網頁就會將我們識別成用戶,而不是爬蟲的機器。

1.3 python 代碼實現
這里的 User-Agent 以筆者的為例,每台機器的請求頭不相同,記得更換。
url = 'www.dangdang.com'
# 以字典的形式設置請求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36',
}
爬蟲第二步:發送請求,獲取響應的網頁內容
這一步需要用到 requests庫 ,其作用是按我們的要求向網站發送請求
2.1 Python 代碼實現
import requests
url = 'https://category.dangdang.com/pg'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36',
}
response = requests.get(url, headers=headers)
html = response.text
print(html)
2.2 運行結果

爬蟲第三步: 解析網頁內容,提取數據
通過 requests 發送請求后返回的結果是一個HTML文本,此時它還沒有具體的作用。
接下來使用 來自 bs4庫的 BeautifulSoup ,它支持將HTML內容轉化為樹狀型的數據結構
比如在返回的結果內容中有:
<ul class="ddnewhead_area_list" style="display: none;" id="area_list" onmouseover="this.style.display='block';"
onmouseout="this.style.display='none';">
<li><a href="javascript:void(0);" onclick="change_area('111','北京')" num="111">北京</a></li>
<li><a href="javascript:void(0);" onclick="change_area('112','天津')" num="112">天津</a></li>
....
這里是對應網站的這部分內容

現在可以一次性將里面的省份全部讀取下來
3.1 Python 代碼實現
import requests
from bs4 import BeautifulSoup
url = 'https://category.dangdang.com/pg'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36',
}
response = requests.get(url, headers=headers)
html = response.text
soup = BeautifulSoup(html)
for x in soup.select(".ddnewhead_area_list > li > a"):
print(x)
3.2 運行結果
爬取的結果如下:

3.3 Re庫提取關鍵信息
可以觀察到我們需要的信息被 <a> 標簽所包裹,現在則可以使用簡單的正則表達式將其獲取
print(re.search('>([^<]+)<', str(x)).group(1))
實現效果

爬蟲第四步:使用DataFrame保存數據
DataFrame類似一個Excel表格,而且有許多原生的API進行數據變換的操作,這里主要用來保存。
4.1 根據列表創建 DataFrame對象
import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
url = 'https://category.dangdang.com/pg'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36',
}
response = requests.get(url, headers=headers)
html = response.text
soup = BeautifulSoup(html)
data = []
for x in soup.select(".ddnewhead_area_list > li > a"):
data.append(re.search('>([^<]+)<', str(x)).group(1))
df = pd.DataFrame({'中國省份' : data})
print(df)
運行結果:

4.2 導出DataFrame到本地
導出DataFrame通過調用該對象的 to_xxx 方法,其中有常用的幾個參數:
- sep 設置列之間的分隔符號
- index 設置導出的結果文件是否帶行下標
- header 設置導出的結果文件是否帶列名
df.to_csv('test.txt', sep='\t',index=False, header=None)

至此,已實現了最入門的python爬蟲過程。
