python利用proxybroker构建爬虫免费IP代理池的实现


Posted in Python onFebruary 21, 2021

前言

写爬虫的小伙伴可能遇到过这种情况:

正当悠闲地喝着咖啡,满意地看着屏幕上的那一行行如流水般被爬下来的数据时,突然一个Error弹出,提示抓不到数据了...

然后你反复检查,确信自己代码莫得问题之后,发现居然连浏览器也无法正常访问网页了...

难道是网站被我爬瘫痪了?

python利用proxybroker构建爬虫免费IP代理池的实现

然后你用手机浏览所爬网站,惊奇地发现居然能访问!

才原来我的IP被网站给封了,拒绝了我的访问

python利用proxybroker构建爬虫免费IP代理池的实现

这时只能用IP代理来应对禁IP反爬策略了,但是网上高速稳定的代理IP大多都收费,看了看皱皱的钱包后,一个大胆的想法冒出

我要白嫖!

啥是IP代理?假如你现在17岁未成年,理想一点的情况会是,你去商店买烟,老板告诉你未成年不能买烟,并拒绝了你的购买,这叫被服务器拒绝访问;

但是你不服气啊,于是你找来你20岁的哥哥,叫他去商店老板那帮你买包烟,然后再给你,这就叫IP代理。

ProxyBroker简介

ProxyBroker是一个开源软件,它从各种不同的IP代理网站中抓来公开的代理IP,并实时地检查代理IP的可用性,以供使用。

所以可以说ProxyBroker是一个集成了爬虫技术的开源软件。

ProxyBroker安装

你可以通过pip来安装ProxyBroker

pip install proxybroker

也可以直接从Github下载最新版本的ProxyBroker

pip install -U git+https://github.com/constverum/ProxyBroker.git

在终端使用ProxyBroker

安装成功后,你可以在终端中使用命令proxybroker

python利用proxybroker构建爬虫免费IP代理池的实现

proxybroker主要有三个子命令

find子命令

find子命令用于查找并检查公开的代理IP,换言之它会列出所有经测试可用的代理IP

下列是find子命令的常用选项:

选项 作用 可选值 示例
--types 指定代理的类型 HTTP,HTTPS,SOCKS4,SOCKS5,CONNECT:80,CONNECT:25 --types HTTP HTTPS
--lvl 指定代理的匿名级别 Transparent,Anonymous,High --lvl High
--strict,-s 严格保证代理的类型与匿名级别等于指定的值 只要加上就表示启用严格模式 --strict
--countries COUNTRIES,-c COUNTRIES 指定代理IP的所属国家 US,CN... -c CN
--limit LIMIT, -l LIMIT 指定获取的条数 正整数即可 -l 5
--outfile OUTFILE, -o OUTFILE 将找到的代理保存到文件中 文件路径 --outfile ./proxies.txt
--format FORMAT, -f FORMAT 指定输出的格式,默认值为default default,json -f json
--post 用post请求检查IP的可用性,默认是用get方式 只要加上就表示启用post请求检查 --post
--show-stats 是否打印详细统计信息 只要加上就表示启用打印统计信息 --show-stats

比如查找10条HTTP代理

proxybroker find --types HTTP -l 10

python利用proxybroker构建爬虫免费IP代理池的实现

你可以将选项的示例值加上,自己尝试一下

grab子命令

grab子命令有点像find的简易版,它只进行查找,并不检查抓来IP的可用性

下列是grab子命令的所有选项:

选项 作用 可选值 示例
--countries COUNTRIES,-c COUNTRIES 指定代理IP的所属国家 US,CN... -c CN
--limit LIMIT, -l LIMIT 指定获取的条数 正整数即可 -l 5
--outfile OUTFILE, -o OUTFILE 将找到的代理保存到文件中 文件路径 --outfile ./proxies.txt
--format FORMAT, -f FORMAT 指定输出的格式,默认值为default default,json -f json
--show-stats 是否打印详细统计信息 只要加上就表示启用打印统计信息 --show-stats

可以看到它有的选项,find子命令都有,所以它是find的阉割版

比如查找5条来自中国的代理,并将它保存至文件中

proxybroker grab -c CN -o ./proxies.txt -l 5

python利用proxybroker构建爬虫免费IP代理池的实现

serve子命令

serve子命令用于搭建一个本地代理服务器,它可以分发你的请求至不同的IP代理中

下列是serve子命令的常用选项:

选项 作用 可选值 示例
--host HOST 指定服务器的地址,默认是127.0.0.1 你本机的IP --host localhost
--port PORT 指定服务器的端口,默认是8888 你本机可用的端口 --port 5000
--max-tries SRV_MAX_TRIES 设置处理请求的最大重试次数 正整数 --max-tries 3
--min-req-proxy MIN_REQ_PROXY 设置每个IP处理请求的最小次数 正整数 --min-req-proxy 3
--http-allowed-codes HTTP_ALLOWED_CODES 设置允许代理返回的响应码 响应的状态码 --http-allowed-codes 302
--max-error-rate MAX_ERROR_RATE 设置最大允许请求的异常率,例如0.5是50% 0~1 --max-error-rate 0.3
--max-resp-time SECONDS 设置响应的最大允许秒数,默认是8秒 秒数 --max-resp-time 20
--prefer-connect 如果可以的话,是否使用CONNECT方法 只要加上就表示使用 --prefer-connect
--backlog BACKLOG 设置连接队列的最大值 正整数即可 --backlog 10
- - - -
--types 指定代理的类型 HTTP,HTTPS,SOCKS4,SOCKS5,CONNECT:80,CONNECT:25 --types HTTP HTTPS
--lvl 指定代理的匿名级别 Transparent,Anonymous,High --lvl High
--strict,-s 严格保证代理的类型与匿名级别等于指定的值 只要加上就表示启用严格模式 --strict
--countries COUNTRIES,-c COUNTRIES 指定代理IP的所属国家 US,CN... -c CN
--limit LIMIT, -l LIMIT 指定代理池的工作IP条数 正整数即可 -l 5

serve子命令搭建代理服务器,相当于把我们本机变成中间商再中间商

比如在地址为localhost,端口为5000,搭起高匿名代理服务器

proxybroker serve --host localhost --port 5000 --types HTTP --lvl High

python利用proxybroker构建爬虫免费IP代理池的实现

然后先通过curl命令不使用代理访问一下http://httpbin.org/get这个地址,查看一下该网站显示我们的IP是多少

curl http://httpbin.org/get

python利用proxybroker构建爬虫免费IP代理池的实现

再使用curl命令通过我们刚搭起的代理服务器访问一下,看看网站显示的IP是否有变化

curl --proxy http://localhost:5000 http://httpbin.org/get

python利用proxybroker构建爬虫免费IP代理池的实现

在代码中使用ProxyBroker

你可以通过proxybroker serve子命令搭起代理服务器,然后在发起请求时使用该代理,这种方法适用于几乎所有的编程语言

requests库使用代理

先serve搭起代理服务器

proxybroker serve --host localhost --port 5000 --types HTTP --lvl High

然后通过requests库设置代理

import requests

proxies = {
  "http": "http://localhost:5000",
  "https": "http://localhost:5000"
}

res = requests.get('http://httpbin.org/get', proxies=proxies)

print(res.json())

效果如下

python利用proxybroker构建爬虫免费IP代理池的实现

scrapy库使用代理

还是先serve搭起代理服务器,代码还是和上面一样

在终端中,通过scrapy startproject新建一个爬虫项目,然后进入该项目目录里

scrapy startproject proxy_demo
cd proxy_demo

通过scrapy genspider新建一个爬虫,名为proxy_spider_demo,域名为httpbin.org

scrapy genspider proxy_spider_demo httpbin.org

然后将下列代码粘贴至刚刚新建的爬虫中

import json
import scrapy
# from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddleware


class ProxySpiderDemoSpider(scrapy.Spider):
  name = 'proxy_spider_demo'
  allowed_domains = ['httpbin.org']
  # start_urls = ['http://httpbin.org/']

  def start_requests(self):
    meta = dict(proxy='http://localhost:5000')
    # 请求三次该网址,查看IP是否不同
    for _ in range(3):
      # 得加上dont_filter=True,否则第2、3个请求将被dupefilter过滤
      # 请求可以通过meta携带代理服务器地址,与HttpProxyMiddleware下载器中间件配合达到代理请求的目的
      yield scrapy.Request('http://httpbin.org/get', dont_filter=True, meta=meta, callback=self.parse)

  def parse(self, response):
    json_body = json.loads(response.text)
    print('当前请求的IP为:', json_body['origin'])

在项目根目录处进入终端,通过scrapy crawl命令运行爬虫,这里加上了--nolog选项是为了专注于print的输出

scrapy crawl --nolog proxy_spider_demo

效果如下

python利用proxybroker构建爬虫免费IP代理池的实现

python异步获取代理IP

如果不希望通过serve子命令,直接在python代码中使用代理IP,可以通过asyncio来异步获取代理IP

直接上代码

import asyncio
from proxybroker import Broker

async def view_proxy(proxies_queue):
  while True:
    proxy = await proxies_queue.get()
    
    if proxy is None:
      print('done...')
      break
      
    print(proxy)

# 异步队列
proxies_queue = asyncio.Queue()

broker = Broker(proxies_queue)

tasks = asyncio.gather(
  # 使用grab子命令获取3条IP
  broker.grab(limit=3),
  view_proxy(proxies_queue))

loop = asyncio.get_event_loop()
_ = loop.run_until_complete(tasks)

python利用proxybroker构建爬虫免费IP代理池的实现

获取到代理IP后,你可以通过aiohttp异步HTTP库或requests库来使用它们

总结

你可以利用ProxyBroker库来白嫖免费的IP代理,但是白嫖来的始终是有缺点的,不然也不会有人专门去卖IP代理了

白嫖来的IP有稳定性差、速度慢的缺点,所以土豪可以忽视本文...

到此这篇关于python利用proxybroker构建爬虫免费IP代理池的实现的文章就介绍到这了,更多相关python IP代理池内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python字符串的encode与decode研究心得乱码问题解决方法
Mar 23 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
用TensorFlow实现lasso回归和岭回归算法的示例
May 02 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
Jul 27 Python
python threading和multiprocessing模块基本用法实例分析
Jul 25 Python
Python实现生成密码字典的方法示例
Sep 02 Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 Python
详解pandas获取Dataframe元素值的几种方法
Jun 14 Python
python如何实现DES加密
Sep 21 Python
解析python中的jsonpath 提取器
Jan 18 Python
python实现图片转字符画的完整代码
Feb 21 #Python
利用Python实现最小二乘法与梯度下降算法
Feb 21 #Python
Scrapy实现模拟登录的示例代码
Feb 21 #Python
scrapy-splash简单使用详解
Feb 21 #Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 #Python
利用Python如何画一颗心、小人发射爱心
Feb 21 #Python
python 第三方库paramiko的常用方式
Feb 20 #Python
You might like
使用php统计字符串中中英文字符的个数
2013/06/23 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
javascript 写类方式之三
2009/07/05 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
Python内置模块turtle绘图详解
2017/12/09 Python
python3 读写文件换行符的方法
2018/04/09 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
pygame实现成语填空游戏
2019/10/29 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
JVM是一个编译程序还是解释程序
2012/09/11 面试题
终止合同协议书
2014/04/17 职场文书
职位说明书范文
2014/05/07 职场文书
七夕活动策划方案
2014/08/16 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
董事长致辞
2015/07/29 职场文书
美容院管理规章制度
2015/08/05 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python