十六、常見的反爬手段和解決思路
1、明確反反爬的主要思路
反反爬的主要思路就是:儘可能的去模擬瀏覽器,瀏覽器在如何操作,程式碼中就如何去實現。
例如:瀏覽器先請求了地址url1,保留了cookie在本地,之後請求地址url2,帶上了之前的cookie,程式碼中也可以這樣去實現。
2、通過headers欄位來反爬
headers中有很多欄位,這些欄位都有可能會被對方伺服器拿過來進行判斷是否為爬蟲
2.1 通過headers中的User-Agent欄位來反爬
反爬原理:爬蟲預設情況下沒有User-Agent
解決方法:請求之前新增User-Agent即可;更好的方式是使用User-Agent池來解決(收集一堆User-Agent的方式,或者是隨機生成User-Agent)
解決方案:
(1)隨機生成User-Agent
import random
def get_ua():
first_num = random.randint(55, 62)
third_num = random.randint(0, 3200)
fourth_num = random.randint(0, 140)
os_type = [
'(Windows NT 6.1; WOW64)', '(Windows NT 10.0; WOW64)', '(X11; Linux x86_64)',
'(Macintosh; Intel Mac OS X 10_12_6)'
]
chrome_version = 'Chrome/{}.0.{}.{}'.format(first_num, third_num, fourth_num)
ua = ' '.join(['Mozilla/5.0', random.choice(os_type), 'AppleWebKit/537.36',
'(KHTML, like Gecko)', chrome_version, 'Safari/537.36']
)
return ua
(2)faker模組: https://www.jianshu.com/p/6bd6869631d9
2.2 通過referer欄位或者是其他欄位來反爬
反爬原理:爬蟲預設情況下不會帶上referer欄位
解決方法:新增referer欄位
2.3 通過cookie來反爬
解決方法:
如果目標網站不需要登入 每次請求帶上前一次返回的cookie,比如requests模組的session。
如果目標網站需要登入 準備多個賬號,通過一個程式獲取賬號對應的cookie,組成、其他程式使用這些cookie。
3、通過js來反爬
普通的爬蟲預設情況下無法執行js,獲取js執行之後的結果,所以很多時候對方伺服器會通過js的技術實現反爬
3.1 通過js實現跳轉來反爬
反爬原理:js實現頁面跳轉,肉眼不可見
解決方法: 在chrome中點選perserve log按鈕實現觀察頁面跳轉情況
在這些請求中,如果請求數量很多,一般來講,只有那些response中帶cookie欄位的請求是有用的,意味著通過這個請求,對方伺服器有設定cookie到本地
3.2 通過js生成了請求引數
反爬原理:js生成了請求引數
解決方法:分析js,觀察加密的實現過程,通過js2py獲取js的執行結果,或者使用selenium來實現
3.3 通過js實現了資料的加密
反爬原理:js實現了資料的加密
解決方法:分析js,觀察加密的實現過程,通過js2py獲取js的執行結果,或者使用selenium來實現
4、通過驗證碼來反爬
反爬原理:對方伺服器通過彈出驗證碼強制驗證使用者瀏覽行為
解決方法:打碼平臺或者是機器學習的方法識別驗證碼,其中打碼平臺廉價易用,更值得推薦
5、通過ip地址來反爬
反爬原理:正常瀏覽器請求網站,速度不會太快,同一個ip大量請求了對方伺服器,有更大的可能性會被識別為爬蟲(id+UA+賬號)
解決方法:對應的通過購買高質量的ip的方式能夠解決問題
6、通過使用者行為來反爬
反爬原理:通過瀏覽器請求資料,很多使用者行為會在瀏覽器中是很容易實現或者無法實現.比如瀏覽器請求額外的圖片地址,服務端進行記錄,出現意味著不是爬蟲(爬蟲中不會主動請求圖片)根據真實使用者的上網的行為習慣進行識別。
解決方法:通過獲取資料的情況來觀察請求,尋找異常出現的可能請求,網銀activeX控制元件。
7、其他的反爬方式
7.1通過自定義字型來反爬
下圖來自貓眼電影電腦版
解決思路:切換到手機版、截圖做影象識別、通過字型檔案處理
7.2 通過css來反爬
下圖來自貓眼去哪兒電腦版
解決思路:計算css的偏移,截圖識別
8、小結
反爬的手段非常多,但是一般而言,完全的模仿瀏覽器的行為即可