爬蟲基礎 – 爬蟲學的好,牢飯吃得飽系列

安裝

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)