日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

requests 模块获取免费的代理并检测代理 IP 是否有效!

發布時間:2023/12/16 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 requests 模块获取免费的代理并检测代理 IP 是否有效! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 通過代理服務發送請求

在爬取網頁的過程中,經常會出現不久前可以爬取的網頁現在無法爬取的情況,這是因為您的 IP 被爬取網站的服務器屏蔽了。此時,代理服務可以為您解決這一麻煩,設置代理時,首先需要找到代理地址,例如,58.220.95.80,對應的端口號為 9401,完整的格式為 58.220.95.80:9401。代碼如下:

?

# -*- coding: UTF-8 -*- """ @author:AmoXiang @file:7.代理的應用.py @time:2020/11/13 """import requests # 導入網絡請求模塊 from lxml import etree# 頭部信息 headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36" } proxies = {'http': 'http://58.220.95.80:9401','https': 'https://58.220.95.80:9401' # 設置代理IP與對應的端口號} try:# 對需要爬取的網頁發送請求response = requests.get(url="https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=ip%E5%9C%B0%E5%9D%80",headers=headers, proxies=proxies, timeout=3)print(response.status_code) # 打印響應狀態碼response.encoding = "utf8" # 進行編碼html = etree.HTML(response.text) # 解析HTMLinfo = html.xpath('//*[@id="1"]/div[1]/div[1]/div[2]/table//tr/td//text()')[1:]info = " ".join(info).replace("\xa0", "").strip().replace("本機IP:", "本機IP: ")print(info) # 輸出當前IP匿名信息 except Exception as e:print(f"錯誤異常信息為: {e}") # 打印異常信息

程序運行結果如下圖所示:

由于示例中代理 IP 是免費的,所以使用得時間不固定,超出使用的時間范圍該地址將失效。在地址失效或者地址錯誤時,控制臺將顯示以下所示的異常信息。

?

錯誤異常信息為: HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries exceeded with url: /s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=ip%E5%9C%B0%E5%9D%80(Caused by ProxyError('Cannot connect to proxy.', NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x00000299451C7F08>: Failed to establish a new connection: [WinError 10060] 由于連接方在一段時間后沒有正確答復或連接的主機沒有反應,連接嘗試失敗。')))

2. 獲取免費的代理 IP

為了避免爬取目標網頁的后臺服務器,對我們實施封鎖 IP 的操作。我們可以每發送一次網絡請求更換一個 IP,從而降低被發現的風險。其實在獲取免費的代理 IP 之前,需要先找到提供免費代理 IP 的網頁,然后通過爬蟲技術將大量的代理 IP 提取并保存至文件當中。以某免費代理 IP 網頁為例,實現代碼如下:

?

# -*- coding: UTF-8 -*- """ @author:AmoXiang @file:5.獲取免費的代理ip.py @time:2020/11/12 """import requests # 導入網絡請求模塊 from lxml import etree # 導入 HTML 解析模塊 import pandas as pd # 導入pandas模塊ip_list = [] # 創建保存IP地址的列表 # 頭部信息 headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"" (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36" }def get_ip(url, headers):"""用于獲取指定網站中的ip及端口:param url: 抓取網站的鏈接:param headers: 請求頭:return: None"""response = requests.get(url=url, headers=headers)response.encoding = "utf8" # 設置編碼方式if response.status_code == 200: # 判斷請求是否成功html = etree.HTML(response.text) # 解析HTML# 獲取所有帶有IP的li標簽li_list = html.xpath('//div[@class="container"]/div[2]/ul/li')[1:]for li in li_list: # 遍歷每行內容ip = li.xpath('./span[@class="f-address"]/text()')[0] # 獲取ipport = li.xpath('./span[@class="f-port"]/text()')[0] # 獲取端口ip_list.append(ip + ":" + port)print(f"代理ip為: {ip}, 對應端口為: {port}")if __name__ == '__main__':ip_table = pd.DataFrame(columns=["ip"]) # 創建臨時表格for i in range(1, 5):# 構造免費代理IP的請求地址url = "https://www.dieniao.com/FreeProxy/{}.html".format(i)get_ip(url, headers)ip_table["ip"] = ip_list # 將提取的ip保存至excel文件中的ip列# 生成xlsx文件ip_table.to_excel("ip.xlsx", sheet_name="data")

程序代碼運行后控制臺將顯示如下圖所示的代理 ip 與對應端口,項目文件中將自動生成 ip.xlsx 文件,文件內容如下圖所示:

如果以上示例代碼運行出錯,讀者可以參考以上示例代碼的學習思路,然后爬取其他免費代理IP的網頁。博主這里提供幾個免費的代理 IP 網站:

3. 檢測代理 IP 是否有效

提供免費代理 IP 的網頁有很多,但是經過測試會發現并不是所有的免費代理 IP 都是有效的,甚至更不是匿名IP(即獲取遠程訪問用戶的 IP 地址是代理服務器的 IP 地址,不是用戶本地真實的 IP 地址)。所以要使用我們爬取下來的免費代理 IP,就需要對這個 IP 進行檢測。

實現檢測免費代理 IP 是否可用時,首先需要讀取保存免費代理 IP 的文件,然后對代理 IP 進行遍歷并使用免費的代理 IP 發送網絡請求,而請求地址可以使用查詢 IP 位置的網頁。如果網絡請求成功說明免費的代理 IP 可以使用,并且還會返回當前免費代理 IP 的匿名地址。代碼如下:

?

# -*- coding: UTF-8 -*- """ @author:AmoXiang @file:6.檢測代理ip是否有效.py @time:2020/11/12 """import requests # 導入網絡請求模塊 import pandas as pd # 導入pandas模塊 from lxml import etree # 導入HTML解析模塊ip_table = pd.read_excel("ip.xlsx") # 讀取代理IP文件內容 ip_list = ip_table["ip"] # 獲取代理IP信息 # 頭部信息 headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36" } # 循環遍歷代理IP并通過代理發送網絡請求 for ip in ip_list:# 這里添加了http和https兩個代理,這樣寫是因為有些網頁采用 http協議,有的則采用https協議,# 為了在這兩類網頁上都能順利使用代理,所以一般都同時寫上。當然,如果確定了某網頁的請求類型,可以只寫一種proxies = {'http': 'http://{ip}'.format(ip=ip),'https': 'https://{ip}'.format(ip=ip)}try:response = requests.get("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=ip%E5%9C%B0%E5%9D%80",headers=headers, timeout=3, proxies=proxies)if response.status_code == 200: # 判斷是否請求成功,請求成功說明代理IP可用response.encoding = "utf8" # 進行編碼html = etree.HTML(response.text) # 解析HTMLinfo = html.xpath('//*[@id="1"]/div[1]/div[1]/div[2]/table//tr/td//text()')[1:]info = " ".join(info).replace("\xa0", "").strip().replace("本機IP:", "本機IP: ")print(info) # 輸出當前IP匿名信息except Exception as e:# print(e) # 打印異常信息pass

程序運行結果如下圖所示:

由于博主網絡原因,故測試出來的可用的 IP 地址較少。讀者可以根據自己查找的(IP查詢)請求地址進行更換測試。免費的 IP 地址可用的較少,可以購買付費代理。

近期有很多朋友通過私信咨詢有關Python學習問題。為便于交流,點擊藍色自己加入討論解答資源基地

?

總結

以上是生活随笔為你收集整理的requests 模块获取免费的代理并检测代理 IP 是否有效!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。