通过Flask和Redis构造一个动态维护的代理池
代理池的维护
目前有很多网站提供免费代理,而且种类齐全,比如各个地区、各个匿名级别的都有,不过质量实在不敢恭维,毕竟都是免费公开的,可能一个代理无数个人在用也说不定。所以我们需要做的是大量抓取这些免费代理,然后筛选出其中可用的代理存储起来供我们使用,不可用的进行剔除。
获取代理的途径
维护一个代理池第一步就是要找到提供免费代理的站点,例如PROXY360,网页内容如下:
而且可以看到网页里提供了一些免费代理列表,包括服务器地址、端口、代理种类、地区、更新时间等等信息。
当前我们需要的就是代理服务器和端口信息,将其爬取下来即可。
维护代理
那么问题来了,当我们把这些免费的代理爬取下来后,该怎么去保存他们?
首先我们需要确保这个数据库可以是我们边存边取,另外还需要定时检查队列中那些过期的代理并将它们剔除,所以需要易于存取。
另外怎么区分代理的新旧,如果按照代理网站上给出的代理的修改时间来标识是可行的,但是更简单的方法就是维护一个队列,确保只从一端存入,例如右端,这样就能确保最新的代理一直处于队列的右段,而在队列左端的则是存取时间较长的,那么在使用时我们就可以提取队列右端的代理来使用。
那么对于队列左端的代理我们也不能就这么任其老化,还要做的操作就是把左端的代理提取出来,进行测试,将那些可以使用的放入队列右端,不能使用了的则剔除队列。
通过以上操作,就保证了队列里的代理一直处于可用状态。
所以从目前来看,既能高效处理,又可以做到队列动态维护,合适的方法就是使用Redis数据库的队列。
下面这张流程图就是整个代理队列需要具备的功能:
可以定义一个类来维护一个Redis队列,比如get方法是从左端取出,put方法是从右端放入,pop方法时从右端取出可用代理。
import redisfrom proxypool.error import PoolEmptyErrorfrom proxypool.setting import HOST,PORT,PASSWORD
class RedisClient(object): def __init__(self,host=HOST,port=PORT,password=PASSWORD): if password: self._db = redis.Redis(host,port,password) else: self._db = redis.Redis(host,port)
def get(self, count=1): proxies = self._db.Irange("proxies",0, count - 1) self._db.Itrim("proxis", count, -1) return proxies
def put(self,proxy): self._db.rpush("proxies", proxy)
def pop(self,self): try: self._db.rpop("proxies").decode('utf-8') except: raise PoolEmptyError
检测代理
那么如何来检测代理是否可用呢?可以使用这个代理来请求某个网站,如果返回的200则证明这个代理可用,否则代理不可使用。
conn = RedisClient()
proxies = {'http': proxy}
r = requests.get(url,proxies=proxies)
if r.status_code == 200:conn.put(proxy)
例如在这里proxy就是要检测的代理,使用requests库设置好这个代理,然后请求百度,正常请求,那就可以将这个代理存入Redis。
获取可用代理
现在我们维护了一个代理池,那么这个代理池需要是可以公用的。
比如现在有多个爬虫项目都需要用到代理,而代理池的维护作为另外的一个项目,他们之间如果要建立连接,最恰当的方式就是接口。
所以可以利用Web服务器来实现一个接口,其他的项目通过请求这个接口得到内容获取到一个可用代理,这样保证了代理池的通用性。
所以要实现这个还需要一个Web服务器,例如Flask,Tornado等等。
例如使用Flask,定义一个路由,然后调用的RedisClient的pop方法,返回结果即可。
@app.route('/get')
def get_proxy():conn = RedisClient() return conn.pop()
这样一来,整个程序运行起来后,请求网页就可以看到一个可用代理了。
使用代理
使用代理只需要请求这个站点,就可以拿到使用的代理了。
def get_proxy():r = requests.get('http://127.0.0.1:5000/get')proxy = r.textreturn proxydef crawl(url, proxy):proxies = {'http': get_proxy()}r = requests.get(url, proxies=proxies)#do something
样例实现
https://github.com/gzf1234/ProxyPool
转载于:https://www.cnblogs.com/coder-gao/p/7559801.html
通过Flask和Redis构造一个动态维护的代理池相关推荐
- 动态可维护ip代理池搭建(定时更新模块)
动态可维护ip代理池(爬虫模块)继上一次的爬虫模块,我们先来优化一下并添加redis配置参数,参数配置以自身机器设定. import random import time import request ...
- 实现一个免费的IP代理池
我将代理池程序设计为4个模块:存储模块,获取模块,检查模块,接口模块.模块之间关系如下: 存储模块:我使用的是redis数据库存储,使用的是redis中的集合,集合内元素无序并且无重复.该存储模块的主 ...
- 使用redis所维护的代理池抓取微信文章
搜狗搜索可以直接搜索微信文章,本次就是利用搜狗搜搜出微信文章,获得详细的文章url来得到文章的信息.并把我们感兴趣的内容存入到mongodb中. 因为搜狗搜索微信文章的反爬虫比较强,经常封IP,所以要 ...
- 如何制作一个自己的IP代理池
开始前的准备 注:在开始完成这个项目之前,需要懂一些简单的爬虫知识和tkinter的界面相关知识,不过这些相关的内容,博主也会通过链接的方式,在其他文章内对其进行详细描述,手把手教你完成一个IP代理池 ...
- 墨墨背单词刷分享链接访问量(动态获取IP代理池)
墨墨背单词 分享链接刷点击量(自动获取最新IP代理池方式),以提高单词上限. 运行方式 1 Python 环境运行main.py 1.1 克隆本仓库 Github仓库 Momo-Share-Fresh ...
- 搭建一个基于flask和redis的代理池(proxy pool)
在进行网页爬虫的项目时,常常会因为爬取的频率过高而触发 反爬虫机制 ,这时候,面临两个选择: 休息片刻.一般反爬虫机制不会进行永久的IP封禁,只是暂时限制访问而已,等待封禁时间结束再进行爬取即可.当然 ...
- python ip动态代理_给自己的爬虫做一个简单的动态代理池
使用代理服务器一直是爬虫防BAN最有效的手段,但网上的免费代理往往质量很低,大部分代理完全不能使用,剩下能用的代理很多也只有几分钟的寿命,没法直接用到爬虫项目中. 下面简单记录一下我用scrapy+r ...
- 爬虫实战(一)—利用requests、mongo、redis代理池爬取英雄联盟opgg实时英雄数据
概述 可关注微信订阅号 loak 查看实际效果. 代码已托管github,地址为:https://github.com/luozhengszj/LOLGokSpider 包括了项目的所有代码. 此篇文 ...
- Python3网络爬虫开发实战,IP代理池的维护
我们在上一节了解了代理的设置方法,利用代理我们可以解决目标网站封 IP 的问题,而在网上又有大量公开的免费代理,其中有一部分可以拿来使用,或者我们也可以购买付费的代理 IP,价格也不贵.但是不论是免费 ...
最新文章
- idea 两次运行同一main方法 开启两个进程
- Android的单位px,pt,dp,sp总结和获取屏幕分辨率
- Ionic2 下处理 Android 设备下返回按钮的事件
- C#之根据域名获取IP地址
- 1.2 案例:波士顿房价预测
- JAVA发送邮件案例
- 编程的一些小知识点总结
- 【洛谷P2872】道路建设(最小生成树prim/kruskal)
- NFC读写器|读卡器ACR122U-A9的ActiveX控制在IE网页WEB调用的问题与解决方法
- 机器学习-----车标识别
- MyEclipse 注册码
- 用EndNote引用文献出现‘参数错误’解决方式
- Three things can't discuss with with people: Religion, Politics and The Great Pumpkin. Why?为什么不能谈论?
- 美国最受欢迎的婴儿名字:女孩Sophia和男孩Liam
- python和jsp哪个好学_Python,Java和JavaScript,学哪个编程语言好就业?
- 2018年考研真题计算机专业,2018年计算机考研真题及参考答案.pdf
- MS-DOS系统下的autoexec.bat
- 物联卡先用流量包还是套餐流量,物联卡流量扣除顺序是什么?
- 卸载landesk的方法
- Lambda表达式详细总结
热门文章
- Git-将已有的项目转换为GIT项目托管到 GITHUB 仓库
- python列表每行查找字符串,python - 用python查找子字符串列表成字符串列表 - SO中文参考 - www.soinside.com...
- 数据结构与算法笔记(一)—— 引入概念、时间复杂度
- sleep防止CPU占用100%
- android gradle is插件,android gradle 插件创建 configuration
- python入门之控制结构顺序与选择结构_Python 入门之控制结构 - 顺序与选择结构——第1关:顺序结构...
- android内存优化方法,Android开发内存优化注意事项和方法
- php权限二进制,PHP_二进制交叉权限微型php类分享,靓点:1、多对多交叉场景分配 - phpStudy...
- 非root用户加入docker用户组省去sudo
- java 反转 控制 注入_控制反转和依赖注入