搭建爬虫代理池

198 篇文章 0 订阅
189 篇文章 0 订阅

代理IP从何而来?
刚自学爬虫的时候没有代理IP就去西刺有免费代理的网站去爬,还是有个别代理能用。当然,如果你有更好的代理接口也可以自己接入例如(亿牛云代理)
免费代理的采集也很简单,无非就是:访问页面页面 —> 正则/xpath提取 —> 保存
如何保证代理质量?
可以肯定免费的代理IP大部分都是不能用的,不然别人为什么还提供付费的(不过事实是很多代理商的付费IP也不稳定,也有很多是不能用)。所以采集回来的代理IP不能直接使用,可以写检测程序不断的去用这些代理访问一个稳定的网站,看是否可以正常使用。这个过程可以使用多线程或异步的方式,因为检测代理是个很慢的过程。
采集回来的代理如何存储?
这里不得不推荐一个高性能支持多种数据结构的NoSQL数据库SSDB,用于代理Redis。支持队列、hash、set、k-v对,支持T级别数据。是做分布式爬虫很好中间存储工具。
如何让爬虫更简单的使用这些代理?
答案肯定是做成服务咯,python有这么多的web框架,随便拿一个来写个api供爬虫调用。这样有很多好处,比如:当爬虫发现代理不能使用可以主动通过api去delete代理IP,当爬虫发现代理池IP不够用时可以主动去refresh代理池。这样比检测程序更加靠谱。
代理池由四部分组成:
ProxyGetter:
代理获取接口,目前有5个免费代理源,每调用一次就会抓取这个5个网站的最新代理放入DB,可自行添加额外的代理获取接口;
DB:
用于存放代理IP,现在暂时只支持SSDB。至于为什么选择SSDB,大家可以参考这篇文章,个人觉得SSDB是个不错的Redis替代方案,如果你没有用过SSDB,安装起来也很简单,可以参考这里;
Schedule:
计划任务用户定时去检测DB中的代理可用性,删除不可用的代理。同时也会主动通过ProxyGetter去获取最新代理放入DB;
ProxyApi:
代理池的外部接口,由于现在这么代理池功能比较简单,花两个小时看了下Flask,愉快的决定用Flask搞定。功能是给爬虫提供get/delete/refresh等接口,方便爬虫直接使用。
在这里插入图片描述
我是在github上面看到的,这里也会把过程记录下来:
1.下载源码:
git clone git@github.com:jhao104/proxy_pool.git
或者直接到https://github.com/jhao104/proxy_pool 下载zip文件
复制代码
2.安装:
pip install -r requirements.txt
复制代码
3.配置Config.init:

Config.ini 为项目配置文件

配置DB

type = SSDB # 如果使用SSDB或redis数据库,均配置为SSDB
host = localhost # db host
port = 8888 # db port
name = proxy # 默认配置

配置 ProxyGetter

freeProxyFirst = 1 # 这里是启动的抓取函数,可在ProxyGetter/getFreeProxy.py 扩展
freeProxySecond = 1

配置 HOST (api服务)

ip = 127.0.0.1 # 监听ip,0.0.0.0开启外网访问
port = 5010 # 监听端口

上面配置启动后,代理api地址为 http://127.0.0.1:5010

复制代码
启动
如果前面程序都完成了,接下来你可以启动程序了,进入Run目录,
运行:
python main.py
查看
启动过几分钟后就能看到抓取到的代理IP,你可以直接到数据库中查看,推荐一个SSDB可视化工具。
也可以通过api访问http://127.0.0.1:5010 查看。
API
/get GET 随机获取一个代理 None
/get_all GET 获取所有代理 None
/get_status GET 查看代理数量 None
/delete GET 删除代理 proxy=host:ip
我通过浏览器输入:http://www.16yun.cn/get_all/
得到如下效果:
[
“202.100.83.139:80”,
“117.127.0.197:80”,
“218.60.8.98:3129”,
“117.127.0.197:8080”,
“218.60.8.99:3129”,
“219.141.153.43:80”,
“114.215.95.188:3128”,
“219.141.153.35:80”,
使用爬虫代理
#! -- encoding:utf-8 --
import requests
import random
# 要访问的目标页面
targetUrl = “http://httpbin.org/ip”
# 要访问的目标HTTPS页面
# targetUrl = “https://httpbin.org/ip”
# 代理服务器(产品官网 www.16yun.cn)
proxyHost = “t.16yun.cn”
proxyPort = “31111”
# 代理隧道验证信息
proxyUser = “username”
proxyPass = “password”
proxyMeta = “http://%(user)s:%(pass)s@%(host)s:%(port)s” % {
“host” : proxyHost,
“port” : proxyPort,
“user” : proxyUser,
“pass” : proxyPass,
}
# 设置 http和https访问都是用HTTP代理
proxies = {
“http” : proxyMeta,
“https” : proxyMeta,
}
# 设置IP切换头
tunnel = random.randint(1,10000)
headers = {“Proxy-Tunnel”: str(tunnel)}
resp = requests.get(targetUrl, proxies=proxies, headers=headers)
print resp.status_code
print resp.text

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值