爬取代理IP及測試是否可用
不少人在爬蟲時爲了防止被封IP,因此就會去各大網站上查找免費的代理IP,因爲不是每一個IP地址都是有效的,若是要進去一個一個比對的話效率過低了,我也遇到了這種狀況,因此就直接嘗試了一下去網站爬取免費的代理IP,而且逐一的測試,最後將有效的IP進行返回。
在這裏我選擇的是89免費代理IP網站進行爬取,而且每個IP都進行比對測試,最後會將可用的IP進行另存放爲一個列表
html
https://www.89ip.cn/
python
1、準備工做
導入包而且設置頭標籤app
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' }
2、提取網頁源碼
提取網頁源碼返回的是整個網站的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 "網頁源碼提取錯誤"
3、解析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失敗")
4、測試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測試失敗")
5、主函數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)
代碼總體框架已經結束完畢了,最後把全部代碼呈現出了url
完整代碼
# -*- 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)
看到這裏了,若是你們以爲有什麼須要改進的或者有什麼更好的建議能夠在評論區提出來,而後你們共同進步,謝謝!!!spa