python 寫爬蟲獲取數據資料是方便的,但是很多網站設置了反爬蟲機制,最常見的就是限制 IP 頻繁請求了,只要某個 IP 在單位時間內的請求次數超過一定值,網站就不再正常響應了,這時,我們的 python 爬蟲就無法正常工作了。對于這種情況最簡單的方式就是使用代理(proxy)。但是使用還是會出現(xiàn)一些問題,比如下面的例子
在爬蟲端使用urllib.request爬取網站并且添加了代理池的時候,發(fā)現(xiàn)有些網站會出現(xiàn)“無法訪問此網站”的情況(代理是可用的,防火墻已關閉),我們可以從以下一些方面找原因。

1、自己的代理池提供的時候出問題了
2、IP掛了(被反爬)
3、網站有反爬措施,最簡單的是瀏覽器頭驗證
4、劣質代理(網速太慢根本打不開網頁)
這里我們可以換個付費高質量的代理,并且通過python+urllib庫+代理IP然后去訪問網站,多次訪問看下是否能成功。
! -- encoding:utf-8 -- from urllib import request import threading # 導入threading庫,用于多線程 import time # 導入time庫,用于延時
要訪問的目標頁面
targetUrl = “https://www.baidu.com” # 修改為百度
代理服務器(產品官網 www.16yun.cn)
proxyHost = “t.16yun.cn” proxyPort = “31111”
代理驗證信息
proxyUser = “www.16yun.cn” proxyPass = “16ip”
proxyMeta = “http://%(user)s:%(pass)s@%(host)s:%(port)s” % { “host” : proxyHost, “port” : proxyPort, “user” : proxyUser, “pass” : proxyPass, }
proxy_handler = request.ProxyHandler({ “http” : proxyMeta, “https” : proxyMeta, })
opener = request.build_opener(proxy_handler)
request.install_opener(opener)
定義一個鎖對象,用于控制每200毫秒只能請求一次
lock = threading.Lock()
定義一個函數,用于發(fā)起請求和打印響應
def get_url(): # 獲取鎖,如果鎖被占用,就等待,直到鎖釋放 lock.acquire() resp = request.urlopen(targetUrl) # 發(fā)起請求 # 判斷狀態(tài)碼是否為200,如果不是,打印錯誤信息 if resp.status_code == 200: print(resp.read()) # 打印響應內容 else: print(f"請求失敗,狀態(tài)碼為{resp.status_code}") # 打印錯誤信息 time.sleep(0.2) # 延時200毫秒 # 釋放鎖,讓其他線程可以獲取鎖 lock.release()
定義一個列表,用于存放線程對象
threads = []
創(chuàng)建10個線程,每個線程執(zhí)行get_url函數
for i in range(10): t = threading.Thread(target=get_url) # 創(chuàng)建線程對象 threads.append(t) # 將線程對象添加到列表中
啟動所有線程
for t in threads: t.start()
等待所有線程結束
for t in threads: t.join()