Python爬蟲 (一) | 案例及模板 簡要四步爬取購物網站信息 | 基於 requests、re、 pandas、 bs4


運行環境


  • 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爬蟲過程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM