如何用Python和proxybroker构建爬虫,实现长尾词的免费IP代理池?

2026-04-20 11:482阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1684个文字,预计阅读时间需要7分钟。

如何用Python和proxybroker构建爬虫,实现长尾词的免费IP代理池?

前言+写爬虫的小伙子可能遇到过这种情况:+ 正在悠闲地喝着咖啡,满心如意地看着屏幕上的那一行行如流水般的数据时,突然一个Error弹出来,提示抓不到数据了...+ 然后你反复检查。

前言

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

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

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

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

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

才原来我的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+github.com/constverum/ProxyBroker.git

在终端使用ProxyBroker

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

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

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

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

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 --localhost:5000 localhost:5000", "localhost:5000" } res = requests.get('localhost:5000') # 请求三次该网址,查看IP是否不同 for _ in range(3): # 得加上dont_filter=True,否则第2、3个请求将被dupefilter过滤 # 请求可以通过meta携带代理服务器地址,与HttpProxyMiddleware下载器中间件配合达到代理请求的目的 yield scrapy.Request('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异步获取代理IP

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

如何用Python和proxybroker构建爬虫,实现长尾词的免费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)

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

总结

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

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

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

本文共计1684个文字,预计阅读时间需要7分钟。

如何用Python和proxybroker构建爬虫,实现长尾词的免费IP代理池?

前言+写爬虫的小伙子可能遇到过这种情况:+ 正在悠闲地喝着咖啡,满心如意地看着屏幕上的那一行行如流水般的数据时,突然一个Error弹出来,提示抓不到数据了...+ 然后你反复检查。

前言

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

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

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

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

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

才原来我的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+github.com/constverum/ProxyBroker.git

在终端使用ProxyBroker

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

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

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

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

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 --localhost:5000 localhost:5000", "localhost:5000" } res = requests.get('localhost:5000') # 请求三次该网址,查看IP是否不同 for _ in range(3): # 得加上dont_filter=True,否则第2、3个请求将被dupefilter过滤 # 请求可以通过meta携带代理服务器地址,与HttpProxyMiddleware下载器中间件配合达到代理请求的目的 yield scrapy.Request('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异步获取代理IP

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

如何用Python和proxybroker构建爬虫,实现长尾词的免费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)

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

总结

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

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

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