前言
在大数据时代,信息的采集是一项重要的工作。如果只靠人工采集信息,不仅低效繁琐,而且搜集成本很高。为此,网络爬虫技术就派上了用场。在一些场景中,如搜索引擎中爬取收录站点、数据分析与挖掘中对数据采集、金融分析中对金融数据采集等,该技术都应用广泛。
本文介绍了网络爬虫的基本概念、分类及工作原理。内容涵盖通用、聚焦、增量及深层网络爬虫的区别,详细解析了 Robots 协议的作用与配置方法,并阐述了搜索引擎的核心流程。此外,文章补充了 Python 爬虫开发所需的基础技能与版本选择建议,并通过实际代码示例演示了如何使用 Requests 库进行网页请求与数据解析,帮助初学者快速掌握网络爬虫的核心技术与实战应用。

在大数据时代,信息的采集是一项重要的工作。如果只靠人工采集信息,不仅低效繁琐,而且搜集成本很高。为此,网络爬虫技术就派上了用场。在一些场景中,如搜索引擎中爬取收录站点、数据分析与挖掘中对数据采集、金融分析中对金融数据采集等,该技术都应用广泛。
本文将带领大家了解网络爬虫及其应用,并深入理解网络爬虫的结构、核心协议及基础实现。
在学习 Python 网络爬虫之前,先介绍一些必备基础技能以及本书选择 Python 3.X 版本的原因。
使用 Python 语言进行网络爬虫开发,首先 Python 网络爬虫开发包含的内容较多,需要开发人员具备以下技术能力:
以上是在学习 Python 网络爬虫开发之前所需具备的一些技术能力,其中部分内容在本文中有所涉及,但大部分内容还是需要大家事先了解并掌握。
需要注意的是,安装第三方库和框架时,大部分都是在命令行窗口中安装,在 PyCharm 中的安装较为简单,因此不做详细讲解。
目前可以选择多种语言进行网络爬虫开发,如 Python、PHP、C# 等,选择 Python 有以下原因:
编写使用最新的 Python 3.X 主要有以下几个原因:
网络爬虫又名网络蜘蛛、网络蚂蚁、网络机器人等。顾名思义,网络爬虫可理解为在网络上的爬虫,按照一定的规则爬取有用信息并收录进数据库,该规则即网络爬虫算法。
在进行数据分析或数据挖掘时,通过网络爬虫可以根据不同需求有针对性地采集、筛选数据源。网络爬虫按照系统结构和实现技术,可以分为以下几种类型:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫和深层网络爬虫等。
通用网络爬虫(General Purpose Web Crawler)又称全网爬虫,其爬取的目标资源在整个互联网中。通用网络爬虫的爬取范围和数量巨大,对爬取速度和存储空间要求较高,而对爬取页面的顺序要求相对较低。在搜索引擎和大型网络服务提供商采集数据时,通用网络爬虫有很高的应用价值。
通用网络爬虫的结构大致可以分为 URL 队列、初始 URL 集合、页面爬取模块、页面分析模块、页面数据库几个部分。通用网络爬虫在爬取时会采取一定的爬取策略,常用的爬取策略有深度优先策略和广度优先策略。
聚焦网络爬虫(Focused Crawler)又称主题网络爬虫,顾名思义,聚焦网络爬虫是指按照预先定义好的主题,有选择性地进行网页爬取的一种爬虫。与通用网络爬虫相比,聚焦网络爬虫只需爬取与主题相关的页面,大大节省了爬虫爬取时所需的硬件和网络资源,但聚焦网络爬虫不适合大范围爬取。
聚焦网络爬虫相比通用网络爬虫,增加了链接评价模块以及内容评价模块。内容评价模块可以评价内容的重要性,同理,链接评价模块也可以评价出链接的重要性。聚焦爬虫爬取策略实现的关键就是评价页面的内容和链接的重要性,不同的方法计算出的重要性不同,由此导致链接的访问顺序也不同。
增量式网络爬虫(Incremental Web Crawler)是指对已下载网页采取增量式更新,只爬取新产生的或已经发生变化的网页,对于未发生内容变化的网页,则不会爬取。增量式网络爬虫在一定程度上能够保证所爬取的页面是尽可能新的页面。增量式网络爬虫的体系结构包含本地页面集、待爬取 URL 集、本地页面 URL 集、爬取模块、排序模块及更新模块。
在互联网中,Web 页面按存在方式可以分为表层网页和深层网页。表层网页是指不需要提交表单,使用超链接即可到达以静态网页为主构成的 Web 页面;深层页面则隐藏在表单后面,不能通过静态链接直接获取,是需要提交一定的关键词才能获得的 Web 页面。在互联网中,深层页面的数量往往比表层页面要多很多。在爬取深层页面时,最重要的部分是需要自动填写好对应的表单。
深层网络爬虫(Deep Web Crawler)体系结构由爬行控制器、解析器、表单分析器、表单处理器、响应分析器、LVS(Label Value Set)控制器等基本功能模块及 URL、LVS 列表两个爬虫内部数据结构组成。其中 LVS 表示标签/数值集合,用来表示填充表单的数据源。
深层网络爬虫的表单填写有两种类型:
网络爬虫的应用非常广泛,它可以进行许多自动化操作。例如,它不仅能爬取网站上的图片、文字、视频等数据,而且能分析网站的用户活跃度、发言数、点赞数、热评等信息。爬虫还可应用于其他领域如众多金融投资领域,可自动爬取信息并进行精准投资分析等。
下面展示一些网络爬虫实际运用的场景。
常见的 BT(BitTorrent)网站,通过爬取互联网的 DHT(Distributed Hash Table,一种分布式存储方法)网络中分享的 BT 种子信息,提供对外搜索服务。 又如一些云盘搜索网站,通过爬取用户共享出来的云盘文件数据,对文件数据进行分类划分,从而提供对外搜索服务。
Robots 协议(也被称为爬虫协议、机器人协议等)的全称是'机器人排除协议'(Robots Exclusion Protocol)。网站通过 Robots 协议将搜索引擎抓取网站内容的范围作了约定,包括网站是否希望被搜索引擎抓取,内容是否允许被抓取,被抓取到的公开数据是否允许被转载。
除此之外,Robots 协议还可以屏蔽一些网站中较大的文件,如图片、音频、视频等,节省服务器带宽;屏蔽站点的一些死链接,方便搜索引擎抓取网站内容;设置网站地图连接,方便引导爬虫爬取页面。
robots.txt(统一小写)是一种存放于网站根目录下的以 ASCII 编码的文本文件,它是 Robots 协议的具体体现。因为一些系统中的 URL 对大小写敏感,所以 robots.txt 的文件名应统一为小写。如果需要单独定义网络爬虫访问网站子目录时的行为,可将自定义的设置合并到根目录下的 robots.txt。
Robots 的约束力仅限于自律,没有强制性,搜索引擎一般都会遵循这个协议。除 Robots 协议以外,网站管理员仍有其他方式拒绝网络爬虫对网页的获取。
当网站内容有更新时,在 robots.txt 文件中提供的 Sitemap 内容可以帮助爬虫定位网站最新的内容,而无需爬取每一个网页。比如政府网站的 Robots 协议配置如下:
User-agent: *
Allow: /
Disallow: /admin/
Sitemap: http://www.gov.cn/sitemap.xml
图中几个重要信息表示如下:
User-agent:允许的爬虫,'*'说明允许所有爬虫爬取数据。Allow:允许访问的目录。Disallow:禁止访问的目录。每个搜索引擎都有自己的爬虫(如 Baiduspider、360Spider、Bingbot 等),通过网络爬虫可以更深层次地理解搜索引擎内部的工作原理,从而进一步优化搜索引擎。
当用户通过门户网站检索信息时,会通过用户交互接口(相当于搜索引擎的输入框)输入关键字,输入完成后通过检索器进行分词等操作,索引器会从索引数据库(对原始数据库进行索引后将数据存储于该数据库)中获取数据进行相应的检索处理。
用户输入完对应信息后,用户的行为(比如用户的 IP 地址、Agent 类别和用户输入的关键词等)会被存储到用户日志数据库中,随后日志分析器会根据大量的用户数据去调整原始数据库和索引数据库,改变排名结果或进行其他操作。
需要注意的是,检索是一个动作,而索引是一个属性。例如商店里有大量的商品,为了能够快速地找到这些商品,需要将这些商品分为饮料类商品、电器类商品、日用品类商品、服装类商品等组别,这些商品的组名被称为索引。索引被索引器控制,索引可以大大提升查询效率。
搜索引擎的工作流程如下:
理论结合实践才能真正掌握技术。下面我们将使用 Python 的 requests 库和 BeautifulSoup 库来实现一个简单的网页爬取示例。
确保已安装必要的库:
pip install requests beautifulsoup4
以下代码演示了如何发送 HTTP 请求、处理响应状态码以及提取网页标题和内容。
import requests
from bs4 import BeautifulSoup
def fetch_webpage(url):
# 设置请求头,模拟浏览器行为
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
try:
response = requests.get(url, headers=headers, timeout=10)
# 检查响应状态码
if response.status_code == 200:
# 设置编码,防止乱码
response.encoding = response.apparent_encoding
soup = BeautifulSoup(response.text, 'html.parser')
# 提取网页标题
title = soup.title.string if soup.title else 'No Title'
print(f"Title: {title}")
# 提取正文段落
paragraphs = soup.find_all('p')
for p in paragraphs[:5]: # 仅打印前 5 段
print(p.get_text(strip=True))
else:
print(f"Failed to retrieve data. Status code: {response.status_code}")
except Exception as e:
print(f"Error occurred: {e}")
if __name__ == "__main__":
target_url = "https://example.com"
fetch_webpage(target_url)
robots.txt 文件,确认目标页面是否允许爬取。网络爬虫技术是大数据时代的重要工具。通过本文的学习,我们了解了爬虫的基本概念、分类、工作原理以及基础的 Python 实现方法。在实际应用中,还需要结合反爬策略、分布式架构等更高级的技术。希望读者能通过不断的实践,掌握这一技能,为数据处理和分析提供支持。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online