在爬虫的过程中,我们经常会遇见很多网站采取了防爬取技术,或者说因为自己采集网站信息的强度和采集速度太大,给对方服务器带去了太多的压力,所以你一直用同一个代理 ip 爬取这个网页,很有可能 ip 会被禁止访问网页,所以基本上做爬虫的都躲不过去 ip 的问题。因此,我们借助某种方式来伪装 IP,让服务器无法识别,也就是代理的使用。
代理的使用方法
1 2 3 4 5 6 7 8 |
#requests import requests proxy='username:password@127.0.0.0:8889' proxies = { 'http':'http://'+proxy, 'https':'https://'+proxy, } response = requests.get(url='www.httpbin.org/get',proxies=proxies) |
1 2 3 4 5 6 7 |
#chrome from selenium import webdriver proxy='127.0.0.0:8889' chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--proxy-server=http://'+proxy) brower = webdriver.Chrome(chrome_options=chrome_options) brower.get('www.httpbin.org/get') |
1 2 3 4 5 6 7 8 9 |
#PhantomJS from selenium import webdriver service_args = [ '--proxy=127.0.0.1:8888', '-proxy-type=http', '--proxy-auth=username:password' ] brower = webdriver.PhantomJS(service_args=service_args) brower.get('www.httpbin.org/get') |
代理池的维护
从网络获取可用的代理 IP,并保留可用 IP,搭建易用高效的代理池。主要分为四个模块:存储模块、获取模块、检测模块、接口模块。
存储模块
数据库–Redis; 要求–有序、不重复; 形式–127.22.22.22:8888
一个代理,就是Redis集合的一个元素。每个元素有一个分数字段,按照分数排序,分数大的排在后面,可用性就越大。
获取模块
- 定义 Crawler 类:用来从各大网站抓取代理 IP。这里用到元类的知识点,实现扩展仅需添加以 crawl 开头的方法
- 定义 Getter 类:动态调用所有 crawl 开头的方法,获取代理数据,最终存储到Redis数据库中
检测模块
将各个网站获取的代理进行多伦检测:可用则 100 分,不可用则减 1。采用异步请求库aiohttp
检测
- 方法前 async 关键词,代表此方法是异步的
- 异步请求:在请求发出后,程序继续去做其他的事情;当响应到达时,程序再去处理此响应。避免程序堵塞的发生。
接口模块
调度模块
调用获取、检测、接口模块,使得这 3 个模块以多进程的形式运行起来
1 2 |
#服务器后台运行run.py即可 python run.py |
Redis 数据库
Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库。代理池选用 Redis 主要由于其存储数据的有序性,直接使用开源的代理池构建方法。
启动方式
1 2 3 4 |
#linux 启动redis服务 redis-server #打开redis redis-cli |