前言

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

正当悠闲地喝着咖啡,满意地看着屏幕上的那一行行如流水般被爬下来的数据时,突然一个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+https://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
–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

然后先通过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异步获取代理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)

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

总结

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

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

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