成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一日一技:反爬蟲的極致手段,幾行代碼直接炸了爬蟲服務器

開發 架構
網站服務器可能會使用gzip壓縮一些大資源,這些資源在網絡上傳輸的時候,是壓縮后的二進制格式。

作為一個站長,你是不是對爬蟲不勝其煩?爬蟲天天來爬,速度又快,頻率又高,服務器的大量資源被白白浪費。

看這篇文章的你有福了,我們今天一起來報復一下爬蟲,直接把爬蟲的服務器給干死機。

本文有一個前提:你已經知道某個請求是爬蟲發來的了,你不滿足于單單屏蔽對方,而是想搞死對方。

很多人的爬蟲是使用Requests來寫的,如果你閱讀過Requests的文檔,那么你可能在文檔中的Binary Response Content[1]這一小節,看到這樣一句話:

The gzip and deflate transfer-encodings are automatically decoded for you.

(Request)會自動為你把gzip和deflate轉碼后的數據進行解碼

網站服務器可能會使用gzip壓縮一些大資源,這些資源在網絡上傳輸的時候,是壓縮后的二進制格式。客戶端收到返回以后,如果發現返回的Headers里面有一個字段叫做Content-Encoding,其中的值包含gzip,那么客戶端就會先使用gzip對數據進行解壓,解壓完成以后再把它呈現到客戶端上面。瀏覽器自動就會做這個事情,用戶是感知不到這個事情發生的。而requests、Scrapy這種網絡請求庫或者爬蟲框架,也會幫你做這個事情,因此你不需要手動對網站返回的數據解壓縮。

這個功能原本是一個方便開發者的功能,但我們可以利用這個功能來做報復爬蟲的事情。

我們首先寫一個客戶端,來測試一下返回gzip壓縮數據的方法。

我首先在硬盤上創建一個文本文件text.txt,里面有兩行內容,如下圖所示:

然后,我是用gzip命令把它壓縮成一個.gz文件:

cat text.txt | gzip > data.gz

接下來,我們使用FastAPI寫一個HTTP服務器server.py:

from fastapi import FastAPI, Response
from fastapi.responses import FileResponse


app = FastAPI()


@app.get('/')
def index():
resp = FileResponse('data.gz')
return resp

然后使用命令uvicorn server:app啟動這個服務。

接下來,我們使用requests來請求這個接口,會發現返回的數據是亂碼,如下圖所示:

返回的數據是亂碼,這是因為服務器沒有告訴客戶端,這個數據是gzip壓縮的,因此客戶端只有原樣展示。由于壓縮后的數據是二進制內容,強行轉成字符串就會變成亂碼。

現在,我們稍微修改一下server.py的代碼,通過Headers告訴客戶端,這個數據是經過gzip壓縮的:

from fastapi import FastAPI, Response
from fastapi.responses import FileResponse


app = FastAPI()


@app.get('/')
def index():
resp = FileResponse('data.gz')
resp.headers['Content-Encoding'] = 'gzip' # 說明這是gzip壓縮的數據
return resp

修改以后,重新啟動服務器,再次使用requests請求,發現已經可以正常顯示數據了:

這個功能已經展示完了,那么我們怎么利用它呢?這就不得不提到壓縮文件的原理了。

文件之所以能壓縮,是因為里面有大量重復的元素,這些元素可以通過一種更簡單的方式來表示。壓縮的算法有很多種,其中最常見的一種方式,我們用一個例子來解釋。假設有一個字符串,它長成下面這樣:

1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111

我們可以用5個字符來表示:192個1。這就相當于把192個字符壓縮成了5個字符,壓縮率高達97.4%。

如果我們可以把一個1GB的文件壓縮成1MB,那么對服務器來說,僅僅是返回了1MB的二進制數據,不會造成任何影響。但是對客戶端或者爬蟲來說,它拿到這個1MB的數據以后,就會在內存中把它還原成1GB的內容。這樣一瞬間爬蟲占用的內存就增大了1GB。如果我們再進一步增大這個原始數據,那么很容易就可以把爬蟲所在的服務器內存全部沾滿,輕者服務器直接殺死爬蟲進程,重則爬蟲服務器直接死機。

你別以為這個壓縮比聽起來很夸張,其實我們使用很簡單的一行命令就可以生成這樣的壓縮文件。

如果你用的是Linux,那么請執行命令:

dd if=/dev/zero bs=1M count=1000 | gzip > boom.gz

如果你的電腦是macOS,那么請執行命令:

dd if=/dev/zero bs=1048576 count=1000 | gzip > boom.gz

執行過程如下圖所示:

生成的這個boom.gz文件只有995KB。但是如果我們使用gzip -d boom.gz對這個文件解壓縮,就會發現生成了一個1GB的boom文件,如下圖所示:

只要大家把命令里面的count=1000改成一個更大的數字,就能得到更大的文件。

我現在把count改成10,給大家做一個演示(不敢用1GB的數據來做測試,害怕我的Jupyter崩潰)。生成的boom.gz文件只有10KB:

服務器返回一個10KB的二進制數據,沒有任何問題。

現在我們用requests去請求這個接口,然后查看一下resp這個對象占用的內存大小:

可以看到,由于requests自動會對返回的數據解壓縮,因此最終獲得的resp對象竟然有10MB這么大。

如果大家想使用這個方法,一定要先確定這個請求是爬蟲發的,再使用。否則被你干死的不是爬蟲而是真實用戶就麻煩了。

本文的寫作過程中,參考了文章網站gzip炸彈 – 王春偉的技術博客[2],特別感謝原作者。

參考文獻

[1] Binary Response Content: https://2.python-requests.org/en/master/user/quickstart/#binary-response-content

[2] 網站gzip炸彈 – 王春偉的技術博客: http://da.dadaaierer.com/?p=577


責任編輯:武曉燕 來源: 未聞Code
相關推薦

2023-10-28 12:14:35

爬蟲JavaScriptObject

2021-09-26 05:01:55

Scrapy項目爬蟲

2024-10-16 21:47:15

2021-12-15 22:04:11

瀏覽器重復登錄

2022-01-26 07:35:10

爬蟲Requestsgzip

2021-06-08 21:36:24

PyCharm爬蟲Scrapy

2020-12-04 06:39:25

爬蟲網頁

2021-11-12 05:00:43

裝飾器代碼功能

2022-01-08 21:27:02

URL爬蟲地址

2024-07-30 08:11:16

2024-07-30 08:16:18

Python代碼工具

2021-11-23 21:03:47

代碼電腦False

2021-03-18 23:28:45

Python反斜杠字符串

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2023-10-29 09:16:49

代碼安全命令

2021-10-15 21:08:31

PandasExcel對象

2022-06-28 09:31:44

LinuxmacOS系統

2024-11-13 09:18:09

2021-04-05 14:47:55

Python多線程事件監控

2022-03-12 20:38:14

網頁Python測試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产婷婷国产香蕉 | 天天曰夜夜操 | 久久久精品一区 | 亚洲国产成人av | 婷婷在线网站 | 国产伦精品一区二区三毛 | 成人二区| 成人久久久久 | 亚洲精品中文字幕在线 | 久国久产久精永久网页 | 久久久免费 | 日韩精品在线看 | 日韩欧美在线观看一区 | 国产精品一区二区三区久久 | 日韩中文字幕久久 | 一级午夜aaa免费看三区 | 国产精品揄拍一区二区 | 在线观看国产 | 亚洲国产一区二区三区在线观看 | 日本aⅴ中文字幕 | 国产在线精品一区二区 | 视频一区二区在线观看 | 日本一区二区视频 | 免费亚洲婷婷 | 欧美日韩一区在线 | 九色视频网站 | 亚洲一区三区在线观看 | 久久久国产一区二区三区 | 欧美日韩亚洲视频 | 午夜小视频在线观看 | 91av精品 | 久久九九色 | 粉色午夜视频 | 欧美日韩精品区 | 精品国产亚洲一区二区三区大结局 | 亚洲精品一区在线观看 | 国产人成精品一区二区三 | 九九九视频精品 | 国产在线精品一区二区 | 一区二区三区视频在线观看 | 成人精品视频99在线观看免费 |