美文网首页
第 14 章 远程采集

第 14 章 远程采集

作者: 万事皆成 | 来源:发表于2018-09-13 15:01 被阅读10次

这一章将介绍几种方法,让程序在不同的机器上运行,或者在电脑上用不同的 IP 地址运行。你可能打算放弃这一章,因为你现在还不需要这些内容,但是你可能会感到惊讶,自己原来已经拥有非常容易上手的工具了(比如一些付费的 VPS 或云计算资源),而且当你停止在自己的笔记本上运行 Python 爬虫后,生活会变得更加轻松。

14.1 为什么要用远程服务器

启用远程平台的人通常 有两个目的:对更大计算能力和灵活性的需求,以及对可变 IP 地址的需求。

14.1.1 避免 IP 地址被封杀

建立网络爬虫的第一原则是:所有信息都可以伪造。
但是有一件事情是不能作假的,那就是你的 IP 地址。
注意: 从技术上说,IP 地址是可以通过发送数据包进行伪装的,就是分布式拒绝服务攻击技术(Distributed Denial of Service,DDoS),攻击者不需要关心接收的数据包(这样发送请求的时候就可以使用假 IP 地址)。但是网络数据采集是一种需要关心服务器响应的行为,所以我们认为 IP 地址是不能造假的。
阻止网站被采集的注意力主要集中在识别人类与机器人的行为差异上面。
封杀 IP 地址这种矫枉过正的行为是最后一步棋,不过是一种非常有效的方法,只要忽略危险 IP 地址发来的数据包就可以了。但是,使用这种方法会遇到以下几个问题。
• IP 地址访问列表很难维护。虽然大多数大型网站都会用自己的程序自动管理 IP 地址访问列表(机器人封杀机器人),但是至少需要人偶尔检查一下列表,或者至少要监控问 题的增长。
• 因为服务器需要根据 IP 地址访问列表去检查每个准备接收的数据包,所以检查接收数 据包时会额外增加一些处理时间。多个 IP 地址乘以海量的数据包更会使检查时间指数级增长。为了降低处理时间和处理复杂度,管理员通常会对 IP 地址进行分组管理并制定相应的规则,比如如果这组 IP 中有一些危险分子就“把这个区间的所有 256 个地址 全部封杀”。于是产生了下一个问题。
• 封杀 IP 地址可能会导致意外后果。
虽然有这些缺点,但封杀 IP 地址依然是一种十分常用的手段,服务器管理员用它来阻止可疑的网络爬虫入侵服务器。

14.1.2 移植性与扩展性

有一些任务想通过个人电脑连网完成会十分困难。即使你并不想给任何一个网站增加负载,但是如果你会从一堆网站里收集数据,也会需要更快的网速以及更多存储空间。
另外,自己电脑上的计算资源释放之后,你就可以做很多更重要事情。你也不用担心电费和网速了(在星巴克启动你的应用,合上笔记本离开,每件事情都可以安全地运行),你也可以在任何有网络连接的地方收集数据。
如果你的一个应用需要非常大的计算能力,亚马逊 AWS 的一个超大计算实例也不能满足你的需求,那么你可以看看分布式计算(distributed computing)。这种方法可以让多个机器并发执行来完成你的任务。一个简单的例子是你可以用一台机器来采集一些网站,再用另一台机器采集另一些网站,最后在把所有的结果存储在同一个数据库里。

14.2 Tor 代理服务器

洋葱路由(The Onion Router)网络,常用缩写为 Tor,是一种 IP 地址匿名手段。由网络志 愿者服务器构建的洋葱路由器网络,通过不同服务器构成多个层(就像洋葱)把客户端包在最里面。数据进入网络之前会被加密,因此任何服务器都不能偷取通信数据。另外,虽然每一个服务器的入站和出站通信都可以被查到,但是要想查出通信的真正起点和终点, 必须知道整个通信链路上所有服务器的入站和出站通信细节,而这基本是不可能实现的。
Tor 是人权工作者和政治避难人员与记者通信的常用手段,得到了美国政府的大力支持。 当然,它经常也被用于非法活动,所以也是政府盯防的目标(虽然目前盯防得并不是很成功)。
Tor 匿名的局限性
虽然我们在本书中用 Tor 的目的是改变 IP 地址,而不是实现完全匿名,但有
必要关注一下 Tor 匿名方法的能力和不足。
虽然 Tor 网络可以让你访问网站时显示的 IP 地址是一个不能跟踪到你的 IP 地址,但是你在网站上留给服务器的任何信息都会暴露你的身份。
另外,登录 Tor 的行为也可能让你的匿名状态处于危险之中。
登录 Tor 网络不是一个自动的匿名措施,也不能让你进入互联网上任何区域。虽然它是一个实用的工具,但是用它的时候一定要谨慎、清醒,并且遵守道德规范。
Tor 服务很容易安装和开启。 只要去 Tor 下载页面下载并安装,打开后连接就可以。不过要注意,当你用 Tor 的时候网速会变慢。这是因为代理有可能要先在全 世界网络上转几次才到目的地!
PySocks
PySocks 是一个非常简单的 Python 代理服务器通信模块,它可以和 Tor 配合使用。你可以 从它的网站上下载,或者使用任何第三方模块管理器安装。
这个模块的用法很简单。示例代码如下所示。运行的时候,Tor 服务必须运行在 9150 端口 (默认值)上:

import socks
import socket
from urllib.request import urlopen

socks.set_default_proxy(socks.SOCKS5, "localhost", 9150) 
socket.socket = socks.socksocket 
print(urlopen('http://icanhazip.com').read())

网站 http://icanhazip.com/ 会显示客户端连接的网站服务器的 IP 地址,可以用来测试 Tor 是否正常运行。当程序执行之后,显示的 IP 地址就不是你原来的 IP 了。
如果你想在 Tor 里面用 Selenium 和 PhantomJS,不需要 PySocks,只要保证 Tor 在运行,然后增加 service_args 参数设置代理端口,让 Selenium 通过端口 9150 连接网站就可以了

14.3 远程主机

把网络爬虫放在远程主机(Remote Hosting)上动态地改善它们的运行速度。
不仅可以自由购买服务器的使用时间,使用更强大的机器,而且网络连接也不需要在到达访问目的地之前在 Tor 网络中长途跋涉。

14.3.1 从网站主机运行

大多数小型网络主机都会提供一个软件叫 cPanel,提供网站管理和后台服务的基本管理功能和信息。如果你接入了 cPanel,就可以设置 Python 在服务器上运行——进入“Apache Handlers”然后增加一个 handler(如还没有的话):

      Handler: cgi-script
      Extension(s): .py

这会告诉服务器所有的 Python 脚本都将作为一个 CGI 脚本运行。CGI 就是通用网关接口 (Common Gateway Interface),是可以在服务器上运行的任何程序,会动态地生成内容并显示在网站上。把 Python 脚本显式地定义成 CGI 脚本,就是给服务器权限去执行 Python 脚
本,而不只是在浏览器上显示它们或者让用户下载它们。
写完 Python 脚本后上传到服务器,然后把文件权限设置成 755,让它可执行。通过浏览器找到程序上传的位置(也可以写一个爬虫来自动做这件事情)就可以执行程序。如果你担心在公共领域执行脚本不安全,可以采取以下两种方法。
• 把脚本存储在一个隐晦或深层的 URL 里,确保其他 URL 链接都不能接入这个脚本,这样可以避免搜索引擎发现它。
• 用密码保护脚本,或者在执行脚本之前用密码或加密令牌进行确认。
确实,通过这些原本主要是用来显示网站的服务运行 Python 脚本有点儿复杂。比如,你可能会发现网络爬虫运行时网站的加载速度变慢了。其实,在整个采集任务完成之前页面都是不会加载的(得等到所有“print”语句的输出内容都显示完)。

14.3.2 从云主机运行

这次用户不再为单个物理机器的计算能力付费,而是为多个机器共同的计算能力付 费。这种云状计算系统的计算能力可以按使用时间进行付费。
计算实例还可以进行定制,也可以根据应用程序的实际需求进行设置,选项有“高内存”“快速计算”“大容量存储”。虽然网络爬虫不需要很多内存,但是你可能需要较大的存储空间或快速的计算能力来实现爬虫的更多功能。如果你要做大量的自然语言处理、 OCR 或者路径查找(就像“维基百科六度分隔理论”问题)之类的工作,选择“快速计算”实例就可以。如果你要采集大量数据,存储许多文件,或者进行大数据分析,可能就需要用带大容量存储的计算实例了。
设置好计算实例之后,你就有了新 IP 地址、用户名,以及可以通过 SSH 进行实例连接的公私密钥了。

14.4 其他资源

如果你想建立规模更大或更复杂的爬虫,在创建云计算平台以收集和存储数据时,可能还需要一些参考资料。
Marc Cohen、Kathryn Hurley 和 Paul Newson 合著的 Google Compute Engine 是通过 Python 和 JavaScript 使用 Google 云计算平台的第一手资料。书中不仅介绍了 Google 的用户界面,还介绍了命令行和脚本工具,可以让你的应用获取更大的灵活性。
如果你更喜欢亚马逊,Mitch Garnaat 的 Python and AWS Cookbook 是一本非常实用的手册,可以让你顺利启动 AWS 服务,还会告诉你如何创建并运行一个可扩展的应用。

14.5 勇往直前

网络一直在不断地变化。那些给我们带来了图像、视频、文字和其他数据文件的计算机 技术也在不断地升级和改进。如果想紧跟技术潮流,采集互联网数据的技术就需要随机应变。
但是,采集网站内容的基本思路和一般方法是不会改变的。 无论现在还是将来,遇到一个网络数据采集项目时,你都应该问问自己以下几个问题。
• 我需要回答或要解决的问题是什么?
• 什么数据可以帮助我,它们都在哪里?
• 网站是如何展示数据的?我能准确地识别网站代码中包含信息的部分吗?
• 该如何定位这些数据并获取它们?
• 为了让数据更实用,我应该做怎样的处理和分析?
• 怎样才能让采集过程更好,更快,更稳定?
总之,你不仅需要掌握如何使用本书中介绍的工具,还要知道如何把它们有效地组合起来解决问题。有时,数据格式很规范,比较容易获取,用一个简单的爬虫就搞定了。有时,你可能需要仔细地思考一番才能解决。
在使用自动化技术采集互联网数据时,其实很少遇到完全无法解决的问题。记住一点就行:互联网其实就是一个用户界面不太友好的超级 API。

相关文章

网友评论

      本文标题:第 14 章 远程采集

      本文链接:https://www.haomeiwen.com/subject/kmbwgftx.html