代理池的维护

目前有很多网站提供免费代理,而且种类齐全,比如各个地区、各个匿名级别的都有,不过质量实在不敢恭维,毕竟都是免费公开的,可能一个代理无数个人在用也说不定。所以我们需要做的是大量抓取这些免费代理,然后筛选出其中可用的代理存储起来供我们使用,不可用的进行剔除。

获取代理的途径

维护一个代理池第一步就是要找到提供免费代理的站点,例如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构造一个动态维护的代理池相关推荐

  1. 动态可维护ip代理池搭建(定时更新模块)

    动态可维护ip代理池(爬虫模块)继上一次的爬虫模块,我们先来优化一下并添加redis配置参数,参数配置以自身机器设定. import random import time import request ...

  2. 实现一个免费的IP代理池

    我将代理池程序设计为4个模块:存储模块,获取模块,检查模块,接口模块.模块之间关系如下: 存储模块:我使用的是redis数据库存储,使用的是redis中的集合,集合内元素无序并且无重复.该存储模块的主 ...

  3. 使用redis所维护的代理池抓取微信文章

    搜狗搜索可以直接搜索微信文章,本次就是利用搜狗搜搜出微信文章,获得详细的文章url来得到文章的信息.并把我们感兴趣的内容存入到mongodb中. 因为搜狗搜索微信文章的反爬虫比较强,经常封IP,所以要 ...

  4. 如何制作一个自己的IP代理池

    开始前的准备 注:在开始完成这个项目之前,需要懂一些简单的爬虫知识和tkinter的界面相关知识,不过这些相关的内容,博主也会通过链接的方式,在其他文章内对其进行详细描述,手把手教你完成一个IP代理池 ...

  5. 墨墨背单词刷分享链接访问量(动态获取IP代理池)

    墨墨背单词 分享链接刷点击量(自动获取最新IP代理池方式),以提高单词上限. 运行方式 1 Python 环境运行main.py 1.1 克隆本仓库 Github仓库 Momo-Share-Fresh ...

  6. 搭建一个基于flask和redis的代理池(proxy pool)

    在进行网页爬虫的项目时,常常会因为爬取的频率过高而触发 反爬虫机制 ,这时候,面临两个选择: 休息片刻.一般反爬虫机制不会进行永久的IP封禁,只是暂时限制访问而已,等待封禁时间结束再进行爬取即可.当然 ...

  7. python ip动态代理_给自己的爬虫做一个简单的动态代理池

    使用代理服务器一直是爬虫防BAN最有效的手段,但网上的免费代理往往质量很低,大部分代理完全不能使用,剩下能用的代理很多也只有几分钟的寿命,没法直接用到爬虫项目中. 下面简单记录一下我用scrapy+r ...

  8. 爬虫实战(一)—利用requests、mongo、redis代理池爬取英雄联盟opgg实时英雄数据

    概述 可关注微信订阅号 loak 查看实际效果. 代码已托管github,地址为:https://github.com/luozhengszj/LOLGokSpider 包括了项目的所有代码. 此篇文 ...

  9. Python3网络爬虫开发实战,IP代理池的维护

    我们在上一节了解了代理的设置方法,利用代理我们可以解决目标网站封 IP 的问题,而在网上又有大量公开的免费代理,其中有一部分可以拿来使用,或者我们也可以购买付费的代理 IP,价格也不贵.但是不论是免费 ...

最新文章

  1. idea 两次运行同一main方法 开启两个进程
  2. Android的单位px,pt,dp,sp总结和获取屏幕分辨率
  3. Ionic2 下处理 Android 设备下返回按钮的事件
  4. C#之根据域名获取IP地址
  5. 1.2 案例:波士顿房价预测
  6. JAVA发送邮件案例
  7. 编程的一些小知识点总结
  8. 【洛谷P2872】道路建设(最小生成树prim/kruskal)
  9. NFC读写器|读卡器ACR122U-A9的ActiveX控制在IE网页WEB调用的问题与解决方法
  10. 机器学习-----车标识别
  11. MyEclipse 注册码
  12. 用EndNote引用文献出现‘参数错误’解决方式
  13. Three things can't discuss with with people: Religion, Politics and The Great Pumpkin. Why?为什么不能谈论?
  14. 美国最受欢迎的婴儿名字:女孩Sophia和男孩Liam
  15. python和jsp哪个好学_Python,Java和JavaScript,学哪个编程语言好就业?
  16. 2018年考研真题计算机专业,2018年计算机考研真题及参考答案.pdf
  17. MS-DOS系统下的autoexec.bat
  18. 物联卡先用流量包还是套餐流量,物联卡流量扣除顺序是什么?
  19. 卸载landesk的方法
  20. Lambda表达式详细总结

热门文章

  1. Git-将已有的项目转换为GIT项目托管到 GITHUB 仓库
  2. python列表每行查找字符串,python - 用python查找子字符串列表成字符串列表 - SO中文参考 - www.soinside.com...
  3. 数据结构与算法笔记(一)—— 引入概念、时间复杂度
  4. sleep防止CPU占用100%
  5. android gradle is插件,android gradle 插件创建 configuration
  6. python入门之控制结构顺序与选择结构_Python 入门之控制结构 - 顺序与选择结构——第1关:顺序结构...
  7. android内存优化方法,Android开发内存优化注意事项和方法
  8. php权限二进制,PHP_二进制交叉权限微型php类分享,靓点:1、多对多交叉场景分配 - phpStudy...
  9. 非root用户加入docker用户组省去sudo
  10. java 反转 控制 注入_控制反转和依赖注入