如何使用python+urllib庫+代理IP訪問網站

python 寫爬蟲獲取數據資料是方便的,但是很多網站設置了反爬蟲機制,最常見的就是限制 IP 頻繁請求了,只要某個 IP 在單位時間內的請求次數超過一定值,網站就不再正常響應了,這時,我們的 python 爬蟲就無法正常工作了。對于這種情況最簡單的方式就是使用代理(proxy)。但是使用還是會出現(xiàn)一些問題,比如下面的例子

在爬蟲端使用urllib.request爬取網站并且添加了代理池的時候,發(fā)現(xiàn)有些網站會出現(xiàn)“無法訪問此網站”的情況(代理是可用的,防火墻已關閉),我們可以從以下一些方面找原因。


1261704783-59be3000427dd_fix732.png

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()

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容