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代理池内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python实现ip代理池功能示例

    本文实例讲述了python实现ip代理池功能.分享给大家供大家参考,具体如下: 爬取的代理源为西刺代理. 用xpath解析页面 用telnet来验证ip是否可用 把有效的ip写入到本地txt中.当然也可以写入到redis.mongodb中,也可以设置检测程序当代理池中的ip数不够(如:小于20个)时,启动该脚本来重新获取ip,本脚本的代码也要做相应的改变. # !/usr/bin/env python # -*- coding: utf-8 -*- # @Version : 1.0 # @Tim

  • python如何基于redis实现ip代理池

    这篇文章主要介绍了python如何基于redis实现ip代理池,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用apscheduler库定时爬取ip,定时检测ip删除ip,做了2层检测,第一层爬取后放入redis--db0进行检测,成功的放入redis--db1再次进行检测,确保获取的代理ip的可用性 import requests, redis import pandas import random from apscheduler.sch

  • python3 requests中使用ip代理池随机生成ip的实例

    啥也不说了,直接上代码吧! # encoding:utf-8 import requests # 导入requests模块用于访问测试自己的ip import random pro = ['1.119.129.2:8080', '115.174.66.148', '113.200.214.164'] # 在(http://www.xicidaili.com/wt/)上面收集的ip用于测试 # 没有使用字典的原因是 因为字典中的键是唯一的 http 和https 只能存在一个 所以不建议使用字典

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

    前言 写爬虫的小伙伴可能遇到过这种情况: 正当悠闲地喝着咖啡,满意地看着屏幕上的那一行行如流水般被爬下来的数据时,突然一个Error弹出,提示抓不到数据了... 然后你反复检查,确信自己代码莫得问题之后,发现居然连浏览器也无法正常访问网页了... 难道是网站被我爬瘫痪了? 然后你用手机浏览所爬网站,惊奇地发现居然能访问! 才原来我的IP被网站给封了,拒绝了我的访问 这时只能用IP代理来应对禁IP反爬策略了,但是网上高速稳定的代理IP大多都收费,看了看皱皱的钱包后,一个大胆的想法冒出 我要白嫖!

  • 用python构建IP代理池详解

    目录 概述 提供免费代理的网站 代码 导包 网站页面的url ip地址 检测 整理 必要参数 总代码 总结 概述 用爬虫时,大部分网站都有一定的反爬措施,有些网站会限制每个 IP 的访问速度或访问次数,超出了它的限制你的 IP 就会被封掉.对于访问速度的处理比较简单,只要间隔一段时间爬取一次就行了,避免频繁访问:而对于访问次数,就需要使用代理 IP 来帮忙了,使用多个代理 IP 轮换着去访问目标网址可以有效地解决问题. 目前网上有很多的代理服务网站提供代理服务,也提供一些免费的代理,但可用性较差

  • Python爬虫动态ip代理防止被封的方法

    在爬取的过程中难免发生ip被封和403错误等等,这都是网站检测出你是爬虫而进行反爬措施,在这里为大家总结一下怎么用IP代理防止被封 首先,设置等待时间: 常见的设置等待时间有两种,一种是显性等待时间(强制停几秒),一种是隐性等待时间(看具体情况,比如根据元素加载完成需要时间而等待)图1是显性等待时间设置,图2是隐性 第二步,修改请求头: 识别你是机器人还是人类浏览器浏览的重要依据就是User-Agent,比如人类用浏览器浏览就会使这个样子的User-Agent:'Mozilla/5.0 (Win

  • Python爬虫设置ip代理过程解析

    1.get方式:如何为爬虫添加ip代理,设置Request header(请求头) import urllib import urllib.request import urllib.parse import random import time from fake_useragent import UserAgent ua = UserAgent() url = "http://www.baidu.com" ######################################

  • python3 Scrapy爬虫框架ip代理配置的方法

    什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板.对于框架的学习,重点是要学习其框架的特性.各个功能的用法即可. 一.背景 在做爬虫项目的过程中遇到ip代理的问题,网上搜了一些,要么是用阿里云的ip代理,要么是搜一些网上现有的ip资源,然后配置在setting文件中.这两个方法都存在一些问题. 1.阿里云ip代理方法,网上大

  • 详解基于Scrapy的IP代理池搭建

    一.为什么要搭建爬虫代理池 在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制,即在某一时间段内,当某个ip的访问次数达到一定的阀值时,该ip就会被拉黑.在一段时间内禁止访问. 应对的方法有两种: 1. 降低爬虫的爬取频率,避免IP被限制访问,缺点显而易见:会大大降低爬取的效率. 2. 搭建一个IP代理池,使用不同的IP轮流进行爬取. 二.搭建思路 1.从代理网站(如:西刺代理.快代理.云代理.无忧代理)爬取代理IP: 2.验证代理IP的可用性(使用代理IP去请求指定URL,根据响应验证

  • python简单构建可用IP代理池

    以下为简单示例: import requests import re import telnetlib url='http://www.66ip.cn/nmtq.php?getnum=100000&isp=0&anonymoustype=4&start=&ports=&export=&ipaddress=&area=2&proxytype=0&api=66ip' header = {'User-agent':'xxxxxxxxxxx'

随机推荐