爬取代理IP及測驗是否可用
很多人在爬蟲時為了防止被封IP,所以就會去各大網站上查找免費的代理IP,由于不是每個IP地址都是有效的,如果要進去一個一個比對的話效率太低了,我也遇到了這種情況,所以就直接嘗試了一下去網站爬取免費的代理IP,并且逐一的測驗,最后將有效的IP進行回傳,
在這里我選擇的是89免費代理IP網站進行爬取,并且每一個IP都進行比對測驗,最后會將可用的IP進行另存放為一個串列
https://www.89ip.cn/
一、準備作業
匯入包并且設定頭標簽
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'
}
二、提取網頁原始碼
提取網頁原始碼回傳的是整個網站的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 "網頁原始碼提取錯誤"
三、決議HTML并提取IP
函式傳入的引數是HTML和存放IP地址的串列
# 決議網頁,提取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請求百度網站,并且傳入代理IP,如果網站回傳狀態碼為200那么說明此IP有效,如果出現其他情況則判斷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: # 如果放回的狀態碼是200,那么說明該IP地址可用
valid_IP.append(ip)
print("該代理IP有效:" + ip)
else:
print("該代理IP無效:" + ip)
except:
print("該代理IP無效:" + ip)
except:
print("IP測驗失敗")
五、主函式main
主函式中主要負責呼叫函式和自定義頁數指定生成URL,并且在程式結束前會輸出有效IP地址
if __name__ == '__main__':
valid_IP = [] # 有效IP地址
for i in range(1, 90): # 可自定義頁數
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)
代碼整體框架已經結束完畢了,最后把所有代碼呈現出了
完整代碼
# -*- 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'
}
# 提取網頁原始碼
def getHtml(url):
try:
reponse = requests.get(url, headers=header)
reponse.raise_for_status()
reponse.encoding = reponse.apparent_encoding
return reponse.text
except:
return "網頁原始碼提取錯誤"
# 決議網頁,提取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: # 如果放回的狀態碼是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): # 可自定義頁數
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)
看到這里了,如果大家覺得有什么需要改進的或者有什么更好的建議可以在評論區提出來,然后大家共同進步,謝謝!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/163565.html
標籤:其他
上一篇:python爬蟲請求頭

