使用 Python lxml 进行网络抓取

使用 Python lxml 轻松进行网络抓取

在本文中,我将向您介绍使用 Python 的 lxml 进行网络刮擦的基础知识。我的目标是让事情简单明了,这样你就可以开始自己进行网站刮擦,而不会有太多麻烦。使用 lxml 可以简化整个过程,让你快速收集到所需的数据。

什么是网络抓取?

网络抓取 它通过解析 HTML 或 XML 内容从网站中提取数据。这些数据随后可用于各种目的,如市场调研、价格监控或内容聚合。虽然可以通过手动方式进行网络抓取,但使用 Python 实现流程自动化可大大提高效率和准确性。

为什么选择 lxml 进行网络抓取?

Python 提供 多个用于网络抓取的库包括 BeautifulSoup、Scrapy 和 Selenium。不过,"lxml "因其速度和处理大量数据的能力而经常受到青睐。它是一个强大而灵活的库,提供了解析 HTML 和 XML 文档的工具,非常适合需要处理复杂文档结构的网络刮擦任务。

设置 lxml

要开始使用 lxml,您需要安装该库。您可以通过 pip 安装:

pip install lxml

此外,您还会经常使用请求来获取网页,因此也要确保安装了请求:

pip install requests

安装好必要的库后,就可以开始刮削了。

使用 lxml 解析 HTML

网络搜刮的第一步是检索目标网页的 HTML 内容。这可以使用请求库来完成:

import requests
from lxml import html
url = "http://example.com"
response = requests.get(url)

response.content 将包含网页的 HTML 内容,然后可以使用 lxml 对其进行解析:

tree = html.fromstring(response.content)

"(《世界人权宣言》) 函数 将 HTML 内容解析为元素树,您可以浏览元素树来提取所需的信息。

使用 XPath 提取数据

lxml 最强大的功能之一是支持 XPath,这是一种从 XML 或 HTML 文档中选择节点的查询语言。XPath 表达式允许你浏览元素树,并根据标签、属性或文本内容提取特定元素。

例如,要提取网页中的所有链接,可以使用以下代码:

links = tree.xpath('//a/@href')
for link in links:
print(link)

在本例中,XPath 表达式 //a/@href 选择了所有 <a> (锚点)元素。

同样,要提取特定元素的文本内容,可以使用 XPath 表达式,如

title = tree.xpath('//title/text()')[0]
print(title)

该表达式选择 元素的文本内容,该元素通常包含网页标题。</p> <h2 id="7097" class="mt mu gg bf mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq bk">处理复杂网页</h2> <p id="074a" class="pw-post-body-paragraph lv lw gg lx b ly nr ma mb mc ns me mf mg nt mi mj mk nu mm mn mo nv mq mr ms fk bk" data-selectable-paragraph="">网页通常具有嵌套元素的复杂结构,因此提取所需信息的难度很大。不过,lxml 可以让你连锁多个 XPath 表达式,从而简化了这一任务。</p> <p id="264e" class="pw-post-body-paragraph lv lw gg lx b ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms fk bk" data-selectable-paragraph="">考虑一个包含产品列表的网页,每个产品都包含名称、价格和链接。您可以用以下代码提取这些数据:</p> <pre class="nx ny nz oa ob oc od oe bp of bb bk"><span id="6452" class="og mu gg od b bg oh oi l oj ok" data-selectable-paragraph="">products = tree.xpath(<span class="hljs-string">'//div[@class="产品"]'</span>) <span class="hljs-keyword">for</span> product <span class="hljs-keyword">in</span> 产品 name = product.xpath(<span class="hljs-string">'.//h2[@class="name"]/text()'。</span>)[<span class="hljs-number">0</span>] price = product.xpath(<span class="hljs-string">'.//span[@class="价格"]/text()</span>)[<span class="hljs-number">0</span>] link = product.xpath(<span class="hljs-string">'.//a/@href'。</span>)[<span class="hljs-number">0</span>] <span class="hljs-built_in">print</span>(<span class="hljs-string">f "产品名称: <span class="hljs-subst">{name}</span>, Price: <span class="hljs-subst">{价格}</span>, 链接: <span class="hljs-subst">{链接}</span>"</span>)</span></pre> <p id="c703" class="pw-post-body-paragraph lv lw gg lx b ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms fk bk" data-selectable-paragraph="">在本例中,//div[@class="product"] XPath 表达式选择了所有产品容器,随后的表达式提取了每个产品的名称、价格和链接。</p> <h2 id="d51a" class="mt mu gg bf mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq bk">处理 JavaScript 生成的内容</h2> <p id="0da0" class="pw-post-body-paragraph lv lw gg lx b ly nr ma mb mc ns me mf mg nt mi mj mk nu mm mn mo nv mq mr ms fk bk" data-selectable-paragraph="">lxml 的一个限制是不能直接处理 JavaScript 生成的内容,因为它只能解析静态 HTML 内容。如果您需要的数据是通过 JavaScript 动态加载的,您有几种选择:</p> <ol class=""> <li id="b3ea" class="lv lw gg lx b ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms ol om on bk" data-selectable-paragraph=""><strong class="lx gh">使用硒: </strong>Selenium 是一种网络自动化工具,可以像人类用户一样渲染 JavaScript 并与页面交互。虽然速度比 lxml 慢,但它能让你抓取其他方式无法访问的内容。</li> <li id="59c1" class="lv lw gg lx b ly oo ma mb mc op me mf mg oq mi mj mk or mm mn mo os mq mr ms ol om on bk" data-selectable-paragraph=""><strong class="lx gh">分析网络请求: </strong>有时,页面上的 JavaScript 会向 API 发出 HTTP 请求以获取数据。通过检查浏览器开发工具中的网络流量,可以识别这些请求并使用请求进行复制。</li> <li id="46b6" class="lv lw gg lx b ly oo ma mb mc op me mf mg oq mi mj mk or mm mn mo os mq mr ms ol om on bk" data-selectable-paragraph=""><strong class="lx gh">使用 Splash 或 Puppeteer:</strong> 这些都是无头浏览器,可以呈现 JavaScript 内容,并以编程方式与网页交互。这两种工具都可以与 Python 集成,用于刮取动态内容。如果您不确定是选择 Selenium 还是 Puppeteer,请点击以下链接、 <a class="af nw" href="https://www.data-journal.org/puppeteer-vs-selenium" rel="noopener">阅读我们的对比文章</a>.</li> </ol> <p id="1cf6" class="pw-post-body-paragraph lv lw gg lx b ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms fk bk" data-selectable-paragraph="">了解更多有关刮削动态内容的信息 <a class="af nw" href="https://brightdata.com/blog/how-tos/scrape-dynamic-websites-python" target="_blank" rel="noopener ugc nofollow">这里</a>.</p> <h2 id="98cb" class="mt mu gg bf mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq bk">处理表格提交和会话</h2> <p id="db86" class="pw-post-body-paragraph lv lw gg lx b ly nr ma mb mc ns me mf mg nt mi mj mk nu mm mn mo nv mq mr ms fk bk" data-selectable-paragraph="">有些网站要求您与表单交互或保持会话以访问某些内容。</p> <p id="753e" class="pw-post-body-paragraph lv lw gg lx b ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms fk bk" data-selectable-paragraph="">要提交表单,需要检查表单字段,并以编程方式提交数据:</p> <pre class="nx ny nz oa ob oc od oe bp of bb bk"><span id="9c87" class="og mu gg od b bg oh oi l oj ok" data-selectable-paragraph="">form_data = { <span class="hljs-string">'username'</span>: <span class="hljs-string">您的用户名</span>, <span class="hljs-string">'password'</span>: <span class="hljs-string">您的密码</span> } response = requests.post(<span class="hljs-string">'http://example.com/login'</span>, data=form_data)</span></pre> <p id="f8d5" class="pw-post-body-paragraph lv lw gg lx b ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms fk bk" data-selectable-paragraph="">提交表单后,您可以像往常一样继续刮擦,由请求会话处理 cookie 并保持会话状态。</p> <h2 id="0af6" class="mt mu gg bf mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq bk">网络抓取最佳实践</h2> <p id="150a" class="pw-post-body-paragraph lv lw gg lx b ly nr ma mb mc ns me mf mg nt mi mj mk nu mm mn mo nv mq mr ms fk bk" data-selectable-paragraph="">网络搜索虽然功能强大,但也有道德和法律方面的考虑。以下是一些应遵循的最佳实践:</p> <ol class=""> <li id="b995" class="lv lw gg lx b ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms ol om on bk" data-selectable-paragraph=""><strong class="lx gh">尊重 Robots.txt: </strong>经常检查网站的 robots.txt 文件,查看哪些页面允许被抓取。</li> <li id="573d" class="lv lw gg lx b ly oo ma mb mc op me mf mg oq mi mj mk or mm mn mo os mq mr ms ol om on bk" data-selectable-paragraph=""><strong class="lx gh">速率限制: </strong>避免在短时间内发送过多请求,因为这会使服务器超负荷,导致你的 IP 被屏蔽。在请求之间实施速率限制和随机延迟。</li> <li id="9950" class="lv lw gg lx b ly oo ma mb mc op me mf mg oq mi mj mk or mm mn mo os mq mr ms ol om on bk" data-selectable-paragraph=""><strong class="lx gh">用户代理:</strong> 使用 <a class="af nw" href="https://www.data-journal.org/how-to-change-user-agent-with-curl" rel="noopener">自定义用户代理</a> 头以模拟真实浏览器。有些网站会阻止使用默认标头的请求。</li> <li id="afc4" class="lv lw gg lx b ly oo ma mb mc op me mf mg oq mi mj mk or mm mn mo os mq mr ms ol om on bk" data-selectable-paragraph=""><strong class="lx gh">检查合法性: </strong>确保您的搜索活动符合网站的服务条款和当地法律。</li> </ol> <h2 id="9a16" class="mt mu gg bf mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq bk">结论</h2> <p id="e359" class="pw-post-body-paragraph lv lw gg lx b ly nr ma mb mc ns me mf mg nt mi mj mk nu mm mn mo nv mq mr ms fk bk" data-selectable-paragraph="">使用 Python 的 lxml 库进行网络刮擦是一种从网站中提取数据的高效方法。该库以其速度和对 XPath 的强大支持而著称,使浏览 HTML 和 XML 文档变得更加容易。如果您按照提供的步骤操作,就能快速高效地开始网络抓取,从而轻松地收集和分析网络数据。</p> <p id="c4b0" class="pw-post-body-paragraph lv lw gg lx b ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms fk bk" data-selectable-paragraph="">重要的是,要始终以负责任和道德的方式对网站进行刮擦,遵守其服务条款。如果操作得当,lxml 可以成为数据收集和分析工作中的强大工具。我个人认为它是我工具包中不可或缺的一部分,相信你也会如此。</p> </div><!-- .entry-content --> <footer class="entry-footer"> </footer><!-- .entry-footer --> </div> </article><!-- #post-3494 --> <div class="entry-author entry-author-style-normal"> <div class="entry-author-profile author-profile vcard"> <div class="entry-author-avatar"> <img width="80" height="80" src="https://www.data-journal.org/wp-content/uploads/2025/01/Data-Journal-96x96.jpg" class="avatar avatar-80 photo" alt="" decoding="async" loading="lazy" srcset="https://www.data-journal.org/wp-content/uploads/2025/01/Data-Journal-96x96.jpg 96w, https://www.data-journal.org/wp-content/uploads/2025/01/Data-Journal-300x300.jpg 300w, https://www.data-journal.org/wp-content/uploads/2025/01/Data-Journal-1024x1024.jpg 1024w, https://www.data-journal.org/wp-content/uploads/2025/01/Data-Journal-150x150.jpg 150w, https://www.data-journal.org/wp-content/uploads/2025/01/Data-Journal-768x768.jpg 768w, https://www.data-journal.org/wp-content/uploads/2025/01/Data-Journal-1536x1536.jpg 1536w, https://www.data-journal.org/wp-content/uploads/2025/01/Data-Journal-24x24.jpg 24w, https://www.data-journal.org/wp-content/uploads/2025/01/Data-Journal-48x48.jpg 48w, https://www.data-journal.org/wp-content/uploads/2025/01/Data-Journal.jpg 2048w" sizes="auto, (max-width: 80px) 100vw, 80px" /> </div> <b class="entry-author-name author-name fn"><a href="https://www.data-journal.org/cn/author/datajournal/" title="由 Data Journal 发布" rel="author" data-no-translation-title="">数据期刊</a></b> <div class="entry-author-description author-bio"> <p># 网络数据与分析专家</p> <p>通过先进的抓取技术、道德数据收集和代理基础架构探索网络数据的秘密。凭借在数据工程和网络自动化方面多年的实践经验,我将深入探讨:</p> <p>- 网络抓取架构与最佳实践<br /> - 数据收集策略和方法<br /> - 代理解决方案和基础设施设计<br /> - 应用程序接口集成与开发<br /> - 实时数据分析与洞察</p> <p>我的使命是帮助企业和开发人员驾驭复杂的在线数据收集环境,将原始数据转化为可操作的增长战略和有意义的见解。</p> <p>在领先的技术出版物上大放异彩,因其数据收集专业知识和诚实实用的建议而深受行业专业人士的信赖。</p> </div> <div class="entry-author-follow author-follow"> </div><!--.author-follow--> </div> </div><!-- .entry-author --> <div class="entry-related alignfull entry-related-style-wide"> <div class="entry-related-inner content-container site-container"> <div class="entry-related-inner-content alignwide"> <h2 class="entry-related-title" data-no-translation="" data-trp-gettext="">类似文章</h2> <div class="entry-related-carousel kadence-slide-init splide" data-columns-xxl="3" data-columns-xl="3" data-columns-md="3" data-columns-sm="2" data-columns-xs="2" data-columns-ss="1" data-slider-anim-speed="400" data-slider-scroll="1" data-slider-dots="true" data-slider-arrows="true" data-slider-hover-pause="false" data-slider-auto="false" data-slider-speed="7000" data-slider-gutter="40" data-slider-loop="true" data-slider-next-label="下一步" data-slider-slide-label="文章" data-slider-prev-label="上一页" data-no-translation-data-slider-next-label="" data-no-translation-data-slider-slide-label="" data-no-translation-data-slider-prev-label=""> <div class="splide__track"> <div class="splide__list grid-cols grid-sm-col-2 grid-lg-col-3"> <div class="carousel-item splide__slide"> <article class="entry content-bg loop-entry post-3196 post type-post status-publish format-standard has-post-thumbnail hentry category-data-scraping"> <a class="post-thumbnail kadence-thumbnail-ratio-2-3" href="https://www.data-journal.org/cn/data-scraping/building-a-web-crawler-in-c-sharp/"> <div class="post-thumbnail-inner"> <img width="720" height="405" src="https://www.data-journal.org/wp-content/uploads/2025/01/Building-a-Web-Crawler-in-C.webp" class="attachment-medium_large size-medium_large wp-post-image" alt="在 C# 中构建网络爬虫" decoding="async" loading="lazy" srcset="https://www.data-journal.org/wp-content/uploads/2025/01/Building-a-Web-Crawler-in-C.webp 720w, https://www.data-journal.org/wp-content/uploads/2025/01/Building-a-Web-Crawler-in-C-300x169.webp 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /> </div> </a><!-- .post-thumbnail --> <div class="entry-content-wrap"> <header class="entry-header"> <div class="entry-taxonomies"> <span class="category-links term-links category-style-normal"> <a href="https://www.data-journal.org/cn/data-scraping/" rel="tag">网页数据爬取 & 大数据挖掘</a> </span> </div><!-- .entry-taxonomies --> <h3 class="entry-title"><a href="https://www.data-journal.org/cn/data-scraping/building-a-web-crawler-in-c-sharp/" rel="bookmark">在 C# 中构建网络爬虫:分步教程</a></h3><div class="entry-meta entry-meta-divider-dot"> <span class="posted-by"><span class="meta-label" data-no-translation="" data-trp-gettext="">作者</span><span class="author vcard"><a class="url fn n" href="https://www.data-journal.org/">数据期刊</a></span></span> <span class="posted-on"> <time class="entry-date published updated" datetime="2025-01-25T09:35:09+00:00">1 月 25, 2025</time> </span> </div><!-- .entry-meta --> </header><!-- .entry-header --> <div class="entry-summary"> <p>在本文中,我将向您展示如何在 C# 中构建网络爬虫。我们将从头开始,...</p> </div><!-- .entry-summary --> <footer class="entry-footer"> <div class="entry-actions"> <p class="more-link-wrap"> <a href="https://www.data-journal.org/cn/data-scraping/building-a-web-crawler-in-c-sharp/" class="post-more-link"> 阅读更多<span class="screen-reader-text"> 在 C# 中构建网络爬虫:分步教程</span><span class="kadence-svg-iconset svg-baseline"><svg aria-hidden="true" class="kadence-svg-icon kadence-arrow-right-alt-svg" fill="currentColor" version="1.1" xmlns="http://www.w3.org/2000/svg" width="27" height="28" viewbox="0 0 27 28"><title data-no-translation="" data-trp-gettext="">继续