第二章 Requests庫的使用:變相的cc攻擊

在這裏插入圖片描述

環境

Python 3.6.5

Pycharm Professional 2017.1

需要預備的知識

python基礎語法

瞭解基礎的web網頁結構知識

瞭解http協議

熟悉瀏覽器開發者工具使用

爬蟲所需的基礎的web網頁結構,http協議、開發者工具使用我會在其他文章中補上

簡介

Requests 是一個模擬請求的python工具庫。用於爬蟲三部曲的第一步。

Requests Python編寫,基於urllib,自稱HTTP for Humans(讓HTTP服務人類)。關於urllib的內容,可以參考我的另一篇文章。

特性:

  1. 支持HTTP連接保持和連接池

  2. 支持使用cookie保持會話

  3. 支持自動確定響應內容的編碼

  4. 支持國際化的URL和POST數據自動編碼

  5. 使用更簡潔方便,比urllib更加Pythoner

開源地址:https://github.com/kennethreitz/requests

中文文檔API:https://requests.readthedocs.io/zh_CN/latest/

安裝

最簡單方式:打開pycharm底部的終端命令窗口,輸入pip install requests即可。

在這裏插入圖片描述
如果網絡連接較差,可以嘗試使用清華源的地址

臨時使用

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

注意,simple 不能少, 是 https 而不是 http

設爲默認

升級 pip 到最新的版本 (>=10.0.0) 後進行配置:

pip install pip -U

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

如果 pip 默認源的網絡連接較差,臨時使用本鏡像站來升級 pip:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U

知識

Get請求

最簡單的get請求

# 導入請求庫
import requests
# 訪問百度 訪問的結果 都存儲到了這個response變量裏
response = requests.get("https://www.baidu.com")

requests直接將方法名定義爲請求方式,第一個參數爲請求地址

查看請求結果

# 請求狀態碼
print(response.status_code)
# 請求的內容,只不過是字節類型,需要進行解碼
print(response.content)
# 對上一步進行解碼 decode默認解碼類型爲utf-8
print(response.content.decode())

添加請求參數

1.直接拼接在url裏

在這裏插入圖片描述

import requests

# 添加請求頭User-Agent 繞過百度反爬 關於UA後邊會說到
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"}
# 直接在問號後邊補全參數即可,wd是百度的搜索參數
response = requests.get("https://www.baidu.com/s?ie=UTF-8&wd=996",headers=headers)
print(response.content.decode())

自己瀏覽器的User-Agent,可以使用開發者工具查看。按F12,選擇Network,隨便選中一個請求,打開Headers選項,在Requests-Headers裏邊。

在這裏插入圖片描述

爬蟲所需的信息一般返回結果爲html,json,js,如果請求返回的結果是html的,可以使用這種方式方便查看結果:

# 爲了查看方便我們可以把內容保存爲html文件,進行本地查看
with open("./temp_result.html","wb") as f:
    f.write(response.content)

如果參數是中文的還需要進行轉字節,比較麻煩,所以使用下面這種方式是極好的。

2.字典方式傳參,自動拼接url

使用另外一個參數params,只需要把參數以字典的形式傳入即可,如果有中文也不需要自己轉換字節了。

# 使用字典的方式
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36",
}
params = {"ie":"UTF-8","wd":"獅範客"}
response = requests.get("https://www.baidu.com/s?",params=params,headers=headers)
with open("./temp_result.html","wb") as f:
    f.write(response.content)
print(response.content.decode())

Post請求

# 這個請求沒有意義 這裏我們先了解post方法即可
response = requests.post("http://www.baidu.com",data={"q":"shifanke"})

在post請求裏,data參數是post請求要提交的參數,即要放到請求體中的數據。其他的和get請求一樣。

Get/Post請求參數列表

在這裏插入圖片描述

  • method:Request請求對象的方法。

  • url:Request請求對象的url。

  • params:(可選)要在查詢中發送的字典或字節,即get參數

  • param data:(可選)要放在Request請求對象的數據,即http協議的請求體部分,參數形式爲字典、元組、字節或類似文件的列表,即post參數

  • json:(可選)同上,不過格式爲json

  • headers:http協議的請求頭部分

  • cookie:(可選)請求頭的一部分,形式爲字典或CookieJar對象

  • files:(可選)上傳多部分編碼文件。

  • auth:(可選)auth元組或可調用以啓用基本消化/定製HTTP身份驗證。

  • timeout:(可選)設置等待服務器發送的時間

  • allow_redirects:(可選)是否允許重定向默認設置爲True。

  • proxies:(可選)字典方式設置代理

  • stream:(可選)是否立即下載響應內容。默認爲“假”。

  • verify:(可選)一個布爾值,在這種情況下,它控制我們是否驗證服務器的TLS證書,或字符串,在這種情況下,它必須是路徑到要使用的CA束。默認爲’ ‘真實的’ '。

  • cert:(可選)字符串,ssl客戶端證書文件的路徑(.pem)。如果是元組,那就這種格式(‘cert’, ‘key’)。

反爬機制

這裏我們先討論幾種簡單的,複雜的我們會放在後邊。

反爬機制:

  • 封殺爬蟲程序
  • 封殺指定IP
  • 封殺非人操作的程序

應對策略:

  • 僞裝爲真實用戶
  • 更換IP
  • 讓程序的行爲更像人的操作

1.僞裝爲真實用戶

如果直接使用requests進行訪問,你的請求頭的User-Agent的會顯示python-requests/2.22.0,這樣服務器很容易,通過這個標識,來判定你是爬蟲程序,不是正常用戶,所以我們要進行僞裝,騙過服務器。

User Agent中文名爲用戶代理,是Http協議中的一部分(我後邊會補充一遍文章聊聊http),屬於頭域的組成部分,User Agent也簡稱UA。它是一個特殊字符串頭,是一種向訪問網站提供你所使用的瀏覽器類型及版本、操作系統及版本、瀏覽器內核、等信息的標識。通過這個標識,用戶所訪問的網站可以顯示不同的排版從而爲用戶提供更好的體驗或者進行信息統計。

瀏覽器的UA字串的標準格式:瀏覽器標識 (操作系統標識; 加密等級標識; 瀏覽器語言) 渲染引擎標識版本信息。但各個瀏覽器有所不同。

瀏覽器就是互聯網世界上公認被允許的身份,如果我們希望我們的爬蟲程序更像一個真實用戶,那我們第一步,就是需要僞裝成一個被公認的瀏覽器。用不同的瀏覽器在發送請求的時候,會有不同的User-Agent頭。中文名爲用戶代理,簡稱UAUser Agent存放於Headers中服務器就是通過查看Headers中的User Agent來判斷是誰在訪問。urllib中默認的User Agent,會有Python的字樣,如果服務器檢查User Agent,可以拒絕Python程序訪問網站。

當前的User-Agent可以訪問這個接口進行測試:
http://www.useragentstring.com/

我們之前的那個百度搜索的案例,就使用了這種方式。

# 使用字典的方式
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36",
}
params = {"ie":"UTF-8","wd":"獅範客"}
response = requests.get("https://www.baidu.com/s?",params=params,headers=headers)
with open("./temp_result.html","wb") as f:
    f.write(response.content)
print(response.content.decode())

2.封殺指定IP
不知道大家有沒有遇到這樣的情況,尤其是一些政府網站,一個網頁短時間快速多刷新幾次,然後就不能訪問了。

對服務器來說,在絕大數情況下,一個ip在短時間進行大量的訪問,肯定是不正常的。所以爲了服務器的穩定不浪費資源,會針對這些ip進行封禁,拉進小黑屋。有可能過兩天就給你解了,也有可能很長一段時間不會解禁。

所以這時候,就需要使用代理ip,其實大家用的遊戲加速器和科學上網工具就是代理ip。或者手機開熱點,電腦連手機,也可以當代理ip用,而且運營商還很貼心的幫你換ip。

代理ip,封了就封了,我們可以無限更換。可以使用網上一些免費的,但是可用率極低,推薦使用一些第三方ip代理服務商提供的,推薦的有:
蘑菇代理 http://www.moguproxy.com/
訊代理 http://www.xdaili.cn/
代理雲 http://www.dailiyun.com/

常見的代理 IP 服務有兩種:
私密代理(或者叫高效代理):提供 API,我們通過這個 API 提取到代理IP。
2隧道代理(或者叫動態代理):提供一個統一的入口,每個請求隨機分發到代理池中的某個代理IP上。
這兩種服務,第二種接入更加方便,效果相差不多。

關於如何接入網站上都有文檔,或者也可以諮詢客服,後邊有時間,我可以寫個例子供大家參考。這裏說一些requests如何設置代理ip。

proxies = {"http":"123.231.21.31:3365"}
# 使用proxies參數 以字典的形式 傳入代理IP地址
response = requests.get("http://www.baidu.com",proxies=proxy)

3.封殺非人操作

不知道大家玩遊戲的時候apm(每分鐘操作的次數)是多少?我是個魔獸爭霸和星際的老玩家,基本上也就80左右,那些職業選手基本都是200+,爆發一下可以上400。
如果有人說他的apm1000+,你信不信?
同理可證,服務器如果檢測到一個用戶,快速的在進行網站訪問,達到了一個非正常的用戶的閾值,那也也會進行訪問限制,即你的訪問頻率過高。
所以有時候,我們需要控制一下頻率,畢竟衝多了,會有問題。衝完你需要睡覺休息,以便再衝,程序也是一樣。所以:

time.sleep()是個好東西

在你不斷的騷擾別人服務器的時候, 要稍微控制一下。這樣,你好我好,大家纔好。

任務

如果掌握了需要預備的知識,那麼可以嘗試以下兩個任務

注:這兩個都有json的數據接口,不需要進行html解析

獲取騰訊招聘職位信息:https://careers.tencent.com/search.html
在這裏插入圖片描述

獲取鬥魚顏值主播信息:
https://www.douyu.com/g_yz
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章