资讯动态

python爬虫入门

发布时间:2026/10/14 2:05:58 来源:尧图企业网站定制
介绍传统爬虫的工作流程通常始于编写代码来定义采集规则随后程序会向目标网页发送请求以获取原始数据接着对返回的页面内容进行解析并提取所需信息若存在多页数据则需自动处理分页逻辑以遍历所有目标页面最终将清洗整理后的结构化数据存储到数据库中从而完成从网页到数据的全自动化采集过程。发送 HTTP 请求获取网页资源。解析 HTML 内容提取有用信息。将数据存储到本地或数据库。处理提取到的链接加入待抓取队列。关于解析程序会先用解析器把 HTML 构建成一棵文档树比如div,a这些标签会形成层级关系然后再通过CSS 选择器、XPath 或正则表达式从这棵树里定位目标节点取出其中的文本、链接、图片地址、属性值等有用信息。常见方式大致有三类方式适合做什么注意点CSS 选择器按class、id、标签、属性快速定位元素写法短、直观适合结构稳定的页面XPath按层级、父节点、文本内容精确定位表达能力更强但语法稍复杂正则表达式从纯文本里抠手机号、编号、JSON 片段等不适合直接解析完整 HTML容易因页面变化失效DOM 树写爬虫时很多人会被 DOM 树吓到觉得它属于前端知识。其实对爬虫来说你不需要掌握 DOM API、事件冒泡、浏览器渲染机制也不需要理解 JavaScript 如何操作页面。你只需要学会一件事把 HTML 看成一棵有层级关系的树然后顺着树找到目标数据。HTML 被解析后会形成一棵文档树。每个标签都是一个节点标签之间通过嵌套形成父子、兄弟、祖先、后代关系。属性挂在标签上文本则藏在标签内部。理解了这些你写 CSS 选择器或 XPath 时就不会只是“照着抄”而是能真正判断该往哪里定位。div classnews-list article classnews-item h2 a href/news/123标题/a /h2 span classtime2026-10-13/span /article /div你需要知道div是外层容器article是div的子节点h2和span是同级a是h2的子节点文本标题属于ahref/news/123是a的属性CSS SelectorCSS Selector 原本是前端用来给页面元素设置样式的但在爬虫里它几乎是最直观的 HTML 定位方式。你不需要写复杂的语法只要像读句子一样把元素的层级、类名、标签、属性串起来就能精准找到目标数据。先看几个常见的写法选择器含义.news-item找 class 包含news-item的元素.news-item h2 a在.news-item下面找h2里面的aarticle.news-item找标签是article、且 class 包含news-item的元素a[href]找带有href属性的a标签span.time找标签是span、且 class 包含time的元素重点理解.news-item h2 a这个选择器可以拆成三段.news-item h2 a ↓ ↓ ↓ 外层容器 中间层 目标元素它表示先找到 class 为news-item的元素再在这个元素内部找到h2标签最后找到h2里面的a标签。结合前面的 HTMLdiv classnews-list article classnews-item h2 a href/news/123标题/a /h2 span classtime2026-10-13/span /article /div.news-item h2 a会命中a href/news/123标题/a这里的空格表示“后代关系”也就是说a不一定要直接紧挨着h2只要它在h2内部就可以了。和 XPath 相比CSS Selector 更短、更直观适合结构清晰的页面XPath 表达能力更强比如可以按文本内容定位、向上找父节点但语法会更复杂一些。日常写爬虫先掌握 CSS Selector 已经能解决大部分问题。XPath如果说 CSS Selector 是直观的“视觉定位”那 XPath 就是一把功能更强的“手术刀”。它原本是为 XML 文档设计的查询语言但在 HTML 解析中同样强大。XPath 的最大优势在于表达能力极强——它不仅能向下查找还能向上回溯、按文本内容筛选、甚至进行逻辑运算。当 CSS Selector 搞不定的复杂场景比如“查找包含特定文字的按钮”或“定位父级元素”时XPath 往往是最佳解法。核心语法速查表你不需要背诵复杂的规范掌握下面这几招就能覆盖 90% 的爬虫需求语法含义示例//tag在整个文档中查找所有该标签//a查找所有链接/选取直接子节点//div/a查找 div 下的直接链接//选取后代节点子孙均可//div//a查找 div 内所有层级的链接[attrval]属性筛选//div[idmain]text()获取标签内的文本内容//h2/text()contains()模糊匹配属性或文本//div[contains(class, news)]结合实例理解回到我们熟悉的 HTML 结构div classnews-list article classnews-item h2 a href/news/123标题/a /h2 span classtime2026-10-13/span /article /div1. 基础定位//article[classnews-item]//a这句话的意思是先在全文找到 class 为news-item的article标签然后在它内部任意层级找到a标签。2. 提取文本//article[classnews-item]/h2/a/text()这会直接提取出文本内容标题。注意这里用了单斜杠/表示严格的父子层级关系。3. 模糊匹配实战神器//span[contains(class, time)]很多网站为了反爬class 名会写成time-wrapper或time-box。用contains就能轻松命中包含time字符的 class。什么时候必须用 XPath虽然 CSS Selector 写起来更顺手但在以下场景 XPath 是无可替代的按文本查找比如//button[text()下一页]CSS 做不到。向上查找父节点比如//a[href...]/../..找到链接的祖父节点。复杂的逻辑组合比如//div[idlist and data-typenews]。正则表达式正则表达式Regular Expression在爬虫里的定位非常明确它不适合直接解析 HTML 结构但极其擅长处理已经提取出来的文本片段。为什么不用正则解析 HTMLHTML 是树状嵌套结构而正则是基于线性文本匹配的。用正则硬扒整个 HTML 会遇到很多坑标签嵌套层级复杂正则难以准确匹配开闭标签属性顺序不固定classa idb和idb classa会让同一套正则失效页面稍有改动正则就可能全盘崩溃。所以业界共识是结构问题交给 DOMCSS/XPath文本问题交给正则。正确的使用姿势典型的爬虫解析流程是这样的HTML 源码 ↓ CSS/XPath 定位节点 拿到目标文本如 发布时间2026年10月13日 15:30 ↓ 正则进一步清洗 提取纯数据如 2026-10-13 15:30常用正则模式速查表格需求正则写法匹配示例4位数字\d{4}20261~2位数字\d{1,2}1~12中文日期\d{4}年\d{1,2}月\d{1,2}日2026年10月13日手机号1\d{10}13812345678邮箱\w\w\.\wtestexample.com非贪婪匹配.*?匹配最短内容实战示例假设你已经用 CSS Selector 拿到了这段文本发布时间2026年10月13日 15:30用正则提取日期和时间import re ​ text 发布时间2026年10月13日 15:30 match re.search(r(\d{4}年\d{1,2}月\d{1,2}日)\s*(\d{1,2}:\d{2}), text) if match: date match.group(1) # 2026年10月13日 time match.group(2) # 15:30一句话总结CSS/XPath 负责找到在哪里正则负责抠出是什么。两者配合才是爬虫解析的最佳实践。解析的产物先拿到“节点”再提炼出“数据”很多初学者会以为爬虫解析的目标就是“把文字抠出来”其实不是。解析器lxml、parsel、BeautifulSoup真正返回给你的是两个层次的东西一个是节点对象另一个是你最终想要的业务数据。理解这两个层次才算真正打通了“解析 → 入库”的链路。第一类节点对象中间产物当你用 CSS Selector 或 XPath 定位时命中的往往不是一个字符串而是一个节点对象。比如你定位到a href/news/123周杰伦发布新歌/a解析器返回的是一个代表这个 标签的对象。这个对象的价值在于它是“活的”——你还能继续从它身上取各种信息你想拿的东西从节点上怎么取文本内容周杰伦发布新歌属性值href/news/123子节点该标签内部的嵌套标签父节点它的上一层容器整段 HTML连标签一起的原始结构换句话说节点对象是一个“可继续深挖的入口”。定位这一步只是把范围缩小到某个节点真正的字段提取是在这个节点上二次操作完成的。这也是为什么 XPath 里有text()、href这些函数——它们就是挂在节点对象上的取值手段。第二类业务数据最终产物节点只是手段你真正要的是把它拆成一个个有语义的字段。一条新闻里常见的业务数据包括文本 title 周杰伦发布新歌 链接 url /news/123 图片 image https:1.jpg 时间 publishTime 2026-10-13 作者 author 某记者 正文 content …… 属性 >{ title: 周杰伦发布新歌, url: https://xxx.com/news/123, publishTime: 2026-10-13T15:30:0008:00, author: 某记者, content: …… }到这一步解析就彻底完成了HTML 树 → 定位到节点 → 从节点取字段 → 清洗 → 装进结构化对象。这个对象就是要送去“入库”的东西——存进 MySQL、MongoDB 还是导出成 CSV都以它为标准形态。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑