文章目錄
- 前言
- 一、 爬蟲的初識
- 1.1 什么是爬蟲
- 1.2 爬蟲的核心
- 1.3 爬蟲的用途
- 1.4 爬蟲分類
- 1.5 爬蟲帶來的風險
- 1.6. 反爬手段
- 1.7 爬蟲網絡請求
- 1.8 爬蟲基本流程
- 二、urllib庫初識
- 2.1 http和https協議
- 2.2 編碼解碼的使用
- 2.3 urllib的基本使用
- 2.4 一個類型六個方法
- 2.5 下載網頁數據
- 2.6 帶單個參數的頁面抓取(get請求)
- 2.7 定制request使用ua反爬
- 2.8 多字段的字符轉碼
- 2.9 post請求的使用
- 2.10 異常處理
- 三、 requests請求的使用
- 3.1 下載requests包
- 3.2 requests的基本使用
- 3.3 響應的保存
- 3.4 響應對象的其他屬性
- 3.5 用戶代理介紹
- 3.6 構建ua池
- 3.7 帶參數的請求
- 3.8 通過面向對象的方式來獲取數據
- 3.9 post請求
- 總結
前言
在當今信息爆炸的時代,互聯網上的數據呈指數級增長,如何高效地獲取、處理和分析這些數據成為一項重要的技能。網絡爬蟲(Web Crawler)作為一種自動化數據采集工具,能夠幫助我們快速地從海量網頁中提取有價值的信息,廣泛應用于搜索引擎、數據分析、市場調研、輿情監控等領域。
學習爬蟲技術不僅能提升我們的編程能力,還能培養數據思維,為后續的數據挖掘、機器學習等方向奠定基礎。然而,爬蟲開發并非簡單的“請求-解析”過程,它涉及HTTP協議、HTML解析、反爬機制應對、數據存儲等多個技術點,同時還需遵守相關法律法規,合理合法地使用爬蟲技術。
本教程將從基礎概念入手,逐步介紹爬蟲的核心技術,并結合實際案例,幫助讀者掌握爬蟲開發的完整流程。無論你是編程初學者,還是希望提升數據采集能力的開發者,都可以通過本教程系統地學習爬蟲技術,并將其應用于實際項目中。
一、 爬蟲的初識
1.1 什么是爬蟲
如果我們把互聯網比作一張大的蜘蛛網,那一臺計算機上的數據便是蜘蛛網上的一個獵物,而爬蟲程序就是一只小蜘蛛,沿著蜘蛛網抓取自己想要的數據
-
解釋1: 通過一個程序,根據url(http://www.taobao.com)進行爬取網頁,獲取有用信息
-
解釋2: 使用程序模擬瀏覽器,去向服務器發送請求,獲取響應信息
1.2 爬蟲的核心
-
爬取網頁:爬取整個網頁 包含了網頁中所有得內容
-
解析數據:將網頁中你得到的數據 進行解析
-
難點:爬蟲和反爬蟲之間的博弈(數據獲取與數據保護之間的對抗)
1.3 爬蟲的用途
-
數據分析/人工數據集
-
社交軟件冷啟動(新平臺沒有足夠的人流,使用爬蟲爬去其他類似于(微博)等的用戶數據,來吸引用戶下載)
-
輿情監控(一些災情信息等數據的獲取)
-
競爭對手監控(不同購物平臺,爬取對方相同物品的價格,來適當降低價格,吸引用戶購買#)
1.4 爬蟲分類
-
通用爬蟲(不常用):抓取系統重要組成部分,抓取的是一整張頁面的數據。
-
聚焦爬蟲:建立在通用爬蟲的基礎上,抓取的是頁面中特定的局部內容。
-
增量式爬蟲:檢測網站中數據更新的情況,只抓取網站中最新更新的數據。
1.5 爬蟲帶來的風險
-
爬蟲干擾了被訪問網站的正常運營
-
爬蟲抓取了受到法律保護的特定類型的數據或信息
1.6. 反爬手段
1.7 爬蟲網絡請求
請求過程: 客戶端,指web瀏覽器向服務器發送請求
請求分為四部分:
-
請求網址 --request url
-
請求方法 --request methods
-
請求頭 – request header
-
請求體 – request body
可以通過F12查看請求響應
1.8 爬蟲基本流程
- 確認目標:目標url:www.baidu.com
- 發送請求: 發送網絡請求,獲取到特定的服務端給你的響應
- 提取數據:從響應中提取特定的數據jsonpath/xpath/re
- 保存數據:本地(html、json、txt)、數據庫
注意: 獲取到的響應中,有可能會提取到還需要繼續發送請求的ur1,可以拿著解析到的url繼續發送請求
二、urllib庫初識
2.1 http和https協議
概念和區別
http協議:超文本傳輸協議,默認端口號是80
-
超文本:不僅僅限于文本,還包括圖片、音頻、視頻
-
傳輸協議:指使用共用約定的固定格式來傳遞轉換成字符串的超文本內容
https協議: http+ ssl(安全套接字層)默認端口號是443
-
帶有安全套接字層的超文本傳輸協議
-
ssl對傳輸的內容進行加密
https比http更安全,但是性能更低
2.2 編碼解碼的使用
圖片、視頻、音頻需要以bytes類型的格式來存儲
# 編碼--encode() 將str轉變為對應的二進制
str = '周杰倫'
print(str.encode())# 解碼--decode() 將二進制轉為str
str = b'\xe5\x91\xa8\xe6\x9d\xb0\xe4\xbc\xa6'
print(str.decode())
2.3 urllib的基本使用
# 前提:獲取數據的前提要聯網!!!!# 需求:使用urllib獲取百度首頁的源碼# 1. 導入urllib包(不用安裝)
import urllib.request# 1.定義一個url(就是需要訪問的地址)
url = 'http://www.baidu.com'# 2.模擬瀏覽器向服務器發送請求
# response包含頁面源碼和響應頭信息等等
response = urllib.request.urlopen(url)# 3.獲取響應中的頁面源碼(只要源碼)
# read方法返回的是帶b的二進制的數據
content = response.read()# 4.打印數據
# print(content) 二進制# 5.該編碼格式(解碼 decode方法)
# decode的默認解碼就是utf-8 因而也可以省略參數
print(content.decode('utf-8'))
2.4 一個類型六個方法
# 基礎操作
import urllib.requesturl = 'http://www.baidu.com'response = urllib.request.urlopen(url)# 一個類型和六個方法# 判斷類型
# <class 'http.client.HTTPResponse'>
# print(type(response))# read()方法是單字節的讀取數據(速度慢)
# content = response.read()
# 表示只讀5個字節
# content = response.read(5)
# print(content)# readline()方法 讀取一行(速度快)
# content = response.readline()
# print(content)# readlines()方法 讀取所有行
# content = response.readlines()
# print(content)# 返回狀態碼 200表示成功 證明邏輯是對的
print(response.getcode())# 返回url地址
print(response.geturl())# 返回狀態信息和響應頭
print(response.getheaders())
2.5 下載網頁數據
# 可以下載文件/音頻/視頻.....
# 適用于批量下載import urllib.requesturl_page = 'http://baidu.com'# 使用urlretrieve()方法
# 第一個參數是url地址,第二個參數是保存的文件名
# 返回的是html文件,所以后綴寫html
# urllib.request.urlretrieve(url_page, 'baidu.html')# 下載圖片
url_img = 'https://tse1-mm.cn.bing.net/th/id/OIP-C.hMxUTa_ah0EEEKjzMrcKZgHaJF?w=204&h=318&c=7&r=0&o=7&cb=iwp1&dpr=1.1&pid=1.7&rm=3.jpg'
urllib.request.urlretrieve(url_img, 'img.jpg')# 下載視頻(mp4)不再演示
2.6 帶單個參數的頁面抓取(get請求)
import urllib.request
import urllib.parse# url = "http://www.baidu.com/s?ie=UTF-8&wd=%E8%94%A1%E5%BE%90%E5%9D%A4"
# url = "http://www.baidu.com/s?ie=UTF-8&wd=蔡徐坤"
# 需要將中文進行編碼 導入quote即可
name = urllib.parse.quote("蔡徐坤")
# print(name)# 將%E8%94%A1%E5%BE%90%E5%9D%A4 轉化為 蔡徐坤
# 使用unquote即可
# rename = urllib.parse.unquote(name)
# print(rename)# 可以用戶自己輸入名字進行修改name
url = "http://www.baidu.com/s?ie=UTF-8&wd=" + name
response = urllib.request.urlopen(url)
content = response.read().decode()
print(content)
2.7 定制request使用ua反爬
再來了解一下ua反爬
user Agent中文名為用戶代理,簡稱 UA,它是一個特殊字符串頭,使得服務器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引、瀏覽器語言、瀏覽器插件等。
通俗的講: ua能使得瀏覽器認為是請求不來自我們的爬蟲程序,而是來自瀏覽器本身
import urllib.request
import urllib.parsename = urllib.parse.quote("蔡徐坤")url = "https://www.baidu.com/s?ie=UTF-8&wd=" + name
# 定制request
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=header)
response = urllib.request.urlopen(request)
content = response.read().decode()
print(content)
2.8 多字段的字符轉碼
# 當url為多個參數的時候進行轉碼
import urllib.parse
import urllib.request# http://www.baidu.com/s?wd=周杰倫&sex=男# 必須用字典才可以
data = {"wd": "周杰倫","sex": "男"
}a = urllib.parse.urlencode(data)
# print(a)
# 獲取網頁源碼
url = "https://www.baidu.com/s?" + a
# print(url)
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=header)
response = urllib.request.urlopen(request)
content = response.read().decode()
print(content)
2.9 post請求的使用
import json
import urllib.request
import urllib.parseurl = 'https://fanyi.baidu.com/sug'# 構建post請求的數據 字典形式
data = {'kw': 'translate'
}
# post請求必須添加編碼 轉變為二進制的數據
data = urllib.parse.urlencode(data).encode('utf-8')
# print(data)
request = urllib.request.Request(url = url, data = data)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)
# 獲取的數據是json格式 字符串被編碼了,轉化為字典字符串正常顯示
obj = json.loads(content)
print(obj,type(obj))
2.10 異常處理
import urllib.request
url = 'http://www.baidu.com1'
try:response = urllib.request.urlopen(url)print(response.read().decode('utf-8'))
except urllib.error.URLError:print("發送錯誤")
三、 requests請求的使用
上面單純使用urllib的方式,顯然麻煩了不少,并且不易于理解,那么有沒有更簡單更容易上手的方法呢,有的兄弟有的,可以直接使用requests的方式。
3.1 下載requests包
方式一:使用命令行安裝
- 打開命令行cmd(win + R)
- 輸入pip -V 查看pip是否正常安裝(python正常安裝的情況下,pip自動安裝)
- 輸入 pip install requests(默認國外地址,安裝較慢,這里使用國內地址)
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
- 等待安裝成功提示即可
方式二:使用pycharm直接安裝
在右下腳找到python軟件包,搜索requests下載安裝即可(也可以使用國內地址進行安裝)
Tip: 可以使用
pip uninstall 包名
來卸載指定的包。
3.2 requests的基本使用
# 爬取百度頁面的源碼# 1. 導包
import requests# 2. 發送請求
# 進入百度查看是否是get請求
url = 'http://www.baidu.com'
response = requests.get(url)
# print(response) #<Response [200]>可以直接獲取響應碼# 獲取相應
# text屬性會自動尋早一個解碼方式去解碼會出現報錯
# 解決方式為 講response直接加入encoding即可
# response.encoding = 'utf-8'
# print(response.text)# 方式二 使用content方法 加上解碼即可
print(response.content.decode())
3.3 響應的保存
- 圖片的保存
# 用resquests來保存一張圖片import requests
url = 'https://ww4.sinaimg.cn/mw690/0078WY2egy1i139fqp2wqj31jk2bcn61'
# 先判斷get請求
res = requests.get(url)
# b形式數據圖片存儲
# print(res.content)
# 通過文件的形式保存 一定要帶上b模式啊
with open('img.jpg', 'wb') as f:f.write(res.content)
- 百度頁面的保存
import requests
url = 'http://www.baidu.com'
res = requests.get(url)
with open("baidu.html", "w",encoding="utf-8") as f:f.write(res.content.decode())
3.4 響應對象的其他屬性
import requests
url = 'http://www.baidu.com'
res = requests.get(url)
#打印響應的ur1
print(res.url)#打印響應對象的請求頭
print(res.request.headers)# 打印響應頭
print(res.headers)
3.5 用戶代理介紹
import requests
url1 = 'http://www.baidu.com' #509723
url2 = 'https://www.baidu.com' #227# res = requests.get(url2)
# content = res.content.decode()
# print(len(content))# 使用用戶代理反爬蟲
# 依舊是寫成字典形式
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}# 添加ua 讓服務器認為是瀏覽器在發送請求response = requests.get(url2,headers=headers)
content = response.content.decode()
print(len(content)) # 28918
3.6 構建ua池
import random
# 構建ua池,防止多次調用被反爬# 方法1 自己寫ua池
uAlist = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36','Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1','Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Mobile Safari/537.36'
]
# 隨機獲取一個ua
# print(random.choice(uAlist))# 方法2 外包生成ua
# 下載fake-useragent包
# 頻繁調用的時候可能會報錯
from fake_useragent import UserAgent
print(UserAgent().random)
3.7 帶參數的請求
# 帶參數數據的請求爬取
import requestsurl = 'https://www.baidu.com/s?ie=UTF-8'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
data = {'wd': '蔡徐坤'
}res = requests.get(url,headers=headers,params=data)
content = res.content.decode()
print(content)
3.8 通過面向對象的方式來獲取數據
# 獲取明星頁面信息并且保存
import requests
class Star:def __init__(self):self.url = 'https://www.baidu.com/s?ie=UTF-8'self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36'}# 發送數據def send(self,params):response = requests.get(self.url,headers=self.headers,params=params)return response.text# 保存數據def save(self,content):with open('star.html','w',encoding='utf-8') as f:f.write(content)def run(self):name = input('請輸入明星名稱:')params = {'wd':name}content = self.send(params)self.save(content)star = Star()
star.run()
3.9 post請求
post請求: 登錄注冊,傳輸大文本內容# requests.post(url,data)# data參數接收一個字典
get跟post區別
-
get請求—比較多
-
post請求 – 比較少
-
get請求直接向服務器發送請求,獲取應內容
-
post請求是先給服務器一些數據,然后再獲取響應
-
get請求攜帶參數-- params
-
post詩求攜帶參數- data
# 百度翻譯案例
import jsonimport requestsurl = "https://fanyi.baidu.com/sug"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
}
data = {"kw": "eye"
}
response = requests.post(url,headers=headers,data=data)
content = response.text
# print(content)
obj = json.loads(content)
print(obj)
總結
通過本教程的學習,我們系統地掌握了網絡爬蟲的基本原理和關鍵技術。從HTTP請求、HTML解析,到動態頁面渲染、反爬策略應對,再到數據的清洗與存儲,我們一步步構建了一個完整的爬蟲知識體系。
爬蟲技術不僅僅是一種數據采集手段,更是連接互聯網世界與數據分析的橋梁。掌握爬蟲技能后,我們可以高效地獲取所需數據,為商業分析、學術研究、自動化運維等場景提供強大的數據支持。
然而,爬蟲開發并非沒有邊界。在實踐過程中,我們必須遵守目標網站的robots.txt協議,尊重版權和隱私,避免對服務器造成過大壓力。同時,隨著反爬技術的不斷升級,爬蟲開發者也需要持續學習,靈活應對各種挑戰。
未來,隨著人工智能和大數據的發展,爬蟲技術將繼續演進,與自然語言處理(NLP)、機器學習(ML)等技術結合,創造更大的價值。希望讀者能夠在本教程的基礎上,進一步探索爬蟲的高級應用,如分布式爬蟲、智能解析等,不斷提升自己的技術能力。
數據驅動未來,爬蟲賦能探索! 🚀