python爬取代理IP并進(jìn)行有效的IP測試實(shí)現(xiàn)
爬取代理IP及測試是否可用
很多人在爬蟲時為了防止被封IP,所以就會去各大網(wǎng)站上查找免費(fèi)的代理IP,由于不是每個IP地址都是有效的,如果要進(jìn)去一個一個比對的話效率太低了,我也遇到了這種情況,所以就直接嘗試了一下去網(wǎng)站爬取免費(fèi)的代理IP,并且逐一的測試,最后將有效的IP進(jìn)行返回。
在這里我選擇的是89免費(fèi)代理IP網(wǎng)站進(jìn)行爬取,并且每一個IP都進(jìn)行比對測試,最后會將可用的IP進(jìn)行另存放為一個列表
一、準(zhǔn)備工作
導(dǎo)入包并且設(shè)置頭標(biāo)簽
import requests from bs4 import BeautifulSoup header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36' }
二、提取網(wǎng)頁源碼
提取網(wǎng)頁源碼返回的是整個網(wǎng)站的HTML
def getHtml(url): try: reponse = requests.get(url, headers=header) reponse.raise_for_status() reponse.encoding = reponse.apparent_encoding return reponse.text except: return "網(wǎng)頁源碼提取錯誤"
三、解析HTML并提取IP
函數(shù)傳入的參數(shù)是HTML和存放IP地址的列表
# 解析網(wǎng)頁,提取IP def getIp(html, list): try: soup = BeautifulSoup(html, "html.parser") tr = soup.find("tbody").find_all_next("tr") for ip in tr: # 提取IP td = ip.find_next("td").string td = str(td).replace(" ", "").replace("\n", "").replace("\t", "") # 提取端口號 dk = ip.find_all_next("td")[1].string dk = str(dk).replace(" ", "").replace("\n", "").replace("\t", "") # 將IP和端口號進(jìn)行連接 ip = td + ":" + dk list.append(ip) # 再進(jìn)IP地址存放至指定列表中去 except: print("獲取IP失敗")
四、測試IP是否可用
在這里測試IP的原理是用requests請求百度網(wǎng)站,并且傳入代理IP,如果網(wǎng)站返回狀態(tài)碼為200那么說明此IP有效,如果出現(xiàn)其他情況則判斷IP地址無效
# 測試出可用IP def ip_text(list, valid_IP): try: url = "https://www.baidu.com//" for ip in list: try: rep = requests.get(url, proxies={'https': ip}, headers=header, timeout=0.5) if rep.status_code == 200: # 如果放回的狀態(tài)碼是200,那么說明該IP地址可用 valid_IP.append(ip) print("該代理IP有效:" + ip) else: print("該代理IP無效:" + ip) except: print("該代理IP無效:" + ip) except: print("IP測試失敗")
五、主函數(shù)main
主函數(shù)中主要負(fù)責(zé)調(diào)用函數(shù)和自定義頁數(shù)指定生成URL,并且在程序結(jié)束前會輸出有效IP地址
if __name__ == '__main__': valid_IP = [] # 有效IP地址 for i in range(1, 90): # 可自定義頁數(shù) ip_list = [] # 存放所有爬取到的ip url = "https://www.89ip.cn/index_" + str(i) + ".html" print(url) html = getHtml(url) getIp(html, ip_list) ip_text(ip_list, valid_IP) print("=" * 30) print("測試完成,有效IP如下:") print("-" * 30) for a in valid_IP: print(a) print("=" * 30)
代碼整體框架已經(jīng)結(jié)束完畢了,最后把所有代碼呈現(xiàn)出了
完整代碼
# -*- coding: utf-8 -*- # Author : YRH # Data : 2020/10/07 # Project : 爬取代理IP并且測試可用IP # Tool : PyCharm import requests from bs4 import BeautifulSoup header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36' } # 提取網(wǎng)頁源碼 def getHtml(url): try: reponse = requests.get(url, headers=header) reponse.raise_for_status() reponse.encoding = reponse.apparent_encoding return reponse.text except: return "網(wǎng)頁源碼提取錯誤" # 解析網(wǎng)頁,提取IP def getIp(html, list): try: soup = BeautifulSoup(html, "html.parser") tr = soup.find("tbody").find_all_next("tr") for ip in tr: # 提取IP td = ip.find_next("td").string td = str(td).replace(" ", "").replace("\n", "").replace("\t", "") # 提取端口號 dk = ip.find_all_next("td")[1].string dk = str(dk).replace(" ", "").replace("\n", "").replace("\t", "") # 將IP和端口號進(jìn)行連接 ip = td + ":" + dk list.append(ip) # 再進(jìn)IP地址存放至指定列表中去 except: print("獲取IP失敗") # 測試出可用IP def ip_text(list, valid_IP): try: url = "https://www.baidu.com//" for ip in list: try: rep = requests.get(url, proxies={'https': ip}, headers=header, timeout=0.5) if rep.status_code == 200: # 如果放回的狀態(tài)碼是200,那么說明該IP地址可用 valid_IP.append(ip) print("該代理IP有效:" + ip) else: print("該代理IP無效:" + ip) except: print("該代理IP無效:" + ip) except: print("IP測試失敗") if __name__ == '__main__': valid_IP = [] # 有效IP地址 for i in range(1, 90): # 可自定義頁數(shù) ip_list = [] # 存放所有爬取到的ip url = "https://www.89ip.cn/index_" + str(i) + ".html" print(url) html = getHtml(url) getIp(html, ip_list) ip_text(ip_list, valid_IP) print("=" * 30) print("測試完成,有效IP如下:") print("-" * 30) for a in valid_IP: print(a) print("=" * 30)
到此這篇關(guān)于python爬取代理IP并進(jìn)行有效的IP測試實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python爬取代理IP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django中賬號密碼驗(yàn)證登陸功能的實(shí)現(xiàn)方法
這篇文章主要介紹了django中賬號密碼驗(yàn)證登陸功能的實(shí)現(xiàn)方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07Python實(shí)現(xiàn)動態(tài)給類和對象添加屬性和方法操作示例
這篇文章主要介紹了Python實(shí)現(xiàn)動態(tài)給類和對象添加屬性和方法操作,涉及Python面向?qū)ο蟪绦蛟O(shè)計中類與對象屬性、方法的動態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-02-02使用python讀取csv文件快速插入數(shù)據(jù)庫的實(shí)例
今天小編就為大家分享一篇使用python讀取csv文件快速插入數(shù)據(jù)庫的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06python裝飾器實(shí)現(xiàn)對異常代碼出現(xiàn)進(jìn)行自動監(jiān)控的實(shí)現(xiàn)方法
這篇文章主要介紹了python裝飾器實(shí)現(xiàn)對異常代碼出現(xiàn)進(jìn)行自動監(jiān)控的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09