踏上网络爬虫的冒险之旅既令人兴奋又充满挑战,因为人们需要在互联网的迷宫般小巷中穿梭,寻找有价值的数据。在广阔的数字世界中,网络爬虫技术已成为一项关键技能,它使我们能够高效地挖掘信息、获得洞察力并理解不断扩展的万维网。
在这篇富有启发性的文章中,我们将穿越网络爬行的复杂领域,揭示网络爬行和网络抓取之间的差异,同时探索一系列可以提高您的网络爬行能力的策略和技术。
从 JavaScript 网站的动态领域到 Python 的强大简便性,我们将指导您完成大量技巧和技术,以确保您的网络爬行之旅顺利、有效且畅通无阻。
目录
所以,系好安全带,准备踏上令人着迷的网络爬行世界的激动人心的旅程吧!
Web 爬取与 Web 抓取
虽然网络抓取和网络爬行通常被认为是同一件事,并且两者都用于数据挖掘,但它们有关键的区别。我们将探讨这些差异,并帮助您确定哪种方法最适合您的需求和业务目标。
主要差异
简而言之,网络爬行就是搜索引擎的工作:它们在网络中导航,寻找任何可用的信息,并跟踪每个可访问的链接。此一般过程旨在从特定网站收集尽可能多(甚至全部)的信息。本质上,这就是谷歌所做的——它查看整个网页并索引所有可用数据。
另一方面,当您想要下载收集到的信息时,就会使用网络抓取。网页抓取(也称为网页数据提取)是一个更有针对性的过程。通过自定义命令和利用抓取代理,您可以从目标网站提取特定数据。随后,您可以以合适的格式下载结果,例如 JSON 或 Excel。
在某些情况下,网页爬取和网页抓取都可用于实现一个目标,本质上是流程中的第一步和第二步。通过结合两者,您可以使用爬虫从主要网站收集大量信息,然后使用抓取工具提取和下载所需的特定数据。
4 网络爬行策略
一般来说,网络爬虫根据爬虫预算仅访问一部分网页,爬虫预算可以由每个域的最大页面数、深度或持续时间等因素确定。
许多网站都提供 robots.txt 文件,指定网站哪些部分可以抓取,哪些部分不能抓取。此外,还有 sitemap.xml,它比 robots.txt 更详细,可指导机器人抓取哪些路径,并为每个 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地址的请求,并在请求之间建立延迟。
但是,即使网站允许网页抓取,您仍然可能会遇到阻止,因此还必须遵循其他步骤。如需更全面的指南,请参阅我们的 Web 抓取 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 对网络爬虫构成了重大挑战,因为它们要求访问者解答谜题以确认他们是人类。这些谜题通常包含计算机难以解读的图像。要绕过 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 驱动的网络爬取的动态领域。
我们的提示和建议宝库可确保您的网络爬行工作保持负责任和道德,避免一路上可能出现的陷阱和障碍。因此,当您带着从这篇综合文章中收集到的知识和智慧扬帆进入无边的数字海洋时,请记住,利用网络爬行的力量将使您在竞争中脱颖而出,并解锁隐藏在网络深处的宝石。数字世界。