Python项目实战——网络机器人(爬虫) 一、网络爬虫概述1.1 什么是网络爬虫网络爬虫Web Crawler也称网络机器人是一种按照预设规则自动浏览互联网并抓取网页数据的程序或脚本。它模拟人类浏览网页的行为但效率极高可以在短时间内遍历成千上万个页面。爬虫的核心工作流程可以概括为四个步骤开始设定起始URL和抓取规则发送HTTP请求向目标服务器请求页面内容解析结果提取数据从HTML文档中抽取出所需信息数据处理与存储清洗、整理并保存数据1.2 爬虫的应用场景爬虫技术广泛应用于多个领域搜索引擎如百度、Google——抓取网页建立索引支撑亿万级检索舆情监控——实时监测社交媒体、新闻网站的舆论动态商业分析如电商比价系统——采集商品价格、评论辅助决策AI大模型训练——收集海量文本语料用于模型预训练可以说在大数据时代爬虫是获取外部数据不可或缺的工具。1.3 爬虫的合规性——robots协议在编写爬虫之前必须了解robots协议也称爬虫协议、君子协议。该协议是网站根目录下存放的robots.txt文本文件用于告知爬虫哪些页面允许抓取哪些禁止抓取。下面以知名编程语言排行榜网站 TIOBE 的robots.txt为例User-agent: * Disallow: /wp-admin/ Allow: /wp-admin/admin-ajax.php Sitemap: https://www.tiobe.com/sitemap_index.xml Crawl-delay: 5 User-agent: Wandoujia Spider Disallow: / User-agent: Mediapartners-Google Disallow: /subject_search Disallow: /amazon_search关键字段含义User-agent标识爬虫身份*表示所有爬虫Disallow禁止访问的资源路径Allow允许访问的资源路径Sitemap网站地图地址帮助爬虫发现页面Crawl-delay请求间隔时间秒避免对服务器造成压力请务必遵守 robots.txt 的约定这是爬虫开发者基本的职业道德。虽然它是“君子协议”而非法律强制但遵守它既是尊重网站所有者也是保护自己免受法律风险。二、入门程序发送HTTP请求2.1 安装 requests 库Python 中最流行的 HTTP 客户端库是requests它让发送网络请求变得极其简单。安装命令pip install requests2.2 发送请求获取网页我们以获取 TIOBE 编程语言排行榜页面为例import requests url https://www.tiobe.com/tiobe-index/ headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } response requests.get(url, headersheaders) print(response.status_code) # 200 表示成功 print(response.text[:500]) # 打印前500字符的HTML关键点requests.get()发送 GET 请求headers参数设置 User-Agent模拟浏览器访问避免被识别为爬虫response.text返回服务器响应的 HTML 源代码仅需几行代码我们就成功获取了网页的完整内容为后续解析提供了原始素材。三、网页结构基础3.1 网页的三部分HTML、CSS、JS一个网页由三个核心技术共同构成组成部分全称作用HTML超文本标记语言负责网页的结构页面元素和内容CSS层叠样式表负责网页的表现样式、颜色、位置、大小JSJavaScript负责网页的行为交互效果、动态更新这三者各司其职HTML 搭建骨架CSS 美化外观JS 赋予生命力。3.2 HTML 基本语法HTMLHyperText Markup Language是一种超文本标记语言。“超文本”意味着它不仅包含文字还可以定义图片、音频、视频等内容。“标记语言”则是指由一堆预定义的标签构成如h1、p、a等。一个简单的 HTML 示例html langzh-CN head meta charsetUTF-8 title仙逆人物志 - 修真世界/title /head body h1Python/h1 p一门简洁、快速、易用的编程语言。/p a hrefhttps://www.itcast.cn传智教育-黑马程序员/a /body /html标签规则标签通常成对出现标签名内容/标签名开始标签 结束标签标签可以拥有属性如a href...中的href指定链接地址HTML 代码直接在浏览器中运行由浏览器解析并渲染爬虫的核心任务就是从这些标签的海洋中精准定位并提取我们需要的数据。四、网页解析XPath 与 lxml4.1 什么是网页解析网页解析是指从原始 HTML 文档中提取数据的过程也是网络爬虫的关键步骤。我们需要从一堆标签和文本中抽取出目标信息如标题、价格、评分等。4.2 安装 lxml 库lxml是 Python 中高性能的 HTML/XML 解析库支持基于 XPath 语法来解析和提取网页数据。安装命令pip install lxml4.3 XPath 语法详解XPathXML Path Language是一种在 HTML/XML 文档中导航定位元素的查询语言能让你准确地定位文档中的特定元素、属性或文本。常见 XPath 表达式及含义XPath 表达式含义/html/head/title[1]选择html下head中的第一个title元素//div/a/text()选择文档中所有div下的a标签的文本内容//div/a/href选择所有div下的a标签的href属性值//div/a[target_blank]选择所有target属性值为_blank的a标签//div[2]/p[last()]/text()选择第二个div下最后一个p标签的文本要点/表示从根节点开始绝对路径//表示在文档任意位置搜索相对路径[ ]用于添加条件索引、属性筛选等text()提取标签内的文本属性名提取标签的属性值4.4 使用 lxml 提取数据from lxml import html # 加载HTML文件 with open(resources/仙逆人物志.html, r, encodingutf-8) as f: html_content f.read() # 解析为文档对象 doc html.fromstring(html_content) # 使用XPath提取数据 th_list doc.xpath(//table/thead/tr[1]/th/text()) td_list doc.xpath(//table/tbody/tr[1]/td/text()) print(表头:, th_list) print(第一行数据:, td_list)html.fromstring()将 HTML 字符串解析为可执行 XPath 查询的文档对象然后通过xpath()方法直接提取目标数据返回列表。五、案例实战获取高分电影榜单5.1 案例目标与步骤本案例的目标是从 The Movie Database (TMDB) 获取高分电影 Top100 数据并保存为 CSV 文件。需要提取的字段包括电影名、年份、上映时间、类型、时长、评分、语言导演、作者、主演、Slogan、简介实现步骤如下查看目标网站的robots.txt确认抓取规则分析页面结构确定数据在 HTML 中的位置获取电影列表页提取每部电影的详情页链接遍历每一部电影的详情页提取全部所需字段对提取到的原始数据进行清洗如处理年份、时长格式将清洗后的数据写入 CSV 文件5.2 数据清洗——正则表达式在实际抓取中原始数据往往不够“干净”。例如年份字段可能是1994、1994-09-23或1994 (USA)时长可能是144 分钟、2h 24min或144评分可能包含多余字符我们需要从中提取出纯净的数字或标准格式。这时就要用到正则表达式Regular Expression。正则表达式是一种用特定语法规则组成的字符串模式用来描述、匹配或替换文本中符合某种规则的字符序列。可以理解为专门用于文本处理的“高级查找和匹配公式”。Python re 模块三大函数函数作用match(pattern, string)从字符串开头开始匹配search(pattern, string)从任意位置搜索第一个匹配项findall(pattern, string)从任意位置搜索所有匹配项返回列表注意字符串前的r表示原始字符串使转义字符无效如r\d就是反斜杠和 d 两个字符而非转义。5.3 正则表达式语法速查语法含义.匹配任意单个字符除换行符\d匹配数字\D匹配非数字\w匹配字母、数字、下划线\W匹配非单词字符\s匹配空白字符\S匹配非空白*匹配前一个字符0次或多次匹配前一个字符1次或多次?匹配前一个字符0次或1次{m}匹配前一个字符恰好 m 次{m,}匹配前一个字符至少 m 次{m,n}匹配前一个字符m 到 n 次|或如(a|b)匹配 a 或 b()分组捕获子表达式^匹配字符串开头$匹配字符串结尾实用示例匹配手机号1[3-9]\d{9}1开头第二位3-9后面9位数字匹配年份\d{4}四位数字提取数字\d一个或多个数字5.4 完整代码实现下面给出案例的核心代码框架实际项目中需根据页面结构调整 XPath。import requests from lxml import html import csv import re # 目标网站请先查看其 robots.txt BASE_URL https://www.themoviedb.org LIST_URL BASE_URL /top-rated headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36} # 1. 获取列表页 resp requests.get(LIST_URL, headersheaders) doc html.fromstring(resp.text) # 2. 提取每部电影的详情页链接假设链接在 classtitle 的 a 标签的 href 属性中 movie_links doc.xpath(//a[classtitle]/href) all_movies [] # 3. 遍历前100部电影 for link in movie_links[:100]: detail_url BASE_URL link detail_resp requests.get(detail_url, headersheaders) detail_doc html.fromstring(detail_resp.text) # 4. 提取各字段以下 XPath 仅为示例需根据实际页面调整 title detail_doc.xpath(//h2[classtitle]/text())[0] if detail_doc.xpath(//h2[classtitle]/text()) else # 年份处理提取四位数字 raw_year detail_doc.xpath(//span[classyear]/text())[0] if detail_doc.xpath(//span[classyear]/text()) else year re.search(r\d{4}, raw_year).group() if re.search(r\d{4}, raw_year) else # 时长处理提取数字 raw_runtime detail_doc.xpath(//span[classruntime]/text())[0] if detail_doc.xpath(//span[classruntime]/text()) else runtime re.search(r\d, raw_runtime).group() if re.search(r\d, raw_runtime) else # 评分 rating detail_doc.xpath(//span[classrating]/text())[0] if detail_doc.xpath(//span[classrating]/text()) else # 其他字段导演、主演等类似处理... # 5. 收集数据 all_movies.append([title, year, runtime, rating]) # 仅示例实际要包含全部字段 # 6. 写入CSV文件 with open(top100_movies.csv, w, encodingutf-8, newline) as f: writer csv.writer(f) writer.writerow([电影名, 年份, 时长(分钟), 评分]) # 表头 writer.writerows(all_movies) print(f成功抓取 {len(all_movies)} 部电影数据已保存到 top100_movies.csv)CSV 说明CSVComma-Separated Values逗号分隔值是一种简单通用的文本文件格式用于存储表格数据可直接用 Excel 打开。六、总结通过本文我们系统学习了爬虫的基本概念与应用场景robots.txt 君子协议及其关键字段requests 库发送 HTTP 请求HTML/CSS/JS网页结构与标签语法XPath 与 lxml解析网页并提取数据正则表达式进行文本清洗与格式化一个完整的电影榜单爬取案例从列表到详情再到 CSV 存储爬虫是数据获取的重要手段但也是一把双刃剑。在实际开发中请牢记遵守 robots.txt尊重网站规则控制请求频率设置合理的间隔如 Crawl-delay避免给服务器造成负担合理使用数据不侵犯他人权益动态反爬是常见挑战后续可学习 Selenium、代理IP、异步请求等进阶技术技术无好坏但使用技术的人要有底线。愿你在爬虫的世界里既收获数据也守住道德。Happy CodingHappy CodingHappy Coding