之前我們說網站反爬蟲的一個常用方法是檢測ip,限制訪問頻率。所以我們要通過設置代理ip的辦法繞過這個限制。有不少提供免費代理ip的網站,像https://www.xicidaili.com/nt/,我們可以從網站上拿到很多代理ip。但是這些ip並不是每個都能用的,或者說,沒幾個能用的。 我們可以用b ...
之前我們說網站反爬蟲的一個常用方法是檢測ip,限制訪問頻率。所以我們要通過設置代理ip的辦法繞過這個限制。有不少提供免費代理ip的網站,像https://www.xicidaili.com/nt/,我們可以從網站上拿到很多代理ip。但是這些ip並不是每個都能用的,或者說,沒幾個能用的。
我們可以用beautifulsoup分析網頁,然後處理,提取代理ip列表,也可以用正則表達式進行匹配。用正則表達式會快一些。ip_url就是https://www.xicidaili.com/nt/,random_hearder就是一個隨機獲得請求頭的函數。
def download_page(url): headers = random_header() data = requests.get(url, headers=headers) return data def get_proxies(page_num, ip_url): available_ip = [] for page in range(1,page_num): print("抓取第%d頁代理IP" %page) url = ip_url + str(page) r = download_page(url) r.encoding = 'utf-8' pattern = re.compile('<td class="country">.*?alt="Cn" />.*?</td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>', re.S) ip_list = re.findall(pattern, r.text) for ip in ip_list: if test_ip(ip): print('%s:%s通過測試,添加進可用代理列表' %(ip[0],ip[1])) available_ip.append(ip) time.sleep(10)print('抓取結束') return available_ip
拿到ip後我們還需要對ip進行檢測,確定這個ip可以用。怎麼檢測呢?我們可以用代理ip訪問一個能顯示訪問ip的網站,然後檢查請求結果。
def test_ip(ip,test_url='http://ip.tool.chinaz.com/'): proxies={'http': ip[0]+':'+ip[1]} try_ip=ip[0] try: r=requests.get(test_url, headers=random_header(), proxies=proxies) if r.status_code==200: r.encoding='gbk' result=re.search('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',r.text) result=result.group() print(result) if result[:9]==try_ip[:9]:print('%S:%s測試通過' % (ip[0],ip[1])) return True else: print('%s:%s 攜帶代理失敗,使用了本地IP' %(ip[0],ip[1])) return False else: print('%s:%s 請求碼不是200' %(ip[0],ip[1])) return False except Exception as e: print(e) print('%s:%s 錯誤' %(ip[0],ip[1])) return False
有些教程只是拿到200的http狀態碼就認為成功了,這是不對的。因為代理ip訪問不成功,就會預設使用你自己的ip。用我自己的ip訪問當然能成功了。
最後拿到的ip在使用前我們還需要對其進行檢測,因為你不知道什麼時候它就不可用了。所以平時多儲存一些代理ip,免得要用的時候沒得用。
這篇文章的代碼參考了https://blog.csdn.net/XRRRICK/article/details/78650764,我稍微做了一些修改。