
踏上网络爬虫的冒险之旅既令人兴奋又充满挑战,因为人们需要在互联网的迷宫般小巷中穿梭,寻找有价值的数据。在广阔的数字世界中,网络爬虫技术已成为一项关键技能,它使我们能够高效地挖掘信息、获得洞察力并理解不断扩展的万维网。
在这篇富有启发性的文章中,我们将穿越网络爬行的复杂领域,揭示网络爬行和网络抓取之间的差异,同时探索一系列可以提高您的网络爬行能力的策略和技术。
从 JavaScript 网站的动态领域到 Python 的强大简便性,我们将指导您完成大量技巧和技术,以确保您的网络爬行之旅顺利、有效且畅通无阻。
目录
所以,系好安全带,准备踏上令人着迷的网络爬行世界的激动人心的旅程吧!
Web 爬取与 Web 抓取
虽然网络抓取和网络爬行通常被认为是同一件事,并且两者都用于数据挖掘,但它们有关键的区别。我们将探讨这些差异,并帮助您确定哪种方法最适合您的需求和业务目标。
主要差异
简而言之,网络爬行就是搜索引擎的工作:它们在网络中导航,寻找任何可用的信息,并跟踪每个可访问的链接。此一般过程旨在从特定网站收集尽可能多(甚至全部)的信息。本质上,这就是谷歌所做的——它查看整个网页并索引所有可用数据。
另一方面,当您想要下载收集到的信息时,就会使用网络抓取。网页抓取(也称为网页数据提取)是一个更有针对性的过程。通过自定义命令和利用抓取代理,您可以从目标网站提取特定数据。随后,您可以以合适的格式下载结果,例如 JSON 或 Excel。
在某些情况下,网页爬取和网页抓取都可用于实现一个目标,本质上是流程中的第一步和第二步。通过结合两者,您可以使用爬虫从主要网站收集大量信息,然后使用抓取工具提取和下载所需的特定数据。
4 网络爬行策略
一般来说,网络爬虫根据爬虫预算仅访问一部分网页,爬虫预算可以由每个域的最大页面数、深度或持续时间等因素确定。
许多网站都提供 robots.txt 文件,用于指定网站哪些部分可以抓取、哪些部分禁止抓取。此外,还有比 robots.txt 更详细的 sitemap.xml 文件,可以指导机器人抓取哪些路径,并为每个 URL 提供额外的元数据。
网络爬虫的常见用途包括:
- Googlebot、Bingbot 和 Yandex Bot 等搜索引擎从网络的大量部分收集 HTML,并对数据进行索引以便于搜索。
- SEO 分析工具不仅收集 HTML,还收集元数据(例如响应时间和响应状态),以识别损坏的页面并跟踪域之间的链接以进行反向链接分析。
- 价格监控工具抓取电子商务网站以定位产品页面并提取元数据,特别是价格。然后定期重新访问这些产品页面。
- Common Crawl 维护着 网络爬取数据的公共存储库, 像 2022 年 5 月存档 包含 34.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) {
启动新的浏览器实例
const browser = await puppeteer.launch({ headless: true });
在浏览器中创建新页面
const page = await browser.newPage();
导航到目标 URL
await page.goto(url, { waitUntil: 'networkidle2' })
使用以下方式从页面中提取数据
evaluate()
const data = await page.evaluate(() => {
在此处编写自定义 JavaScript 代码,以提取所需数据。例如,让我们从页面中提取所有标题(h1 元素)。
const headings = Array.from(document.querySelectorAll('h1')).map(heading => heading.textContent);
return {
headings,
};
});
关闭浏览器
await browser.close();
返回提取的数据
return data;
}
使用示例:
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 网站的基本示例。对于更高级的用例,您可能需要与页面交互、处理 AJAX 请求、滚动页面或处理 CAPTCHA 和 Cookie。
如何使用 Python 爬网
使用 Python 抓取网站涉及获取网页、解析其内容以及跟踪指向其他页面的链接。在本指南中,我们将使用两个流行的 Python 库:Requests 和 Beautiful Soup。本指南假设您已安装 Python 并对 Python 编程有基本的了解。
步骤 1:安装所需的库
使用 pip 安装 Requests 和 Beautiful Soup 库:
pip install requests beautifulsoup4
第 2 步:导入库
在 Python 脚本中导入所需的库:
import requests
from bs4 import BeautifulSoup
步骤 3:创建一个函数来获取网页内容
创建一个函数来使用 Requests 库获取网页内容:
def fetch_page(url):
response = requests.get(url)
if response.status_code == 200:
return response.text
else:
print(f"Failed to fetch {url} (status code {response.status_code})")
return None
第四步:创建解析网页内容的函数
使用Beautiful Soup库创建一个解析网页内容的函数:
def parse_page(html):
soup = BeautifulSoup(html, "html.parser")
return soup
步骤 5:创建一个函数来从解析的内容中提取链接
创建一个函数来从解析的网页内容中提取所有链接:
def extract_links(soup, base_url):
links = []
for a_tag in soup.find_all("a"):
href = a_tag.get("href")
if href and not href.startswith("#"):
if not href.startswith("http"):
href = base_url + href
links.append(href)
return links
第6步:创建一个抓取网站的函数
创建一个函数来递归爬取网站:
def crawl_website(url, max_depth=2, depth=0):
if depth > max_depth:
return
html = fetch_page(url)
if not html:
return
soup = parse_page(html)
links = extract_links(soup, url)
print(f"{' ' * depth}[{depth}] {url}")
for link in links:
crawl_website(link, max_depth, depth + 1)
第7步:运行爬虫
通过调用执行爬虫
crawl_website
具有所需 URL 和最大深度的函数:
if __name__ == "__main__":
start_url = "https://example.com/"
max_depth = 2
crawl_website(start_url, max_depth)
本分步指南将介绍如何使用 Python 爬取网站。您可以自定义
crawl_website
函数来处理特定的网站结构,添加用于存储提取的信息的逻辑,或实现更高级的爬行功能,例如处理 robots.txt、速率限制或并行化请求。
12 条关于如何不被阻止地爬取网站的提示
这些是避免遇到阻塞的网页爬取的主要策略:
#1:验证 Robots 排除协议
在抓取或爬取网站之前,请确保目标网站允许从其页面收集数据。检查网站的 robots 排除协议 (robots.txt) 文件,并遵守网站的规定。
即使网站允许抓取,也请尊重网站,不要损害网站。请遵守 Robots 排除协议中的规定,在非高峰时段抓取,限制来自单个 IP 地址的请求,并在请求之间设置延迟。
然而,即使网站允许网页抓取,您仍然可能会遇到拦截,因此务必遵循其他步骤。如需更全面的指南,请参阅我们的网页抓取 Python 教程。
#2:使用代理服务器
如果没有代理,网络爬取几乎是不可能的。选择信誉良好的代理服务提供商,并根据您的任务在数据中心和住宅 IP 代理之间进行选择。
在您的设备和目标网站之间使用代理可以减少 IP 地址被屏蔽,保证匿名性,并允许您访问您所在地区可能无法访问的网站。例如,如果您位于德国,则可能需要使用美国代理才能访问美国境内的网站内容。
为了获得最佳结果,请选择具有大型 IP 池和广泛位置的代理提供商。
#3:轮换 IP 地址
当使用代理池时,轮换 IP 地址至关重要。
如果您从同一 IP 地址发送过多请求,目标网站很快就会将您视为威胁并封锁您的 IP 地址。代理轮换可让您看起来像是几个不同的互联网用户,从而降低被封锁的可能性。
所有 Oxylabs 住宅代理均支持 IP 轮换,但如果您使用的是数据中心代理,则需要使用代理轮换服务。我们也提供 IPv6 和 IPv4 代理轮换服务。如果您对 IPv4 和 IPv6 之间的区别感兴趣,请阅读我的同事 Iveta 撰写的文章。
#4:使用真实用户代理
大多数托管网站的服务器都可以检查爬虫程序生成的 HTTP 请求的标头。此 HTTP 请求标头称为用户代理,包含从操作系统和软件到应用程序类型及其版本等各种信息。
服务器可以轻松检测到可疑的用户代理。真正的用户代理包含由自然访问者提交的流行 HTTP 请求配置。为避免被屏蔽,请确保自定义您的用户代理以使其类似于自然用户代理。
由于 Web 浏览器发出的每个请求都包含一个用户代理,因此您应该经常切换用户代理。
使用最新且最流行的用户代理也至关重要。如果您使用五年前的老旧用户代理,并在不受支持的 Firefox 版本中发出请求,则会引起很多警示。您可以在互联网上找到公共数据库,其中显示当前最流行的用户代理。我们也有自己的定期更新数据库,如果您需要访问,请联系我们。
#5:正确设置指纹
反抓取机制变得越来越复杂,一些网站使用传输控制协议 (TCP) 或 IP 指纹来检测机器人。
在抓取网页数据时,TCP 会留下各种参数。这些参数由最终用户的操作系统或设备设置。如果您想知道如何避免在抓取数据时被列入黑名单,请确保您的参数保持一致。或者,您可以使用 Web Unblocker——一款基于人工智能的代理解决方案,具有动态指纹识别功能。Web Unblocker 会将多种指纹识别变量组合在一起,即使它识别出单个最佳指纹,这些指纹仍然看似随机,并且可以通过反机器人检查。
#6:警惕蜜罐陷阱
请小心蜜罐陷阱,这些陷阱是 HTML 代码中的链接,可以被网络抓取工具检测到,但对有机用户来说是不可见的。这些陷阱用于识别和阻止网络爬虫,因为只有机器人才会跟踪这些链接。尽管设置蜜罐需要大量工作,但某些目标可能会使用它们来检测网络爬虫,因此如果您的请求被阻止并且检测到爬虫,请务必小心。
#7:利用 CAPTCHA 解决服务
验证码 (CAPTCHA) 对网络爬虫构成重大挑战,因为它要求访问者解答谜题以确认其身份。这些谜题通常包含计算机难以解读的图像。要绕过验证码,请使用专门的验证码解答服务或现成的爬虫工具,例如 Oxylabs 的数据爬虫工具,该工具可以解答验证码并提供现成的结果。可疑行为可能会触发目标请求验证码解答。
#8:改变爬行模式
为了避免被拦截,请修改抓取工具的导航模式,使其看起来不那么可预测。您可以添加随机点击、滚动和鼠标移动,以模拟普通用户的浏览行为。最佳实践是,思考典型用户如何浏览网站,并将这些原则应用于工具。例如,先访问主页,然后再请求内部页面,这是一种合理的模式。
#9:降低刮板速度
为了降低被拦截的风险,可以通过在请求之间添加随机中断或在执行操作之前启动等待命令来降低抓取速度。如果 URL 有速率限制,请尊重网站的限制并降低抓取速度,以避免请求被限制。
#10:非高峰爬行
爬虫的移动速度比普通用户快,会严重影响服务器负载。在高负载时段进行爬取可能会因服务速度变慢而对用户体验产生负面影响。为避免这种情况,请在非高峰时段(例如午夜刚过后(本地服务))进行爬取,以减轻服务器负载。
#11:避免图像抓取
抓取图像可能存在风险,因为它们通常是可能受版权保护的数据密集型对象。此外,图像通常隐藏在 JavaScript 元素中,这会增加抓取过程的复杂性并减慢网络抓取速度。要从 JS 元素中提取图像,需要采用更复杂的抓取过程。
#12:使用无头浏览器
无头浏览器是一种与常规浏览器类似但没有图形用户界面的工具。它允许抓取通过渲染 JavaScript 元素加载的内容。最广泛使用的浏览器 Chrome 和 Firefox 具有无头模式,可用于网页抓取而不会触发阻止。
如何抓取网站的视频教程
在本 Oxylabs 教程中,您将了解网络爬虫的基础知识及其对数据收集的重要性,并探讨道德和法律方面的问题。教程将展示 Scrapy、Beautiful Soup 和 Selenium 等热门工具,并帮助您根据需求选择最合适的工具。
本教程将帮助您了解网站结构、创建简单的网络爬虫并提取所需信息。此外,它还会提醒您遵循良好的网络爬虫规范,例如遵守 robots.txt 规则以及避免服务器过载。
该视频还可以帮助您应对挑战,例如从动态页面获取数据、处理多个页面以及避免阻塞。它展示了如何保存和组织数据,并提供了有关使网络爬行项目更大、更高效的提示。最后,它提醒您始终遵守道德和法律准则。
当我们对网络爬虫世界激动人心的探索接近尾声时,我们清楚地意识到,掌握这门艺术就如同在浩瀚而瞬息万变的互联网世界中找到一张藏宝图。我们深入探究了区分网络爬虫和网络数据抓取的复杂细节,发现了各种不同的策略,并探索了 JavaScript 网站和 Python 驱动的网络爬虫的动态领域。
我们的提示和建议宝库可确保您的网络爬行工作保持负责任和道德,避免一路上可能出现的陷阱和障碍。因此,当您带着从这篇综合文章中收集到的知识和智慧扬帆进入无边的数字海洋时,请记住,利用网络爬行的力量将使您在竞争中脱颖而出,并解锁隐藏在网络深处的宝石。数字世界。