【Python】爬虫代理IP的使用+建立代理IP池
前言
在进行网络爬虫开发时,我们很容易遭遇反爬虫机制的阻碍。为了规避反爬虫机制,我们可以使用代理IP。代理IP是指通过代理服务器获取的可用于访问目标网站的IP地址,通过使用代理IP,我们可以隐藏自己的真实IP地址,避免被目标网站封禁。
但是,在使用代理IP时,我们需要注意一些问题:
本文将介绍如何使用python爬虫实现代理IP的使用以及代理IP池的建立。
一、代理IP
我们可以从代理IP供应商处购买或免费获取代理IP,也可以自己搭建代理服务器获取代理IP。
这里以免费获取代理IP为例。我们可以从以下网站获取免费代理IP:
https://www.zdaye.com/ https://www.kxdaili.com/ https://www.ip3366.net/通过免费获取的代理IP,我们不能保证其全部可用。因此,我们需要对代理IP进行验证。
验证代理IP的代码如下:
import requests def check_proxy(proxy): try: res = requests.get('http://www.baidu.com', proxies=proxy, timeout=5) if res.status_code == 200: return True else: return False except: return False我们通过访问百度网站来验证代理IP的可用性。如果可以成功访问,则返回True,否则返回False。如果代理IP的可用性值为True,则可以将其添加到代理IP池中,供后续使用。
使用代理IP的代码如下:
import requests def get_html(url, proxy): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} try: res = requests.get(url, headers=headers, proxies=proxy, timeout=5) if res.status_code == 200: return res.text else: return None except: return None我们通过为requests库的get方法传递一个proxies参数来使用代理IP。如果请求成功,则返回响应内容;否则返回None,表示请求失败。
二、建立代理IP池
我们可以从多个代理IP供应商处获取代理IP。在使用代理IP时,我们随机从代理IP池中选择一个代理IP,保证请求的随机性,提高反爬虫机制的规避效果。
代理IP池的建立代码如下:
import random import requests class ProxyPool(object): def __init__(self): self.pool = [] def add_proxy(self, proxy): if self.check_proxy(proxy): self.pool.append(proxy) def check_proxy(self, proxy): try: res = requests.get('http://www.baidu.com', proxies=proxy, timeout=5) if res.status_code == 200: return True else: return False except: return False def get_proxy(self): if not self.pool: return None return random.choice(self.pool)我们可以通过add_proxy方法往代理IP池中添加代理IP,通过get_proxy方法来随机获取一个可用的代理IP。
在使用代理IP时,我们需要不断地维护代理IP池,剔除失效的代理IP,添加新的代理IP。
动态维护代理IP池的代码示例:
import time from threading import Thread class ProxyPool(object): def __init__(self): self.pool = [] self.check_interval = 600 # 代理IP检查周期,单位为秒 Thread(target=self.check_proxy_loop).start() def add_proxy(self, proxy): if self.check_proxy(proxy): self.pool.append(proxy) def check_proxy(self, proxy): try: res = requests.get('http://www.baidu.com', proxies=proxy, timeout=5) if res.status_code == 200: return True else: return False except: return False def get_proxy(self): if not self.pool: return None return random.choice(self.pool) def check_proxy_loop(self): while True: for proxy in self.pool: if not self.check_proxy(proxy): self.pool.remove(proxy) print('{} removed from proxy pool'.format(proxy)) time.sleep(self.check_interval)在代理IP池的构造函数中,我们创建了一个线程来循环检查代理IP池中的代理IP。如果检查到某个代理IP失效,则将其从代理IP池中移除,并在控制台输出信息提示。
三、完整代码
import random import requests from threading import Thread import time class ProxyPool(object): def __init__(self): self.pool = [] self.check_interval = 600 # 代理IP检查周期,单位为秒 Thread(target=self.check_proxy_loop).start() def add_proxy(self, proxy): if self.check_proxy(proxy): self.pool.append(proxy) def check_proxy(self, proxy): try: res = requests.get('http://www.baidu.com', proxies=proxy, timeout=5) if res.status_code == 200: return True else: return False except: return False def get_proxy(self): if not self.pool: return None return random.choice(self.pool) def check_proxy_loop(self): while True: for proxy in self.pool: if not self.check_proxy(proxy): self.pool.remove(proxy) print('{} removed from proxy pool'.format(proxy)) time.sleep(self.check_interval) def main(): proxy_pool = ProxyPool() url = 'https://www.baidu.com' proxy = {'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'} html = get_html(url, proxy) print(html) if __name__ == '__main__': main()总结
本文介绍了如何使用python爬虫实现代理IP的使用以及代理IP池的建立。在使用代理IP时,我们需要注意代理IP的质量和多样性。在使用代理IP池时,我们需要不断地维护代理IP池,剔除失效的代理IP,添加新的代理IP,以免影响爬虫的性能。