python爬取代理IP并進行有效的IP測試實現(xiàn)
爬取代理IP及測試是否可用
很多人在爬蟲時為了防止被封IP,所以就會去各大網(wǎng)站上查找免費的代理IP,由于不是每個IP地址都是有效的,如果要進去一個一個比對的話效率太低了,我也遇到了這種情況,所以就直接嘗試了一下去網(wǎng)站爬取免費的代理IP,并且逐一的測試,最后將有效的IP進行返回。
在這里我選擇的是89免費代理IP網(wǎng)站進行爬取,并且每一個IP都進行比對測試,最后會將可用的IP進行另存放為一個列表
一、準備工作
導(dǎo)入包并且設(shè)置頭標簽
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和端口號進行連接 ip = td + ":" + dk list.append(ip) # 再進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ù)中主要負責調(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和端口號進行連接 ip = td + ":" + dk list.append(ip) # 再進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并進行有效的IP測試實現(xiàn)的文章就介紹到這了,更多相關(guān)python爬取代理IP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)動態(tài)給類和對象添加屬性和方法操作示例
這篇文章主要介紹了Python實現(xiàn)動態(tài)給類和對象添加屬性和方法操作,涉及Python面向?qū)ο蟪绦蛟O(shè)計中類與對象屬性、方法的動態(tài)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2020-02-02使用python讀取csv文件快速插入數(shù)據(jù)庫的實例
今天小編就為大家分享一篇使用python讀取csv文件快速插入數(shù)據(jù)庫的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06python裝飾器實現(xiàn)對異常代碼出現(xiàn)進行自動監(jiān)控的實現(xiàn)方法
這篇文章主要介紹了python裝飾器實現(xiàn)對異常代碼出現(xiàn)進行自動監(jiān)控的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09