黑洞HTTP代理

黑洞HTTP

您的位置: 首页 > 新闻资讯 > HTTP代理 > 正文

为你的爬虫实现动态ip代理

发布时间:2019年03月19日 来源:互联网

在写爬虫时,某些网站会有一些防爬措施,比如限制单个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.json

npm 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

  done

done



其中 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 );

  });

}


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


但还有一个问题没说到:如何搭建自己的代理服务器。更进一步,本文中的动态ip切换是在爬虫端(应用端)实现的,这就要求爬虫端知道所有代理ip。那么我们能否用一个代理ip(A) 代理多个代理ip(B C D ...), 而爬虫端只需要知道代理A,就能以 B C D的ip去访问被爬的站点呢?需要知道答案的朋友可以在下方评论,时间允许时我会再出一篇文章。


相关文章内容简介

1 为你的爬虫实现动态ip代理

在写爬虫时,某些网站会有一些防爬措施,比如限制单个ip的访问频率。而突破ip限制的方式,大概有如下几种:和被爬的网站合作,将自己的ip加入白名单;买多台具有公网ip的服务器,每台都布一个爬虫脚本,相当于每个爬虫都有自己的独立ip;买一些便宜的ip资源,用这些ip做代理(可以是配置很低的且每台机器具有多个公网ip的服务器,只负责网络代理,不跑业务)。方式1,既然选择爬人家的数据,初期阶段应该没有合作的意向或没有合作的通道。方式2,多台服务器成本高,同一爬虫部署多处,维护成本也高(配置、部署、升级、爬虫间相互协调等)。方式3,成本低,脚本无需部署多处。本文将针对方式3,从原理到实现,一步一步地说明。 http代理原理当访问某个站点时,网站服务器可以获取到访问者的ip. 服务器可以根据来自该ip的请求情况,做一些限流操作。而代理,是在访问者和站点之间,加一个中间人。访问者向中间人发请求 [阅读全文]

热门标签

最新标签

推荐阅读

  1. 20

    2019-03

    HTTP代理为爬虫提供分布式代理 IP 解决方案

    大数据时代,爬虫工作者已经成为互联网数据公司的关键性职位,他们不但要精通数据抓取和分析,其次还要熟悉搜索引擎和相关检索算法,对内存、性能、分布式算法都要有一定的了解。并做

  2. 15

    2019-04

    运营人如何大数据发展方向,用代理IP

    大数据不仅意味着海量、多样、迅捷的数据处理,更是一种颠覆的思维方式、一项智能的基础设施、一场创新的技术变革。物联网、智慧城市、增强现实(AR)与虚拟现实(VR)、语音识别、人工智能

  3. 09

    2019-07

    怎么找到西安的代理IP?

    不知道大家发现没有,在浏览某些网站或者论坛是可以清清楚楚的看到自己的IP地址,显然你已经被”记录在案”了.不仅如此,有些比较懂电脑的朋友也可以通过QQ等聊天通讯软件看到你的IP地址,

  4. 13

    2019-08

    什么是代理上网和反向代理?

    代理上网是指访问 代理服务器 提供的互联网连接。在必须向大量网络用户提供因特网访问的情况下,代理上网是有利的。

  5. 01

    2019-08

    代理ip怎么合理控制爬虫速度?

    爬虫的工作人员都知道,爬虫的速度并不是越快越好。如果爬虫采集的速度越快,就越容易被发现,也就越容易被封IP。那么,怎么合理控制爬虫速度呢?

  6. 03

    2019-06

    网络爬虫有了代理IP可以为所欲为吗

     网络爬虫越来越火,很多朋友纷纷加入,各种培训班也是风生水起,很多人认为学会了网络爬虫就可以为所欲为了,抓天抓地抓空气,我会爬虫我神气,事实真的是这样吗?