爬蟲基礎 – 爬蟲學的好,牢飯吃得飽系列
安裝
pip install requests
get請求
import requests
res = requests.get(url="//baidu.com")
print(res) # Response對象
print(res.content) # b"..." 二進位文本流
print(res.content.decode("utf-8")) # 二進位文本流轉為字元串
print(res.text) # 直接獲取字元串,效果和上面的一樣
print(res.request.headers) # 請求頭
print(res.headers) # 響應頭
print(res.status_code) # 請求狀態碼 200是成功
print(res.url) # 請求地址
if res.status_code == 200:
with open("./baidu.html", 'w') as fp:
fp.write(res.text)
get請求反反爬
上面我們把baidu首頁成功下載下來了,如果我們換成具有簡單反爬的網站就會失敗了,如下
res = requests.get(url="//www.ifunmac.com/")
if res.status_code == 200:
with open("./baidu.html", 'w') as fp:
fp.write(res.text)
else:
print("獲取失敗")
解決方案:定義請求頭資訊(這裡的請求頭可以隨便找一個瀏覽器里的請求,直接複製過來即可)
headers = {
"user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
}
res = requests.get(url="//www.ifunmac.com/", headers=headers)
post請求
data = { "kw":"hello" } # post請求發送的數據
res = requests.post(url="//fanyi.baidu.com/sug", headers=headers, data=data)
if res.status_code == 200:
print(res.json())
post請求的時候要帶上headers頭資訊和data要發送的數據
什麼是cookie和session
舉個例子,如果你已經登錄了某網站,為什麼打開該網站其他頁面的時候不需登錄了?也就是說服務端如何知道你已經是登錄狀態的?客戶端在哪記錄的狀態?那就是cookie,你使用用戶名和密碼登錄之後,服務端生成一個cookie給客戶端,下次客戶端打開其他頁面請求數據的時候,帶著這個cookie,服務端就知道是已登錄狀態。http請求是無狀態的,所以使用cookie來記錄狀態。
session是在服務端存儲數據,並且會給每個用戶生成一個sessionID也就是cookie
cookie應用實例
我們登錄簡書之後能看到自己帳號的粉絲個數,我們如何用python爬蟲拿到粉絲數呢?那就是先登錄簡書,獲取到cookie之後再抓取
headers = {
"cookie": "複製登錄後的cookie"
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
}
res = requests.get(url="//www.jianshu.com/users/xxxxxx/following?page=2", headers=headers)
if res.status_code == 200:
print(res.text)
如何自動化獲取cookie並獲取登錄後的頁面資訊
這裡和我平時的認知有點不一樣,一般都是模擬登錄,然後從登錄請求里獲取cookie來進行下一步的使用。這裡需要大家注意,有點不一樣。
流程是:先獲取cookie對象,然後使用cookie對象發起模擬登錄,再直接使用cookie對象發起獲取數據請求即可!
程式碼實例結構如下:
req = requests.session()
res = req.post(url="//2", headers=headers, data=data)
if res.status_code == 200:
req.get(url="//....")
掃碼關注公眾號」macosdev「,分享更多技術和資源,回復」電子書「可以獲得海量免費電子書資源

爬蟲的靈魂,解析數據
爬蟲學的再牛逼,不會解析數據一切都是白扯
牛逼方式一 xpath
xpath解析html非常方便,安裝pip3 install lxml ,我們使用lxml庫可以實現xpath方式解析html元素內容,只需要從lxml引入etree就可以使用xpath語法來解析html數據,關於xpath語法也有w3cschool教程,非常簡單,這裡就不細說了
from lxml import etree
html = etree.parse("html文件路徑", etree.HTMLParser())
r = html.xpath("/html/body/ul/li/text()")
print(r)
牛逼方式二 bs4
Beautifulsoup4簡稱bs4,是爬蟲解析網頁的神器,安裝pip3 install Beautifulsoup4
bs4功能強大,有一定的學習成本,但是使用起來非常簡單,要想爬蟲學的好,bs4必不可少,具體學習內容這裡就不說了,去官網看看文檔就能用起來
from bs4 import BeautifulSoup
bs = BeautifulSoup(html_doc, 'lxml')
牛逼方式三 正則表達式re
python自帶正則表達式庫re,正則表達式如果學的好,解析數據會事半功倍,如需安裝第三方,直接import re即可使用
這塊內容比較多,所以也是很多初學者覺得困難的地方。不要覺得無從下手,re裡面有倆函數學會基本能應付大部分場景,match和search函數
反反爬方式之一:代理伺服器
寫過伺服器介面的人都知道,為了防止惡意刷介面對伺服器造成壓力,我們一般會記錄訪問者的ip並且對訪問次數做限制。如果我就是想爬數據還不想被限制怎麼辦?
使用代理可以解決這個問題。
代理分為透明代理、匿名代理、高匿代理
透明代理是雖然代理了,但是服務端能獲取到你的真實ip,沒辦法解決限制問題
匿名代理是雖然服務端不知道你的真實ip,但是知道你使用代理了
高匿代理是服務端不知道你的真實ip,也不知道你使用代理了,隱蔽度最高的一種方式
代理地址可以去百度搜索一下,很多免費的地址可以用,比如西祠代理
使用方式如下:
proxies = {
"http": "192.19.19.9:9999",
"https": "192.19.19.9:9999"
}
res = req.post(url="//2", headers=headers,proxies=proxies, data=data)

