注意: IP代理精灵仅提供国内ip网络节点,不提供境外网络节点,不能用于任何非法用途或访问境外封闭网站,不能跨境联网,只能用于合法的国内网络加速。

请登录 注册

首页 > 新闻资讯 > 让您的爬虫实现动态ip突破限制

让您的爬虫实现动态ip突破限制

来源:IP精灵 作者:admin 时间:2019-10-09 09:38:48

  让您的爬虫实现动态ip突破限制。有些企业网站为了避免被恶意操作,在写爬虫时,网站会有一些防爬措施,比如限制单个ip的访问频率。而突破ip限制的方式,大概有如下几种:

  和被爬的网站合作,将自己的ip加入白名单;

  买多台具有公网ip的服务器,每台都布一个爬虫脚本,相当于每个爬虫都有自己的独立ip;

  买一些便宜的ip资源,用这些ip做代理(可以是配置很低的且每台机器具有多个公网ip的服务器,只负责网络代理,不跑业务)。

让您的爬虫实现动态ip突破限制

  方式1,既然选择爬人家的数据,初期阶段应该没有合作的意向或没有合作的通道。

  方式2,多台服务器成本高,同一爬虫部署多处,维护成本也高(配置、部署、升级、爬虫间相互协调等)。

  方式3,成本低,脚本无需部署多处。

  本文将针对方式3,从原理到实现,一步一步地说明。

  http代理原理

  当访问某个站点时,网站服务器可以获取到访问者的ip. 服务器可以根据来自该ip的请求情况,做一些限流操作。而代理,是在访问者和站点之间,加一个中间人。访问者向中间人发请求,中间人将该请求转发给站点,最后中间人把站点的响应返回给访问者。在这个过程中站点只能看到代理(中间人)的ip。

  无代理的情况: 访问者 <==> 站点 (站点看到的是访问者的ip)

  有代理的情况: 访问者 <==> 代理 <==> 站点 (站点看到的是代理的ip)

  有动态代理的情况: 访问者 <==> [ 代理1,代理2,代理3,... ] <==> 站点 ( 站点看到的是多个代理的随机ip )

  使用 curl 做实验

  访问 http://httpbin.org/ip 可以得到自己的ip:

  curl http://httpbin.org/ip{ "origin": "58.243.254.31"}

  可以看到我的外网ip是58.243.254.31 。curl 支持--proxy参数来指定代理:

  curl --proxy http://localhost:1087 http://httpbin.org/ip{ "origin": "217.197.160.199"}

  使用代理后,我的ip(对于被访问的站点来说),变成了217.197.160.199。 通过以上实验,想必你对代理也有了一定的感知。

  用nodejs写一个简单的爬虫

  这个爬虫很简单,就是请求http://httpbin.org/ip,将返回值打印到控制台。

  # 创建一个名为node-crawler的文件夹mkdir node-crawler# 进入这个文件夹cd node-crawler# 创建一个默认的package.jsonnpm init -y# 安装request依赖npm i -S request# 新建一个名为index.js的文件touch index.js

  index.js的内容如下:

  const request = require("request");request({url:"http://httpbin.org/ip"},(err,res,body)=>{ // 暂时忽略错误信息,直接打印body console.log(body);});

  在控制台执行node index.js, 会得到如下输出:

  { "origin": "58.243.254.31, 58.243.254.31"}

  和curl类似,我们可以给request方法配置代理参数:

  const request = require("request");request({ url:"http://httpbin.org/ip",proxy:"http://localhost:1087"},(err,res,body)=>{// 暂时忽略错误信息,直接打印body console.log(body);});

  再次执行node index.js, 将得到如下输出:

  { "origin": "217.197.160.199, 217.197.160.199"}

  至此,单个http代理已经完成了。接下来我们讨论如何动态地在多个http代理间来回切换,以此来弱化被爬的站点对访问者ip的限制。

  第一种方案

  从外部将ip代理参数传给爬虫脚本,爬虫运行完成后自动退出,再取另一个ip代理参数,重新跑爬虫脚本,以此形式周而复始。

  可以写一个这样的shell脚本:

  #!/usr/bin/env bash# 假设有2个http代理可用proxies=( 'http://a.b.c.d:8443' 'http://h.i.j.k:1087');# 周而复始地while(true); do # 每次拿出一个代理 for p in "${proxies[@]}"; do echo 使用代理 $p # 用该代理跑爬虫 PROXY=$p node index.js # 休眠一定时间 sleep 5 donedone

  其中 PROXY=$p 是定义一个环境变量PROXY, 其值是2个http代理中的任意一个。我们修改一下index.js, 让其使用PROXY环境参数作为其代理:

  const request = require("request");const proxy = process.env.PROXY;request({ url:"http://httpbin.org/ip", proxy },(err,res,body)=>{ // 暂时忽略错误信息,直接打印body console.log(body);});

  该方案使用bash脚本配合js爬虫脚本一起使用,对于不懂bash的人来说,维护起来有一定的心理负担。接下来,我们使用纯js语言实现。

  第二种方案

  将方案一中的bash转换为js,index.js内容调整为以下内容:

  const request = require("request");const proxies = ["http://a.b.c.d:8443","http://h.i.j.k:1087"];main();// index 是循环执行的次数function main( index=0 ){ request({ url:"http://httpbin.org/ip", // 来回的取proxy proxy: proxies[index % proxies.length] }, (err, res, body) => { // 暂时忽略错误信息,直接打印body console.log(body); // 5秒后取下一个proxy,重新跑爬虫 setTimeout( main, 5000, index+1 ); });} 推荐阅读:如何选择高质量爬虫http代理ip?

  综上,我们实现了从不使用代理到使用单个代理,再到使用多个代理的过程,使得我们的爬虫能尽可能少地受到服务器限流的影响。我们也看以当一个需求的解决方案有多种时,如何从经济成本、开发成本、维护成本上做取舍。


最新资讯

推荐阅读

  1. 09

    2019-01

    怎么批量获取IP地址?免费IP地址有效吗?

    现实中,大家使用的IP地址,大多数都是动态的IP,因为IP资源稀缺,想要获取大量的IP是一件难事,但如果工作需要使用大量的IP地址,这该怎么办啊。你知道怎么批量获取IP地址吗?

  2. 15

    2019-07

    研发代理ip软件的初衷是什么?

    在http代理ip的市场上各种同类应用一直都不断更新,但是最近在这个市场上杀出的一匹黑马,这匹黑马名叫IP代理精灵平台。其实我们大多数人对于浏览器都熟悉不过了,但是浏览器后面多了一

  3. 06

    2019-05

    代理端口和代理类型介绍

    似乎代理端口通常确定代理类型。例如,端口3128上的代理通常是HTTP代理,而具有端口1080的代理通常是Socks代理。这是因为3128/1080是代理服务器软件的默认端口。默认代理端口 Squid(着名的HTTP代

  4. 25

    2021-01

    怎样判断代理IP是否使用成功

    怎样判断代理IP是否使用成功?很多初次用代理IP的小伙伴都会有这样的疑惑:在爬虫程序或采集软件上配置代理后,该如何判断代理IP是否使用成功了呢?精灵ip代理告诉你!怎样判断代理IP是否使

  5. 18

    2020-05

    什么是IP地址 由什么组成?

    什么是IP地址 由什么组成?随着互联网的进步与发展,越来越多的让人开始使用计算机,成为广大网民的一员。为了区分每个用户,IP地址便运应而生了。那么,什么是IP地址呢?它是由什么组成

  6. 09

    2019-09

    让代理ip​帮助打造品牌和造势!

    让代理ip​帮助打造品牌和造势!在大数据时代,IP已经是重要的存在,而移动互联网时代,IP是一种资产,微商品牌打造好IP,品牌溢价能力更强。人格化的力量是最容易产生信任,促进成交转化