python爬取代理IP并進(jìn)行有效的IP測試實(shí)現(xiàn)
爬取代理IP及測試是否可用
很多人在爬蟲時(shí)為了防止被封IP,所以就會(huì)去各大網(wǎng)站上查找免費(fèi)的代理IP,由于不是每個(gè)IP地址都是有效的,如果要進(jìn)去一個(gè)一個(gè)比對(duì)的話效率太低了,我也遇到了這種情況,所以就直接嘗試了一下去網(wǎng)站爬取免費(fèi)的代理IP,并且逐一的測試,最后將有效的IP進(jìn)行返回。
在這里我選擇的是89免費(fèi)代理IP網(wǎng)站進(jìn)行爬取,并且每一個(gè)IP都進(jìn)行比對(duì)測試,最后會(huì)將可用的IP進(jìn)行另存放為一個(gè)列表

一、準(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)頁源碼返回的是整個(gè)網(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)頁源碼提取錯(cuò)誤"
三、解析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", "")
# 提取端口號(hào)
dk = ip.find_all_next("td")[1].string
dk = str(dk).replace(" ", "").replace("\n", "").replace("\t", "")
# 將IP和端口號(hào)進(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é)束前會(huì)輸出有效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)頁源碼提取錯(cuò)誤"
# 解析網(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", "")
# 提取端口號(hào)
dk = ip.find_all_next("td")[1].string
dk = str(dk).replace(" ", "").replace("\n", "").replace("\t", "")
# 將IP和端口號(hào)進(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)文章
聊聊python里如何用Borg pattern實(shí)現(xiàn)的單例模式
這篇文章主要介紹了聊聊python里如何用Borg pattern實(shí)現(xiàn)的單例模式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06
Python+Matplotlib繪制高亮顯示餅圖的示例代碼
餅圖 (Pie Chart) 是一種圓形統(tǒng)計(jì)圖,被分割成片用于表示數(shù)值間的比例關(guān)系,本文為大家介紹了Matplotlib繪制高亮顯示的餅圖的函數(shù)源碼,需要的可以參考一下2023-06-06
pytorch實(shí)現(xiàn)textCNN的具體操作
這篇文章主要介紹了pytorch實(shí)現(xiàn)textCNN的具體操作流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
Python模塊psycopg2連接postgresql的實(shí)現(xiàn)
本文主要介紹了Python模塊psycopg2連接postgresql的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
python導(dǎo)入csv文件出現(xiàn)SyntaxError問題分析
這篇文章主要介紹了python導(dǎo)入csv文件出現(xiàn)SyntaxError問題分析,同時(shí)涉及python導(dǎo)入csv文件的三種方法,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
SublimeText 2編譯python出錯(cuò)的解決方法(The system cannot find the file
這篇文章主要介紹了SublimeText 2編譯python報(bào)The system cannot find the file specified錯(cuò)誤的解決方法,大家參考使用吧2013-11-11
Python中Playwright模塊進(jìn)行自動(dòng)化測試的實(shí)現(xiàn)
playwright是由微軟開發(fā)的Web UI自動(dòng)化測試工具,本文主要介紹了Python中Playwright模塊進(jìn)行自動(dòng)化測試的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
python 列表推導(dǎo)和生成器表達(dá)式的使用
這篇文章主要介紹了python 列表推導(dǎo)和生成器表達(dá)式的使用方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-02-02

