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

作者:nbody1996 时间:2021-10-25 21:18:25 

前言

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

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

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

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

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

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

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

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

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

我要白嫖!

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

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

ProxyBroker简介

ProxyBroker是一个开源软件,它从各种不同的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子命令用于查找并检查公开的 * ,换言之它会列出所有经测试可用的 *

下列是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指定 * 的所属国家US,CN...-c CN
--limit LIMIT, -l LIMIT指定获取的条数正整数即可-l 5
--outfile OUTFILE, -o OUTFILE将找到的代理保存到文件中文件路径--outfile ./proxies.txt
--format FORMAT, -f FORMAT指定输出的格式,默认值为defaultdefault,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指定 * 的所属国家US,CN...-c CN
--limit LIMIT, -l LIMIT指定获取的条数正整数即可-l 5
--outfile OUTFILE, -o OUTFILE将找到的代理保存到文件中文件路径--outfile ./proxies.txt
--format FORMAT, -f FORMAT指定输出的格式,默认值为defaultdefault,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指定 * 的所属国家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异步获取 *

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

直接上代码


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代理池的实现

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

来源:https://nbodyfun.blog.csdn.net/article/details/107557610

标签:python,IP代理池
0
投稿

猜你喜欢

  • 使用numba对Python运算加速的方法

    2022-05-12 20:30:57
  • SQL Server 1069错误(由于登录失败而无法启动服务)解决方法

    2008-09-12 17:35:00
  • 详解Python+Matplotlib绘制面积图&热力图

    2021-10-10 10:16:29
  • 使用Python搭建虚拟环境的配置方法

    2021-09-04 17:50:58
  • 用js实现用户输入密码的强度

    2007-11-22 21:41:00
  • JavaScript的陷阱

    2008-10-28 19:52:00
  • python制作填词游戏步骤详解

    2023-03-09 19:46:47
  • pycharm远程调试openstack的图文教程

    2021-10-31 06:37:56
  • Jmail发信的实例,模块化随时调用

    2007-09-27 13:35:00
  • 巧用一条SQL 实现其它进制到十进制转换

    2009-01-19 13:16:00
  • Python项目跨域问题解决方案

    2022-12-01 17:39:32
  • Python使用正则表达式实现爬虫数据抽取

    2021-01-22 15:00:24
  • 深入讲解Python函数中参数的使用及默认参数的陷阱

    2022-04-21 20:09:14
  • Python中使用Counter进行字典创建以及key数量统计的方法

    2023-10-05 20:16:36
  • laravel添加前台跳转成功页面示例

    2023-11-20 15:22:18
  • Python函数式编程之返回函数实例详解

    2021-10-31 03:46:26
  • 使用Python来做一个屏幕录制工具的操作代码

    2023-11-02 18:57:40
  • python适合人工智能的理由和优势

    2021-08-10 11:01:12
  • pycharm如何设置自动生成作者信息

    2021-01-21 22:20:58
  • asp + oracle 分页方法

    2010-05-11 20:09:00
  • asp之家 网络编程 m.aspxhome.com