什么是代理服务器?
简而言之,代理是客户端与服务器之间的中间件。当客户端向其他服务器请求资源时,代理会充当中间人。客户端-代理-服务器的关系流程大致如下:
- 客户端连接到代理服务器,向目标服务器请求某项服务
- 代理服务器会分析请求,连接到目标服务器并获取所需的服务
- 接收后,它会将该服务原样转回给客户端。
此外,代理服务器还用于:
- 加强安全
- 提升网络性能
- 过滤网络流量
- 屏蔽不需要的网站
- 绕过互联网访问的地理限制
什么是 ISP 代理?
正如我们在引言中讨论的那样,代理主要分为三种类型。前两种的定义相当直观。数据中心代理是由数据中心拥有的代理,这意味着其 IP 地址与该数据中心相关联。而住宅代理的 IP 地址则与某个物理位置相关联,此外,这些 IP 地址还注册在特定的个人或组织名下。
说到IPS代理,这里存在一些混淆。首先,ISP是“互联网服务提供商”(Internet Service Provider)的缩写。正如你所想象的,所有住宅IP都源自ISP。这个小细节在一定程度上解答了这个问题。ISP代理在数据中心代理和住宅代理之间占据了一席之地。
大多数情况下,你会发现 ISP 代理实际上是一种住宅代理,托管在数据中心的服务器上。因此,这类代理兼具前两种代理的优势。其主要优势包括(但不限于):
- IP地址的合法性——使用住宅IP地址可降低被识别为机器人的风险
- 速度——将代理部署在数据中心服务器上可提升服务性能
为什么在网页抓取中使用 ISP 代理?
在网页抓取中使用代理服务器是一种非常普遍的需求。但在具体讨论 ISP 代理之前,让我先向您说明代理为何对抓取如此重要。首先,让我们定义一下什么是网页抓取。 从宏观层面来看,网页抓取是指访问服务器以提取资源的行为。这通常通过自动化软件来实现。此外,网页抓取通常涉及在短时间内向目标服务器发送大量请求。
可以想象,这会给服务器带来巨大的负担。正因如此,网络平台通常并不“欢迎”爬虫访问其服务器。为了阻止自动化软件的访问,这些平台通常会采用某种检测和防范系统。其中一种检测方法极其简单:检查 IP 地址。人们普遍认为,与数据中心相关的 IP 地址更有可能运行机器人程序,这已是常识。
我认为这很好地回答了这个问题。如果我们结合之前讨论的主要优势来考虑,就能对这个答案有更全面的理解。我们在网络爬虫中主要使用 ISP 代理,目的是在保持最佳性能的同时提高成功率。但这还不是全部。让我们来探讨其他场景:
#1:访问特定地区的网站
相信您一定遇到过针对特定地区访客的网站。在搜索引擎优化(SEO)领域,这一概念被称为“基于地理位置的内容”。具体来说,网站会首先检查客户端IP地址的来源。如果该地址符合网站的预设模式(例如,一个仅面向美国用户的美国网站),就会允许该用户访问;反之,如果用户来自其他国家,网站则会阻止其访问。
在网页抓取中,这种情况非常常见。因此,作为一种解决方法,我们将使用来自该特定国家的代理。您可以先尝试使用数据中心代理。如果仍然被封禁,您可以尝试使用 ISP 代理,其成功率通常更高。
#2:发送大量请求
当我们想要访问服务器上的大量资源时,可能会给该服务器带来很大负载。服务器通常会将此视为滥用行为,并封禁发送所有这些请求的 IP 地址。在网页抓取中,为了避免被封禁,我们会使用一种在 ISP 代理之间切换的轮换系统。这样,服务器就会“认为”是不同的家庭用户在访问它。因此,批量请求就不会被封禁。
如何使用 ISP 代理进行网页抓取?
网络爬虫主要有两种类型:
- 基于简单的HTTP客户端
- 支持渲染 JavaScript
第一种方式并不复杂,通常速度也更快,因为它不需要渲染 JavaScript。这与发送一条 `curl` 命令并无二致。然而,大多数现代网站都高度依赖 JavaScript。一个很好的例子是使用简单的 HTTP 客户端抓取一个基于 React 或 Next.js 构建的 Web 平台。在这种情况下,你很可能收到一个显示“请启用 JavaScript”的 HTML 文件。 以下是我用 React 构建的一个应用的典型示例:
~ » curl https://<REACT_APP>.com
...<body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
因此,如果你想构建一个现代化的网页抓取工具,很可能需要使用网页浏览器的自动化版本。这将有助于你解析 JavaScript,并在目标页面上执行各种操作。
我通常在示例中使用 JavaScript 和 Puppeteer。但这次我想换用我最早接触且最喜欢的编程语言:Python。而 Python 中最常用的 Web 驱动程序解决方案是Selenium。那么,让我们来看看如何使用 Selenium 和 ISP 代理构建一个网页爬虫:
#1:创建新项目
首先,我们先创建一个用于存放文件的新目录。接下来,在您常用的集成开发环境(我使用的是 Visual Studio Code)中打开该项目,并开启一个新的终端窗口。要在 VSCode 中开启新终端,请依次点击“终端”>“新建终端”。我们将在该项目内创建一个新的虚拟环境并激活它:
~ " python3 -m venv env && source env/bin/activate
在你的项目中,让我们创建一个新的“scraper.py”文件,并在其中添加一些代码。从函数式编程的角度来看,使用 Selenium 构建爬虫的基本结构是:
from selenium import webdriver
def scrape_page(url):
driver = webdriver.Chrome()
driver.get(url)
return driver.page_source
就这样。只需5行代码:
- 我们正在启动一个自动化浏览器
- 我们正在访问目标
- 我们正在收集这些资源。
但请记住,我们希望在 Selenium 中使用 ISP 代理。这样,我们的浏览器虽然不是最隐蔽的,但可以说更难被检测到。幸运的是,在 Python 中实现起来相当简单(这也是我喜欢它的原因)。以下是在 Selenium 中引入代理的方法:
from selenium import webdriver
def scrape_page(url, proxy):
options = webdriver.ChromeOptions()
options.add_argument('--proxy-server=%s' % proxy)
driver = webdriver.Chrome(options=options)
driver.get(url)
return driver.page_source
print(scrape_page('http://httpbin.org/ip', '75.89.101.60:80'))
我们只是在函数内部添加了更多代码行。最后一行是调用该函数。如果你现在运行脚本,应该能看到请求源自 75.89.101.60。 为了演示需要,我使用了这里提供的免费代理服务器。但如果你想构建一个真正的爬虫,建议你寻找更可靠的来源。最好是那些同时提供 ISP 代理的代理服务商。
如何查询IP地址的来源?
有几种方法可以检查某个 IP 地址是否来自 ISP 代理。但既然今天我们要讨论 DevOps,你最好先熟悉一下终端的使用。今天我将向大家介绍 `whois`。
在 Unix 及类 Unix 操作系统中,`whois` 是内置命令。这是一个命令行工具,允许用户查询目标的相关信息。这些目标可以是域名,也可以是 IP 地址。那么,让我们打开一个新的终端窗口,试用一下这个命令。
首先,让我们向 ipify.org 提供的 API 发送一条 `curl` 命令。这样,你就可以获取自己的 IP 地址,并使用它进行测试。如果你不熟悉 `curl`,可以参考我关于如何使用 curl 的文章。
~ » curl api.ipify.org
<IP_ADDRESS>
Now that we have an IP address to test on, just send your `whois` command. I’ve used my own IP, but feel free to replace <IP_ADDRESS> with yours:
~ » whois <IP_ADDRESS>
...
inetnum: 82.78.XX.0 - 82.78.XX.XX
netname: RO-RESIDENTIAL
descr: RCS & RDS Residential CGN
descr: City: Bucuresti
remarks: INFRA-AW
country: RO
...
虽然生成的结果较多,但我主要是想让大家了解检测家庭IP地址是多么容易。此外,还有一些公开API可以追踪数据中心IP地址,例如incolumitas提供的服务。
结论
今天,我们探讨了构建网络爬虫所需的DevOps和编码技能。最后,我想问大家一个简单的问题:能否说ISP代理不过是隐藏在住宅IP地址背后的数据中心代理?我认为这并非最准确的定义,但确实很好地描述了这类代理。
在 Web Scraping API 中,我们同时使用家庭代理和数据中心代理。这是因为某些目标允许非家庭流量,而另一些则不允许。如果您想进一步了解如何在我们的 API 中使用代理,请查阅我们的文档。




