如何爬取网站:使用 Python、JavaScript 进行爬取的分步指南,以及我们关于如何在 2023 年爬取网站而不被封禁的 12 条建议

踏上激动人心的网页爬取之旅,既令人兴奋,也充满挑战:我们需要在互联网迷宫般的小巷中穿行,寻找有价值的数据。在浩瀚的数字宇宙中,网页爬取已成为一项关键技能,能够帮助我们高效挖掘信息、形成洞见,并理解不断扩展的万维网。

在这篇启发性的文章中,我们将深入探索网页爬取的复杂领域,揭示网页爬取与网页抓取之间的区别,同时探讨一系列策略和技术,助你提升网页爬取能力。

从动态的 JavaScript 网站领域,到简洁强大的 Python,我们将为你介绍大量技巧和方法,确保你的网页爬取之旅顺畅、高效且不受阻碍。

目录

那么,系好安全带,准备开启一段激动人心的旅程,探索迷人的网页爬取世界吧!

网页爬取与网页抓取

人们常常认为网页抓取和网页爬取是一回事,而且两者都用于数据挖掘,但它们之间存在关键区别。我们将探讨这些区别,并帮助你确定哪种方法最适合你的需求和业务目标。

主要区别

简单来说,网页爬取就是搜索引擎所做的事:它们在网络上浏览,查找所有可用信息,并跟踪每一个可访问的链接。这一通用流程旨在从特定网站收集尽可能多(甚至全部)的信息。从本质上说,这就是 Google 所做的——它会查看整个网页并为所有可用数据编制索引。

另一方面,如果你想下载收集到的信息,就会用到网页抓取。网页抓取(也称为网页数据提取)是一个更有针对性的过程。通过自定义指令并使用抓取代理,你可以从目标网站提取特定数据。随后,你可以将结果下载为合适的格式,例如 JSON 或 Excel。

在某些情况下,网页爬取和网页抓取可以共同用于实现一个目标,本质上分别是整个流程中的第一步和第二步。结合使用两者,你可以先用爬虫从大型网站收集大量信息,之后再用抓取工具提取并下载所需的特定数据。

4 种网页爬取策略

一般来说,网页爬虫只会访问部分网页,具体范围取决于爬虫预算,而爬虫预算可由每个域名的最大页面数量、爬取深度或持续时间等因素决定。

许多网站都提供 robots.txt 文件,用于指定网站中哪些部分可以爬取,哪些部分禁止爬取。此外,还有 sitemap.xml,它比 robots.txt 更为详细,可引导机器人爬取哪些路径,并为每个 URL 提供额外的元数据。

网页爬虫的常见用途包括:

  1. Googlebot、Bingbot 和 Yandex Bot 等搜索引擎会收集网络上大量网页的 HTML,并为数据编制索引,以便用户轻松搜索。
  2. SEO 分析工具不仅会收集 HTML,还会收集响应时间和响应状态等元数据,以识别失效页面,并跟踪域名之间的链接,从而分析反向链接。
  3. 价格监控工具会爬取电子商务网站,查找产品页面并提取元数据,尤其是价格。之后,它们会定期重新访问这些产品页面。
  4. Common Crawl 维护着一个公开的网页爬取数据存储库,例如包含 34.5 亿个网页的2022 年 5 月存档。

如何抓取 JavaScript 网站

抓取 JavaScript 网站可能比抓取静态 HTML 页面更具挑战性,因为内容通常由 JavaScript 代码加载和操作。要抓取此类网站,你需要使用能够执行 JavaScript 并渲染页面内容的无头浏览器。Puppeteer 库与 Node.js 运行环境相结合,是完成此任务的一种热门选择。

以下是使用 Puppeteer 和 Node.js 抓取 JavaScript 网站的分步指南:

1. 安装 Node.js

从官方网站下载并安装最新版 Node.js(https://nodejs.org/)。

2. 创建新的项目目录

为项目创建一个新目录,并通过命令行进入该目录。

mkdir js-crawler cd js-crawler

3. 初始化新的 Node.js 项目

在项目目录中运行以下命令,使用默认设置创建新的 package.json 文件。

npm init -y

4. 安装 Puppeteer

在项目目录中运行以下命令安装 Puppeteer

npm install puppeteer

5. 创建新的 JavaScript 文件

创建一个名为

crawler.js

的新文件,并将其放在项目目录中,用于存放抓取 JavaScript 网站的代码。

6. 编写爬虫代码

打开

crawler.js

并添加以下代码:

const puppeteer = require('puppeteer');async function crawlJavaScriptWebsite(url) {

启动新的浏览器实例

constbrowser =awaitpuppeteer.launch({headless:true});

在浏览器中创建新页面

constpage =awaitbrowser.newPage();

导航至目标 URL

awaitpage.goto(url, {waitUntil:'networkidle2'})

使用

evaluate()constdata =awaitpage.evaluate(() =>{

从页面提取数据。在此处编写自定义 JavaScript 代码来提取所需数据。例如,我们来提取页面中的所有标题(h1 元素)。

constheadings =Array.from(document.querySelectorAll('h1')).map(heading=>heading.textContent);return{ headings, }; });

关闭浏览器

awaitbrowser.close();

返回提取的数据

returndata; }

使用示例:

crawlJavaScriptWebsite('https://example.com/') .then(data=>console.log(data)) .catch(err=>console.error(err));

将

https://example.com/

URL 替换为目标网站的 URL,并自定义

page.evaluate()

函数以提取所需数据。

7. 运行爬虫

在项目目录中执行以下命令以运行爬虫:

node crawler.js

该脚本将启动无头浏览器,导航至目标 URL,并执行在

page.evaluate()

函数中指定的 JavaScript 代码。提取的数据将输出到控制台。

请注意,这只是一个抓取 JavaScript 网站的基础示例。对于更高级的应用场景,你可能需要与页面进行交互、处理 AJAX 请求、滚动页面,或应对 CAPTCHA 和 Cookie。

如何使用 Python 爬取网页

使用 Python 爬取网站包括获取网页、解析网页内容以及跟踪指向其他页面的链接。在本指南中,我们将使用两个常用的 Python 库:Requests 和 Beautiful Soup。本指南假设你已安装 Python,并且对 Python 编程有基本了解。

步骤 1:安装所需的库

使用 pip 安装 Requests 和 Beautiful Soup 库:

pip install requests beautifulsoup4

步骤 2:导入库

在 Python 脚本中导入所需的库:

importrequestsfrombs4importBeautifulSoup

步骤 3:创建一个获取网页内容的函数

使用 Requests 库创建一个获取网页内容的函数:

deffetch_page(url):response = requests.get(url)ifresponse.status_code ==200:returnresponse.textelse:print(f"Failed to fetch{url}(status code{response.status_code})")returnNone

步骤 4:创建一个解析网页内容的函数

使用 Beautiful Soup 库创建一个解析网页内容的函数:

defparse_page(html): soup = BeautifulSoup(html,"html.parser")returnsoup

步骤 5:创建一个从解析后的内容中提取链接的函数

创建一个从解析后的网页内容中提取所有链接的函数:

defextract_links(soup, base_url):links = []fora_taginsoup.find_all("a"):href = a_tag.get("href")ifhrefandnothref.startswith("#"):ifnothref.startswith("http"):href = base_url + hreflinks.append(href)returnlinks

步骤 6:创建一个爬取网站的函数

创建一个递归爬取网站的函数:

defcrawl_website(url, max_depth=2, depth=0):ifdepth > max_depth:returnhtml = fetch_page(url)ifnothtml:returnsoup = parse_page(html)links = extract_links(soup, url)print(f"{' ' * depth}[{depth}]{url}")forlinkinlinks:crawl_website(link, max_depth, depth +1)

步骤 7:运行爬虫

通过调用

crawl_website

函数并传入所需的网址和最大深度来运行爬虫:

if__name__ =="__main__":start_url ="https://example.com/"max_depth =2crawl_website(start_url, max_depth)

本分步指南介绍了如何使用 Python 爬取网站。你可以自定义

crawl_website

函数,以适应特定的网站结构,添加用于存储提取信息的逻辑,或实现更高级的爬取功能,例如处理 robots.txt、限制请求频率或并行发送请求。

12 个避免被封锁的网站爬取技巧

以下是进行网页爬取而不遭遇封锁的主要策略:

#1: 核查 Robots 排除协议

在爬取或抓取网站之前,请确保目标网站允许从其页面收集数据。检查网站的 robots 排除协议(robots.txt)文件,并遵守网站的规定。

即使网站允许爬取,也请注意尊重网站,不要对其造成损害。遵守 robots 排除协议中规定的要求,在非高峰时段爬取,限制来自单个 IP 地址的请求数量,并在请求之间设置延迟。

不过,即使网站允许网页抓取,你仍可能遭遇封锁,因此还必须遵循其他步骤。如需更全面的指南,请参阅我们的网页抓取 Python 教程。

#2: 使用代理服务器

没有代理,网页爬取几乎不可能进行。选择信誉良好的代理服务提供商,并根据任务在数据中心 IP 代理和住宅 IP 代理之间进行选择。

在你的设备与目标网站之间使用中间服务器,可以减少 IP 地址被封锁的情况、保证匿名性,并让你能够访问所在地区可能无法访问的网站。例如,如果你位于德国,可能需要使用美国代理才能访问美国的网络内容。

为获得最佳效果,请选择 IP 池规模大、覆盖地点广泛的代理提供商。

#3: 轮换 IP 地址

使用代理池时,轮换 IP 地址至关重要。

如果你从同一个 IP 地址发送过多请求,目标网站很快就会将你识别为威胁并封锁该 IP 地址。代理轮换可以让你看起来像是多个不同的互联网用户,从而降低被封锁的可能性。

所有 Oxylabs Residential Proxies 都会轮换 IP,但如果你使用 Datacenter Proxies,则应使用代理轮换服务。我们也会轮换 IPv6 和 IPv4 代理。如果你想了解 IPv4 与 IPv6 的区别,请阅读我的同事 Iveta 撰写的文章。

#4: 使用真实的 User-Agent

大多数托管网站的服务器都可以检查爬虫机器人生成的 HTTP 请求标头。这个 HTTP 请求标头称为 user agent,包含从操作系统和软件到应用程序类型及其版本等各种信息。

服务器可以轻松检测到可疑的 user agent。真实的 user agent 包含普通访客提交的常见 HTTP 请求配置。为避免被封锁,请务必自定义 user agent,使其看起来像普通用户使用的 user agent。

由于网页浏览器发出的每个请求都包含 user agent,因此你应经常更换 user agent。

使用最新且最常见的 user agent 也至关重要。如果你使用五年前的 user agent,且对应的是不受支持的 Firefox 版本发送请求,就会引起许多警觉。你可以在网上找到公开数据库,查看当前最常见的 user agent。我们也有自己的定期更新数据库,如需访问,请联系我们。

#5: 正确设置指纹

反抓取机制正变得日益复杂,一些网站会使用传输控制协议 (TCP) 或 IP 指纹识别来检测机器人。

进行网页抓取时,TCP 会留下各种参数。这些参数由终端用户的操作系统或设备确定。如果你想知道如何在抓取时避免被列入黑名单,请确保参数保持一致。或者,你可以使用 Web Unblocker——一款具备动态指纹识别功能的 AI 驱动代理解决方案。Web Unblocker 会以一种特殊方式组合多种指纹变量:即使它识别出一个效果最佳的指纹,这些指纹看起来仍然是随机的,并且能够通过反机器人检查。

#6: 警惕蜜罐陷阱

警惕蜜罐陷阱。这些陷阱是 HTML 代码中的链接,网页抓取工具可以检测到,但普通用户看不到。它们用于识别并封锁网页爬虫,因为只有机器人会点击这些链接。虽然设置蜜罐需要投入大量工作,但有些目标网站可能会用它们来检测网页爬虫,因此如果你的请求被封锁并检测到爬虫,请保持警惕。

#7: 使用 CAPTCHA 求解服务

CAPTCHA 对网页爬取构成了重大挑战,因为它要求访客解答谜题以确认自己是人类。这些谜题通常包含计算机难以识别的图像。要绕过 CAPTCHA,请使用专门的 CAPTCHA 求解服务或现成的爬取工具,例如 Oxylabs 的数据爬取工具,它可以解决 CAPTCHA 并提供可直接使用的结果。可疑行为可能会触发目标网站要求你解决 CAPTCHA。

#8: 更改爬取模式

为避免被封锁,请修改爬虫的导航模式,使其看起来不那么容易预测。你可以添加随机点击、滚动和鼠标移动,以模仿普通用户的浏览行为。为了遵循最佳实践,请思考普通用户会如何浏览网站,并将这些原则应用到工具中。例如,先访问主页,再请求内页,就是一种合乎逻辑的模式。

#9: 降低抓取速度

为降低被封锁的风险,可以在请求之间加入随机间隔,或在执行操作前设置等待命令,以降低抓取速度。如果 URL 实施了速率限制,请遵守网站的限制并降低抓取速度,以避免请求被限流。

#10: 在非高峰时段爬取

爬虫的运行速度比普通用户快,会对服务器负载产生重大影响。在负载较高的时段爬取,可能会因服务变慢而对用户体验造成负面影响。为避免这种情况,请在非高峰时段爬取,例如午夜刚过(按服务所在地区的时间),以减轻服务器负载。

#11: 避免抓取图片

抓取图片可能存在风险,因为图片通常是数据量较大的对象,而且可能受版权保护。此外,图片通常隐藏在 JavaScript 元素中,这会增加抓取过程的复杂性并降低网页抓取工具的速度。要从 JS 元素中提取图片,则需要采用更复杂的抓取流程。

#12: 使用无头浏览器

无头浏览器是一种像普通浏览器一样运行,但没有图形用户界面的工具。它可以抓取通过渲染 JavaScript 元素加载的内容。最常用的浏览器 Chrome 和 Firefox 都提供无头模式,可用于网页抓取而不会触发封锁。

网站爬取视频教程

在这篇 Oxylabs 教程中,你将了解网页爬取的基础知识及其在数据收集中的重要性,同时探讨相关的伦理和法律问题。教程介绍了 Scrapy、Beautiful Soup 和 Selenium 等热门工具,并帮助你根据需求选择最合适的工具。

本教程将帮助你了解网站的结构、创建简单的网页爬虫,并提取所需信息。它还提醒你遵循良好的网页抓取规范,例如尊重 robots.txt 规则,不要让服务器过载。

视频还将帮助你应对一些挑战,例如从动态页面获取数据、处理多个页面以及避免被屏蔽。它会展示如何保存和整理数据,并提供建议,帮助你扩大网页爬取项目的规模、提高效率。最后,视频提醒你始终遵循伦理和法律准则。

结语

当我们这场令人振奋的网页爬取探索之旅即将结束时,我们不难发现,掌握这门技艺就如同在浩瀚且瞬息万变的互联网世界中拥有一张藏宝图。我们深入探讨了网页爬取与网页抓取之间的区别,了解了各种策略,并探索了 JavaScript 网站和由 Python 驱动的网页爬取这一动态领域。

我们分享的丰富技巧和建议将确保你的网页爬取工作负责任且符合伦理规范,帮助你避开过程中可能出现的陷阱和障碍。因此,当你带着从这篇全面的文章中汲取的知识与智慧,扬帆驶入无边无际的数字海洋时,请记住,掌握网页爬取的力量将让你脱颖而出,并发掘数字世界深处隐藏的宝藏。