• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python利用proxybroker构建爬虫免费IP代理池的实现

    前言

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

    正当悠闲地喝着咖啡,满意地看着屏幕上的那一行行如流水般被爬下来的数据时,突然一个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代理池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Python爬虫设置ip代理过程解析
    • python如何基于redis实现ip代理池
    • python3 Scrapy爬虫框架ip代理配置的方法
    • Python爬虫动态ip代理防止被封的方法
    • python实现ip代理池功能示例
    • python单例模式获取IP代理的方法详解
    • python3 requests中使用ip代理池随机生成ip的实例
    • python爬虫实战之制作属于自己的一个IP代理模块
    上一篇:python实现图片转字符画的完整代码
    下一篇:Python用requests库爬取返回为空的解决办法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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