基本介紹
什么是網絡爬蟲
網絡爬蟲(Web Crawler)是一種自動化程序,用于從互聯網上抓取、解析和存儲網頁數據。其核心功能是模擬人類瀏覽行為,通過HTTP/HTTPS協議訪問目標網站,提取文本、鏈接、圖片或其他結構化信息,常用于搜索引擎索引、數據分析或商業情報收集。
robots.txt
robots.txt 文件的作用
robots.txt 是網站根目錄下的一個文本文件,用于告知網絡爬蟲哪些頁面或目錄可以被抓取,哪些應被禁止。它遵循 Robots 排除協議(REP),屬于行業標準而非法律約束。
robots.txt 的基本語法
User-agent
: 指定適用的爬蟲名稱(如*
表示所有爬蟲)。Disallow
: 禁止訪問的路徑。Allow
: 允許訪問的路徑。
示例:
User-agent: *
Disallow: /private/
Allow: /public/
常見規則示例
禁止所有爬蟲訪問整個網站:
User-agent: *
Disallow: /
允許所有爬蟲訪問全部內容:
User-agent: *
Disallow:
禁止特定爬蟲(如 Googlebot):
User-agent: Googlebot
Disallow: /images/
安裝requests庫的方法
使用pip安裝(推薦)
在命令行或終端中運行以下命令,適用于大多數Python環境:
pip install requests
驗證安裝
安裝完成后,在Python交互環境中運行以下代碼確認是否成功:
import requests
print(requests.__version__)
注意事項
- 確保Python環境已配置PATH變量。
- 網絡問題可能導致安裝失敗,可嘗試使用國內鏡像源(如清華源):
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
網絡爬蟲中的
get()
函數get()
是網絡爬蟲中常用的 HTTP 請求方法,主要用于向服務器請求數據,GET請求是爬蟲中最常見和最簡單的請求方法,可以直接將URL輸入,不需要其他轉換,即所有需要請求的信息都包含在URL中。以下是其核心知識點和用法:
基本語法(Python requests 庫)
import requestsresponse = requests.get(url, params=None, headers=None, timeout=5)
url
: 目標網頁地址params
: 查詢參數字典(如{'key1': 'value1', 'key2': 'value2'}
)headers
: 請求頭信息(如模擬瀏覽器訪問)timeout
: 超時時間(秒)
get()搜索信息
import requests
r = requests.get('https://www.ptpress.com.cn/search?keyword=word')
print(r.text)
get()添加信息
get()函數中第2個參數params會以字典的形式在url后自動添加信息,需要提前將params定義為字典。
?
示例代碼:
?
import requests
info = {'keyword':'Excel' }
r = requests.get('https://www.ptpress.com.cn/search',params=info)
print(r.url)
print(r.text)
第2行代碼建立字典info,包含一個鍵值對。
?
第3行代碼使用get()函數獲取網頁,由于get()中包含參數params,因此系統會自動在url后添加字典信息,形式為https://www.ptpress.com.cn/search?keyword=excel,該使用形式便于靈活設定需要搜索的信息,可以添加或刪除字典信息。
?
第4行代碼輸出返回的Response對象中的url,即獲取網頁的url。
response
response對象的基本概念
在爬蟲開發中,response
對象通常是HTTP請求后服務器返回的響應封裝,包含狀態碼、響應頭、響應體等關鍵信息。不同庫的response
對象結構可能略有差異,但核心功能相似。
??????
response 的屬性
response
對象通常用于 HTTP 請求的響應處理,其屬性會根據使用的庫或框架有所不同。以下是常見場景下的屬性說明:
通用 HTTP 響應屬性
-
status_code
表示 HTTP 狀態碼(如 200、404),用于判斷請求是否成功。 -
headers
包含響應頭的字典,例如Content-Type
或Server
信息。 -
content
以字節形式返回原始響應內容,適用于非文本數據(如圖片)。 -
text
將響應內容解碼為字符串(自動處理編碼),適用于文本數據(如 HTML/JSON)。
設置編碼
?
當訪問一個網頁時,如果獲取的內容是亂碼,可以通過設置requests.get(url)返回的Response對象的encoding='utf - 8'來修改“Response對象.text”文本內容的編碼方式。同時Response對象中提供了apparent_encoding()方法來自動識別網頁的編碼方式,不過由于此方法是由機器自動識別,因此可能會存在識別錯誤的情況(大部分情況下是可用的)。
?
如果要設置自動識別網頁的編碼方式,可以使用以下形式:
?
Response對象.encoding = Response對象.apparent_encoding
?
示例代碼:
?
import requests
r = requests.get('此處填入\'百度官網地址\'.com')
r.encoding = r.apparent_encoding
print(r.text)
第3行代碼設置自動識別網頁的編碼方式,執行代碼后的輸出結果中將包含可識別的文字 。
返回網頁內容
?
Response對象中返回網頁內容有兩種方法,分別是text()方法和content()方法,其中text()方法在前面的內容中有介紹,它是以字符串的形式返回網頁內容。而content()方法是以二進制的形式返回網頁內容,常用于直接保存網頁中的媒體文件。
import requests
r = requests.get('https://cdn.ptpress.cn/uploadimg/Material/978-7-115-41359-8/72jpg/41359.jpg')
f2 = open('b.jpg','wb')
f2.write(r.content)
f2.close()
第2行代碼使用get()方法訪問了圖片url。
第3行代碼使用open()函數創建了一個‘b.jpg’文件,并且設置以二進制寫入的模式。
第4行代碼將獲取的url內容以二進制形式寫入文件。
執行代碼后將在相應文件夾中存儲一張圖片
代理服務器
代理服務器在爬蟲中的作用
代理服務器在爬蟲中主要用于隱藏真實IP地址,避免被目標網站封禁或限制訪問。通過代理IP發送請求,可以模擬不同地區的用戶訪問,提高爬蟲的穩定性和成功率。
代理服務器的獲取方式
- 免費代理:公開的代理IP池,但穩定性差,可用率低。
- 付費代理:提供高可用性和低延遲的代理服務。
如何在爬蟲中使用代理
Python的requests
庫可以通過proxies
參數設置代理:
import requestsproxies = {"http": "http://10.10.1.10:3128","https": "http://10.10.1.10:1080",
}response = requests.get("http://example.com", proxies=proxies)
print(response.text)
代理服務器的管理
- IP輪換:隨機或按策略切換代理IP,避免單一IP被封。
- 速率控制:控制請求頻率,減小被封禁的概率。
selenium庫驅動瀏覽器
安裝Selenium庫
通過pip命令安裝Selenium庫:
pip install selenium
pip install selenium -i https://pypi.mirrors.ustc.edu.cn/simple/
下載瀏覽器驅動
根據使用的瀏覽器下載對應的驅動(以Chrome為例):
- ChromeDriver:從ChromeDriver官網下載與瀏覽器版本匹配的驅動。
- 其他瀏覽器:
- Firefox:下載GeckoDriver。
- Edge:下載EdgeDriver。
將驅動文件解壓后放入系統路徑(如/usr/local/bin
或項目目錄)。
基本使用方法
初始化WebDriver并打開瀏覽器:
from selenium import webdriver# Chrome瀏覽器示例
driver = webdriver.Chrome(executable_path='path/to/chromedriver')
driver.get("https://www.example.com")
注意事項
- 確保瀏覽器驅動版本與瀏覽器版本兼容。
- 使用完畢后調用
driver.quit()
釋放資源。 - 顯式等待比隱式等待更高效,推薦優先使用。
通過以上方法,可以靈活控制瀏覽器行為,適用于自動化測試、數據抓取等場景。
?驅動瀏覽器
selenium庫支持的瀏覽器包括Chrome、IE 7~11、Firefox、Opera Edge、HtmlUnit、PhantomJS等,幾乎覆蓋了當前計算機端和手機端的所有類型的瀏覽器。在selenium庫源代碼文件下的webdriver中可查看所有支持的瀏覽器類型
?
webdriver的使用形式如下:
?
webdriver.瀏覽器類型名()
例如驅動Chrome瀏覽器的使用方法為webdriver.Chrome(),驅動Opera瀏覽器的使用方法為webdriver.opera()。每個文件夾中都存在一個webdriver.py文件,當調用webdriver.Chrome()時,會默認調用chrome\webdriver.py文件中的類WebDriver。
webdriver.Chrome()的使用形式如下:
?
webdriver.Chrome(executable_path = "chromedriver", port = 0, options = None)
功能:創建一個新的Chrome瀏覽器驅動程序。
?
參數executable_path:表示瀏覽器的驅動路徑,默認為環境變量中的path,通常計算機中可能存在多個瀏覽器軟件,當沒有在環境變量中設置瀏覽器path時,可以使用參數options。
?
參數port:表明希望服務運行的端口,如果保留為0,驅動程序將會找到一個空閑端口。
?
參數options:表示由類Options(位于selenium\webdriver\chrome\options.py)創建的對象,用于實現瀏覽器的綁定。
?
示例代碼(驅動Chrome瀏覽器):
?
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
driver = webdriver.Chrome(options=chrome_options)
?
第3、4行代碼使用類Options創建了一個對象?chrome_options?,使用?binary_location()?方法綁定了瀏覽器。
第5行代碼使用?webdriver.Chrome()?設置?options?參數值為綁定Chrome瀏覽器的對象?chrome_options?。
執行代碼后將會自動打開Chrome瀏覽器,實現驅動瀏覽器的第一步。
?
注意
該代碼中的瀏覽器安裝地址為計算機上Chrome瀏覽器的安裝地址,讀者在實踐操作時需要使用自己計算機中瀏覽器的安裝地址。可以通過鼠標右鍵單擊瀏覽器圖標,選擇快捷菜單中的“屬性”選項即可
加載網頁
接下來介紹兩種常用的加載瀏覽器網頁的方法。
?
第1種,get()方法。
get()方法用于打開指定的網頁
?
示例代碼(加載人民郵電出版社官網中的期刊頁):
?
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.ptpress.com.cn//periodical')
第6行代碼使用get()方法加載人民郵電出版社官網的期刊頁,執行代碼后將會自動啟動Chrome瀏覽器并加載出相應網頁,結果如圖15-33所示。
?
第2種,execute_script()方法。execute_script()方法用于打開多個標簽頁,即在同一瀏覽器中打開多個網頁。
功能:打開標簽頁,同步執行當前頁面中的JavaScript腳本。JavaScript是網頁中的一種編程語言。
參數script:表示將要執行的腳本內容,數據類型為字符串類型。使用JavaScript語言實現打開一個新標簽頁的使用形式為?"window.open('網站url','_blank');"?。
?
示例代碼(打開多個標簽頁):
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.ptpress.com.cn/')
driver.execute_script("window.open('https://www.ptpress.com.cn/login','_blank');")
driver.execute_script("window.open('https://www.shuyishe.com/','_blank');")
driver.execute_script("window.open('https://www.shuyishe.com/course','_blank');")
獲取渲染后的網頁代碼
通過get()方法獲取瀏覽器中的網頁資源后,瀏覽器將自動渲染網頁源代碼內容,并生成渲染后的內容,這時使用page_source()方法即可獲取渲染后的網頁代碼。
?
示例代碼:
?
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.ptpress.com.cn/')
print(driver.page_source)
第7行代碼使用driver對象中的page_source()方法獲取被get()方法獲取到的渲染后的網頁源代碼。
案例
提取關鍵字為python的圖書封面圖片:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
import rechrome_options = Options()
chrome_options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.ptpress.com.cn/search?keyword=python')
a = re.findall('< img src="(.+?jpg)"></div>', driver.page_source)
i = 1
for url in a:r = requests.get(url)f2 = open('.\\Python圖書\\' + str(i) + '.jpg', 'wb')i += 1f2.write(r.content)f2.close()