服务器采集 大规模爬虫 动态IP拨号服务器

鳄鱼君

发表文章数:571

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » 服务器采集 大规模爬虫 动态IP拨号服务器

没看到这篇文章之前,我们的爬虫都是运行在本地计算机上的,通过这篇文章,你就可以将你的爬虫程序放到“云”上,并且能够随意改变IP,让爬虫程序一直跑下去!

当编写大规模的爬虫程序,在服务器上部署爬虫是不可避免的。使用服务器采集有以下两大原因:

  1. 大规模爬虫的需要
  2. 防止IP地址被封杀

大规模爬虫的需要

世界上最大的网络爬虫就是搜索引擎。这里百度的不知道收录了多少网页,简单了解一下谷歌。根据谷歌官方网站的统计数字,谷歌搜索引擎已经收录了超过140亿万个网页,而且还在持续增长中,这占用了100PB(相当于100000TB)的存储空间。我们的爬虫程序在谷歌搜索引擎面前,就像是地球上的蚂蚁一样,也许,永远不会有谷歌那样的规模。当有一天,你需要爬取的不再是测试数据,而是从多个网站收集数据的时候,就需要使用大规模的爬虫

大规模爬虫,意味着,爬虫程序需要永久的运行下去,在本地计算机上是无法实现的,除非你一直开着电脑,什么也不做,让爬虫程序一直跑,很显然不可能!这时候使用服务器,就可以解放你的个人计算机,就像网站一样,不出意外可以一直运行下去。

当我们爬取大量数据的时候,一台计算机的能力,可能显得有些吃力,这时候,使用分布式爬虫,调集多台机器共同完成一个爬虫任务,并且把收集到的数据都存储在同一个数据库中。分布式爬虫比较复杂,一般可以使用Celery和Redis部署分布式爬虫,这里后面会整理,这里先不过多介绍!

防止IP地址被封杀

相信我们在编写爬虫程序的时候,经常遇到的就是IP被封掉的情况,呢么对于大规模爬虫程序该如何处理IP被封呢?在个人计算机上,我们可以搭建代理池,使用免费的或者付费的,但是效果都不太好。使用动态IP拨号服务器的ADSL拨号方法和Tor进行代理访问,可以成功修该访问网站的IP,这篇文章会进行详细的介绍!

动态IP拨号服务器

动态IP拨号服务器,顾名思义,IP地址是可以动态修改的。动态IP拨号服务器并不是什么高大上的服务器,相反,属于配置非常低的一种。我们看中的不是它的计算能力,而是能够实现秒换IP地址。

拨号上网有一个独特的特点,就是每次拨号都会换一个新的IP地址。家庭中的上网方式多数都用的是ADSL拨号上网,也就是断开网络后再拨号一次,外网IP就会换成另一个。

一般来说,这个IP池很大,可能有多个AB段,IP数量基本上用不完。对于爬虫来说,这简直是大杀器,能够轻松解决封杀IP的限制。

购买拨号服务器

购买动态IP拨号服务器可以在网页上搜索“ADSL服务器”或“动态IP服务器”,在搜索结果中可以看到很多供应商,选择一个包月的ADSL拨号服务器即可。有些供应商还提供1元钱测试24小时的服务。

鳄鱼君Ba这里不推荐哪家的好,具体需要自己尝试。我这里选择的是Windows XP系统的动态IP拨号服务器作为我们爬虫的服务器。

登录服务器

购买动态IP拨号服务器之后会获得服务器地址、用户名和密码,还会获得拨号上网的用户名和密码,例如:

远程连接:49.8.12.3:2045
用户名:
密码:
宽带帐号:
宽带密码:

开始菜单中,搜索mstsc,找到mstsc.exe程序,单机并打开它:

服务器采集 大规模爬虫 动态IP拨号服务器

在弹出的“远程桌面连接”对话框中填写登录的服务器IP地址和端口,一般是123.1.1.1:2345这样的格式,点击连接,就会弹出用户登录对话框:

服务器采集 大规模爬虫 动态IP拨号服务器

填写用户名和密码,点击连接:

服务器采集 大规模爬虫 动态IP拨号服务器

这就进入了我们的Windows服务器,我们打开宽带连接界面,此时计算机已经联网。如果需要更换IP,就需要断开后重新连接宽带:

服务器采集 大规模爬虫 动态IP拨号服务器

我们也可以测试一下,在Windows服务器中打开浏览器,输入:http://icanhazip.com,该网站会返回当前服务器的IP地址,然后断开宽带连接,重连,再次查看即可!

这里我们可以通过python的os模块,实现宽带连接断开重连,代码参考:

import os,time
# 简体中文系统: 宽带连接
# 英文系统: adsl
# username:宽带用户名
# password:宽带用户名的密码
admin_account={
    'name':'宽带连接',
    'username':'',
    'password':'',
}

class Adsl(object):
    def __init__(self):
        self.name=admin_account['name']
        self.username=admin_account['username']
        self.password=admin_account['password']
    def connect(self):
        """
        连接
        :return:
        """
        cmd='rasdial %s %s %s' % (self.name,self.username,self.password)
        os.system(cmd)
        time.sleep(5)

    def disconnect(self):
        """
        断开宽带连接
        :return:
        """
        cmd='rasdial %s /disconnect' % self.name
        os.system(cmd)
        time.sleep(5)
    def reconnect(self):
        """
        重新连接
        :return:
        """
        self.disconnect()
        self.connect()
if __name__ == '__main__':
    a=Adsl()
    a.reconnect()

代码是运行在Windows XP服务器上的,在服务器上通过登录宽带用户,断开宽带用户来实现更换IP。将代码保存在changeIP.py文件,方便爬虫文件调用。

我们可以将爬虫和更换IP的功能相结合,当爬虫结果返回错误的时候,可以更换IP,代码参考:

import requests
import time
import random
import changeIP

url='https://www.e1yu.com'
headers={
    "User-Agent": "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0"
}
def spider(url,num_try=3):
    try:
        res=requests.get(url,headers=headers)
        html=res.text
        time.sleep(random.randint(0,2)+random.random()) # 时间延迟
    except Exception as e:
        print(e)
        html=None
        if num_try>0:
            x=changeIP.adsl()
            x.reconnect()
            html=spider(url,num_try-1)
    return html
result=spider(url)

将上面的代码和changeIP.py放在同一个文件夹中,才能使用import changeIP将更换IP的class导入。

代码定义了一个负责爬虫的函数spider(),最大的尝试次数为3。如果爬虫过程报错,并且尝试次数大于0,就会调用changeIP重新拨号上网,达到更换IP的目的。更换IP之后,再使用递归函数执行一次spider()函数,就能把结果爬取下来了。

当然这里使用其它服务器也是类似的操作,有点服务器还支持一键拨号、自动拨号,具体自己尝试!

Tor代理服务器

Tor(The Onion Router, “洋葱路由”)是互联网上用于保护隐私最有力的工具之一。如果我们不使用Tor,网络请求就会直接发送给目标服务器。
相比之下,如果使用Tor发送网络请求,客户端就会选择一条随机的路径到目标服务器。这条随机的路径中间会经过多个Tor的节点,而且使用“洋葱路由”加密技术,使得任何节点都不能偷取通信数据,并且该请求的传送路径难以追踪,也查不出起点在哪儿。

Tor的安装

鳄鱼君Ba使用的是Windows系统,所以这里只介绍在Windows上的安装和使用。Tor的安装方式分成Expert Bundle和Tor Browser(Tor浏览器), Expert Bundle是非图形化界面的使用Tor, Tor浏览器是一个可以隐藏自己IP使用的浏览器。鳄鱼君Ba这里使用Tor浏览器:

  1. 下载Tor浏览器。进入Tor官方网站下载Tor浏览器,地址为http://www.torproject.org/projects/torbrowser.html.en,需要可续上网才可以,下载exe安装程序。
  2. 下载完成后,直接打开安装文件,单击Install,安装在相应文件夹中即可。
  3. 安装完成后,单击Finish开启Tor浏览器的设置。

服务器采集 大规模爬虫 动态IP拨号服务器

在中国内地,无法直接单击连接连接Tor,那么可以单击设置进行设置。在下一个对话框中,选中Tor是否审查,然后选择Select a built-in bridge(选择已提供的桥),需要使用中间的桥才能连接Tor的服务,在下拉列表框中选择“meek-zure (works in China)”,单击连接按钮。之后等待连接:

服务器采集 大规模爬虫 动态IP拨号服务器

Tor的使用

Tor可以改变我们请求的IP地址。Tor采用的是Sock请求,所以需要在python中安装PySocks库,使用pip命令就可以:pip install pysocks

安装完成后,可以用下面的代码完成利用Tor改变请求的IP地址:

import socket
import socks
import requests
# Tor使用9150端口为默认的socks端口
socks.set_default_proxy(socks.SOCKS5,'127.0.0.1',9150)
socket.socket=socks.socksocket

# 获取这次抓取使用的IP地址
res=requests.get('http://checkip.amazonaws.com').text
print(res)

代码中,Tor的默认端口为9150,我们使用socks请求端口9150发出每次请求。默认端口可以在Tor浏览器的安装地址找到,在D:\Program Files\Tor Browser\Browser\TorBrowser\Data\Tor\torrc-defaults文件中,想看可以自己去找一下!

通过请求http://checkip.amazonaws.com获取这次抓取使用的IP地址,该URL在浏览器中访问,输出的是你本机的IP地址,通过Tor访问,输出的就是更换后的IP,效果如图:

服务器采集 大规模爬虫 动态IP拨号服务器

虽然目标服务器已经不知道我们真正的IP地址,但是如果继续请求该目标服务器,目标服务器获取的请求就会来自于同一个伪装IP,导致伪装的IP被封杀。因此,如果能够改变伪装的IP,则就不会担心IP被封。要更新IP,需要通过ControlPort连接Tor的服务,然后发出一个NEWNYM的信号。安装tor浏览器的时候已经默认ControlPort的端口是9151。这里需要使用Python的stem库,先用pip命令安装:pip install stem安装。

安装完成后,通过下面的代码实现抓取和更换IP:

from stem import Signal
from stem.control import Controller
import socket
import socks
import requests
import time

controller = Controller.from_port(port=9151) # 使用ControPort的9151端口
controller.authenticate() # 验证 默认不需要密码
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9150)
socket.socket = socks.socksocket
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
}

total_scrappy_time = 0
total_changeIP_time = 0
for x in range(0, 10):
    res = requests.get("http://checkip.amazonaws.com").text
    print("第", x + 1, "次IP:", res)
    time1 = time.time()
    a = requests.get("https://www.e1yu.com/",headers=headers).text
    time2 = time.time()
    total_scrappy_time = total_scrappy_time + time2 - time1
    print("第", x + 1, "次抓取花费时间:", time2 - time1)

    time3 = time.time()
    controller.signal(Signal.NEWNYM) # 更新IP
    time.sleep(5)
    time4 = time.time()
    total_changeIP_time = total_changeIP_time + time4 - time3 - 5
    print("第", x + 1, "次更换IP花费时间:", time4 - time3 - 5)

print("平均抓取花费时间:", total_scrappy_time / 10)
print("平均更换IP花费时间:", total_changeIP_time / 10)

代码对Tor的效率进行了计算,每次循环都会更换IP,测试出来的时间还可以接受,相比于不使用Tor代理的抓取速度,效率确实有点慢,但是它有不容忽视的优点:免费,IP相对于代理池,比较稳定!

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《服务器采集 大规模爬虫 动态IP拨号服务器》 发布于2020-07-06

分享到:
赞(0) 赏杯咖啡

评论 1

5 + 4 =
  1. #1

    不过这类的服务器一般都是会有限制!

    Teacher Du4周前 (07-06)回复

文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册