python利用proxybroker构建爬虫免费IP代理池的实现
作者:nbody1996 发布时间:2021-10-25 21:18:25
前言
写爬虫的小伙伴可能遇到过这种情况:
正当悠闲地喝着咖啡,满意地看着屏幕上的那一行行如流水般被爬下来的数据时,突然一个Error弹出,提示抓不到数据了...
然后你反复检查,确信自己代码莫得问题之后,发现居然连浏览器也无法正常访问网页了...
难道是网站被我爬瘫痪了?
然后你用手机浏览所爬网站,惊奇地发现居然能访问!
才原来我的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
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 | 指定输出的格式,默认值为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 | 指定 * 的所属国家 | 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 |
--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
然后先通过curl命令不使用代理访问一下http://httpbin.org/get这个地址,查看一下该网站显示我们的IP是多少
curl http://httpbin.org/get
再使用curl命令通过我们刚搭起的代理服务器访问一下,看看网站显示的IP是否有变化
curl --proxy http://localhost:5000 http://httpbin.org/get
在代码中使用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())
效果如下
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异步获取 *
如果不希望通过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)
获取到 * 后,你可以通过aiohttp
异步HTTP库或requests
库来使用它们
来源:https://nbodyfun.blog.csdn.net/article/details/107557610


猜你喜欢
- web开发中避免不了运行环境的搭建,个人认为这是没有什么技术含量而又浪费时间的工作.所以将环境搭建的步骤记录下来,希望可以帮到有需要的朋友少
- 作为新手来说,这是一个最简单的人脸识别模型,难度不大,代码量也不算多,下面就逐一来讲解,数据集的准备就不多说了,因人而异。一. 获取数据集的
- Python编程语言的优点非常多,它的编程特色主要体现在可扩充性方面。那么,在接下来的这篇文章中,我们将会为大家详细介绍一下有关Python
- 第一种np矩阵可以直接与标量运算>>>import numpy as np>>>arr1 = np.ar
- Mybatis插入mysql报主键重复的问题首先思路是这样的,先去数据表里面去找有没有这个主键的数据(如果有会有返回值,如果没有则返回nul
- MYSQL数据库以它短小、方便、速度快、免费等优点成为很多网站目前首选数据库,但一般都是用PHP+MYSQL相结合来开发各种动态页面,其实A
- 手写数字识别算法import pandas as pdimport numpy as npfrom sklearn.neural_netwo
- 枚举类Enum枚举类,在企业开发中用的比较多当我们需要定义常量时,一个办法是用大写的变量通过整数来定义,例如月份:# 当项目中需要使用12个
- 本文实例为大家分享了梅尔倒谱系数实现代码,供大家参考,具体内容如下""" @author: zoutai@fi
- 1. 字面理解:torch.cat是将两个张量(tensor)拼接在一起,cat是concatnate的意思,即拼接,联系在一起。2. 例子
- ceil()方法返回x的值上限 - 不小于x的最小整数。语法以下是ceil()方法的语法:import mathmath.cei
- 在Oracle数据库中,DBA可以通过观测一定的表或视图来了解当前空间的使用状况,进而作出可能的调整决定。 一.表空间的自由空间 通过对表空
- 一、什么是XSS攻击xss攻击:----->web注入xss跨站脚本攻击(Cross site script,简称xss)是一种“HT
- 1.问题及解决办法(1)问题:由于存储的时间戳是时间戳为GMT(格林尼治标准时间),以秒储存,但由于需要获取的是北京时间,存在时区问题。如何
- 如下所示:import osvar = [1, 2, 3]data = [x*2 for x in var]print (data)two
- 计数器(Counter)是一个非常常用的功能组件,这篇blog以未读消息数为例,介绍了在 Django中实现一个高性能计数器的基本要点。故事
- 在MySQL中,事务就是一个逻辑工作单元的一系列步骤。事务是用来保证数据操作的安全性。事务的特征:1.Atomicity(原子性)2.Con
- 如何生成斐波那契數列斐波那契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到。用计
- 小渣渣复现大佬project发现GPU跑不动,出现如下报错:RuntimeError: CUDA out of memory.看下来最简单粗
- 本博客将为各位分享Python Helium库,其是在 Selenium库基础上封装的更加高级的 Web 自动化工具,它能够通过网页端可见的