Python自建代理池是非常有必要的,因為現今的互聯網環境下,使用代理可以有效的解決一些網絡訪問的問題,比如訪問一些需要實名認證、需要解禁或者受到封鎖的網站等。本文將介紹Python自建代理池的實現方法。
Python自建代理池可以通過網上免費的代理IP資源進行搜集,比如“西刺代理”、“89免費代理”等網站上的IP地址可以進行如下爬取。
import requests from lxml import etree def get_proxy(): headers = { 'User-Agent': 'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36' } url = 'http://www.xicidaili.com/nn/' response = requests.get(url=url, headers=headers) html = etree.HTML(response.text) proxies = html.xpath('//tr[@class="odd"]//td[2]/text()') ports = html.xpath('//tr[@class="odd"]//td[3]/text()') proxies_list = [proxy + ':' + port for proxy, port in zip(proxies, ports)] return proxies_list
以上代碼通過利用requests和lxml庫來發送請求,并獲取代理IP地址,如果需要獲得更多的IP地址,可以將url改成其他的網站鏈接,達到不同的效果。
獲取到代理IP之后,需要對IP地址進行驗證,否則將無法使用,可以利用以下代碼對代理IP進行篩選。
import requests def check_proxy(proxies_list): available_proxies = [] url = "http://icanhazip.com" for proxy in proxies_list: try: proxy_dict = {'http': 'http://' + proxy, 'https': 'https://' + proxy} response = requests.get(url=url, proxies=proxy_dict, timeout=3) if response.status_code == 200: available_proxies.append(proxy) except Exception as e: print(e) return available_proxies
以上代碼將每個代理IP使用requests庫發送請求,如果連接成功就代表該IP地址能夠使用,可以將該地址存到available_proxies數組中。
最后,我們將所有可用的代理IP存到本地文件,并在需要使用代理的時候進行加載即可。
import random def save_proxies(proxies_list): with open('proxies.txt', 'w') as f: f.write('\n'.join(proxies_list)) def load_proxies(): with open('proxies.txt', 'r') as f: proxies_list = f.read().split('\n') return proxies_list if __name__ == '__main__': proxies_list = get_proxy() available_proxies = check_proxy(proxies_list) save_proxies(available_proxies) proxies = load_proxies() proxy_dict = {'http': 'http://' + random.choice(proxies), 'https': 'https://' + random.choice(proxies)}
以上代碼可以將可用的代理IP存儲到本地文件,下次使用時只需要讀取即可,將隨機抽取的IP地址使用proxy_dict字典即可實現代理IP的使用。
通過以上的方法,不僅可以提高爬蟲的性能,而且可以避免因為IP地址被封鎖而無法進行正常的數據爬取。