python爬蟲防止IP被封的一些措施

在編寫爬蟲爬取數據的時候,由於不少網站都有反爬蟲措施,因此很容易被封IP,就不能繼續爬了。在爬取大數據量的數據時更是瑟瑟發抖,時刻擔憂着下一秒IP可能就被封了。html

本文就如何解決這個問題總結出一些應對措施,這些措施能夠單獨使用,也能夠同時使用,效果更好。python

僞造User-Agent

在請求頭中把User-Agent設置成瀏覽器中的User-Agent,來僞造瀏覽器訪問。好比:git

headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}
resp = requests.get(url,headers = headers)

還能夠先收集多種瀏覽器的User-Agent,每次發起請求時隨機從中選一個使用,能夠進一步提升安全性:github

In [7]: import requests,random

In [8]: user_agents = ['Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50','Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11']

In [9]: def get_html(url):
   ...:     headers = {'User-Agent':random.choice(user_agents)}
   ...:     resp = requests.get(url,headers = headers)
   ...:     return resp.text

把上面隨機選擇一個User-Agent的代碼封裝成一個函數:瀏覽器

import random
def get_headers():
    '''
    隨機獲取一個headers
    '''
    user_agents =  ['Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50','Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11']
    headers = {'User-Agent':random.choice(user_agents)}
    return headers

注:一些常見瀏覽器的User-Agent可參見:https://blog.csdn.net/qianxing111/article/details/79415857安全

在每次重複爬取之間設置一個隨機時間間隔

好比:
time.sleep(random.randint(0,3))  # 暫停0~3秒的整數秒,時間區間:[0,3]
或:
time.sleep(random.random())  # 暫停0~1秒,時間區間:[0,1)

僞造cookies

若從瀏覽器中能夠正常訪問一個頁面,則能夠將瀏覽器中的cookies複製過來使用,好比:cookie

cookies = dict(uuid='b18f0e70-8705-470d-bc4b-09a8da617e15',UM_distinctid='15d188be71d50-013c49b12ec14a-3f73035d-100200-15d188be71ffd')
resp = requests.get(url,cookies = cookies)
# 把瀏覽器的cookies字符串轉成字典
def cookies2dict(cookies):
    items = cookies.split(';')
    d = {}
    for item in items:
        kv = item.split('=',1)
        k = kv[0]
        v = kv[1]
        d[k] = v
    return d

注:用瀏覽器cookies發起請求後,若是請求頻率過於頻繁仍會被封IP,這時能夠在瀏覽器上進行相應的手工驗證(好比點擊驗證圖片等),而後就能夠繼續正常使用該cookies發起請求。app

使用代理

能夠換着用多個代理IP來進行訪問,防止同一個IP發起過多請求而被封IP,好比:dom

proxies = {'http':'http://10.10.10.10:8765','https':'https://10.10.10.10:8765'}
resp = requests.get(url,proxies = proxies)
# 注:免費的代理IP能夠在這個網站上獲取:http://www.xicidaili.com/nn/

附:GitHub上的一個"反反爬蟲"項目

道高一尺魔高一丈,你有反爬蟲措施,那我也有各類"反反爬蟲"的措施,GitHub上就有一位大神專門整理了一個這樣的項目:Anti-Anti-Spider,連接地址爲:
https://github.com/luyishisi/Anti-Anti-Spider
能夠研究一下。ide

做者:m2fox
連接:

https://www.jianshu.com/p/736412753551


識別圖中二維碼,領取python全套視頻資料

相關文章
相關標籤/搜索