《Python 网络爬虫简易速速上手小册》第4章:Python 网络爬虫数据抓取技术(2024 最新版)

news2025/1/18 7:34:09

在这里插入图片描述

文章目录

  • 4.1 解析 HTML 与 CSS
    • 4.1.1 重点基础知识讲解
    • 4.1.2 重点案例:使用 BeautifulSoup 解析博客文章
    • 4.1.3 拓展案例 1:使用 lxml 和 XPath 解析产品信息
    • 4.1.4 拓展案例 2:动态加载内容的抓取挑战
  • 4.2 动态内容抓取技术
    • 4.2.1 重点基础知识讲解
    • 4.2.2 重点案例:使用 Selenium 抓取动态评论
    • 4.2.3 拓展案例 1:使用 Headless Chrome 抓取股票价格
    • 4.2.4 拓展案例 2:使用 Pyppeteer 抓取动态新闻
  • 4.3 数据抽取表达式(XPath, 正则表达式)
    • 4.3.1 重点基础知识讲解
    • 4.3.2 重点案例:使用 XPath 提取新闻标题和链接
    • 4.3.3 拓展案例 1:使用正则表达式提取电子邮件地址
    • 4.3.4 拓展案例 2:结合使用 BeautifulSoup 和正则表达式

4.1 解析 HTML 与 CSS

在网络爬虫的世界里,能够解析 HTML 和 CSS 是基本生存技能。这就像是拥有一双可以透视网络迷宫的眼睛,让你能够精确地找到和提取你需要的数据。

4.1.1 重点基础知识讲解

  • HTML 结构理解:HTML(HyperText Markup Language)是构成网页的骨架。它使用一系列的标签(如 <div><a><p> 等)来组织内容。理解这些标签及其属性(如 classid)对于定位数据至关重要。
  • CSS 选择器:CSS(Cascading Style Sheets)用于添加样式到 HTML 元素。在数据抓取中,CSS 选择器非常有用,因为它们可以帮助我们定位到具有特定样式的元素。
  • 工具和库:有许多 Python 库可以帮助我们解析 HTML 和 CSS,其中最著名的包括 BeautifulSoup 和 lxml。这些库提供了方便的方法来搜索和操作 HTML 文档。

4.1.2 重点案例:使用 BeautifulSoup 解析博客文章

假设我们要从一个博客网站上抓取所有博客文章的标题和链接。BeautifulSoup 是完成这个任务的理想工具。

from bs4 import BeautifulSoup
import requests

url = "https://blog.example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

articles = soup.find_all('article')
for article in articles:
    title = article.find('h2').text
    link = article.find('a')['href']
    print(f"文章标题: {title}, 链接: {link}")

4.1.3 拓展案例 1:使用 lxml 和 XPath 解析产品信息

当处理复杂的 HTML 文档或需要更高性能的解析时,lxml 和 XPath 表达式是更加强大的工具。下面是一个示例,展示如何使用它们来抓取电商网站上的产品名称和价格。

import requests
from lxml import etree

url = "https://ecommerce.example.com/products"
response = requests.get(url)
tree = etree.HTML(response.content)

for product in tree.xpath('//div[@class="product"]'):
    name = product.xpath('.//h2/text()')[0]
    price = product.xpath('.//span[@class="price"]/text()')[0]
    print(f"产品名称: {name}, 价格: {price}")

4.1.4 拓展案例 2:动态加载内容的抓取挑战

对于通过 JavaScript 动态加载的内容,传统的 HTML 解析方法可能无法直接获取到数据。在这种情况下,我们可以使用 Selenium 来模拟浏览器行为,先执行 JavaScript,再抓取生成的内容。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://dynamic-content.example.com")

# 等待页面加载完成
driver.implicitly_wait(10)

articles = driver.find_elements_by_tag_name('article')
for article in articles:
    title = article.find_element_by_tag_name('h2').text
    print(f"文章标题: {title}")

driver.quit()

通过以上案例,我们探索了使用不同工具和方法解析 HTML 和 CSS 的基础知识及实践应用。无论是静态页面的简单抓取,还是动态内容的复杂抓取任务,掌握这些技能都将为你打开数据抓取的大门。继续前进,数据侠们,更多的宝藏等着我们去发现!

在这里插入图片描述


4.2 动态内容抓取技术

在今天的网络世界中,动态内容的生成已经变得司空见惯。从社交媒体动态、评论加载,到实时价格更新,这些内容往往依赖于 JavaScript 在客户端的执行。对于数据抓取专家来说,这意味着需要采用特殊的技术来应对这些情况。

4.2.1 重点基础知识讲解

  • 理解 AJAX 和 JavaScript 动态加载:许多现代网站使用 AJAX(Asynchronous JavaScript and XML)技术来在页面加载后从服务器获取数据,然后用 JavaScript 动态更新页面内容。这意味着,简单的 HTTP 请求无法获取到页面的全部内容。
  • Selenium:Selenium 是一个自动化测试工具,但它也被广泛用于模拟用户在浏览器中的行为来抓取动态生成的内容。它可以执行 JavaScript,等待 AJAX 请求完成,并访问由 JavaScript 动态生成的 DOM 元素。
  • Headless Browser:Headless 浏览器是没有图形用户界面的浏览器。它们可以通过命令行被控制,用于自动化网页交互,非常适合在服务器端运行。Selenium 支持与 Headless Chrome 或 Headless Firefox 的集成。

4.2.2 重点案例:使用 Selenium 抓取动态评论

假设你需要从一个新闻网站上抓取用户的动态加载评论。这些评论在页面最初加载时不可见,只有当用户滚动到页面底部时才通过 AJAX 请求加载。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://news.example.com/article")

# 模拟用户滚动到页面底部,以加载评论
driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.END)

# 等待 AJAX 加载评论
driver.implicitly_wait(10)

comments = driver.find_elements(By.CLASS_NAME, 'comment')
for comment in comments:
    print(comment.text)

driver.quit()

4.2.3 拓展案例 1:使用 Headless Chrome 抓取股票价格

在这个案例中,我们将使用 Headless Chrome 来抓取一个财经网站上动态更新的股票价格。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")  # 启用无头模式

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://finance.example.com/stock/AAPL")

price = driver.find_element(By.CLASS_NAME, 'stock-price').text
print(f"苹果公司股票价格: {price}")

driver.quit()

4.2.4 拓展案例 2:使用 Pyppeteer 抓取动态新闻

Pyppeteer 是一个 Python 库,它提供了一个接口来控制 Headless Chrome。相比 Selenium,Pyppeteer 更为轻量,适合需要频繁抓取动态内容的场景。

import asyncio
from pyppeteer import launch

async def fetch_news():
    browser = await launch(headless=True)
    page = await browser.newPage()
    await page.goto('https://news.example.com/today')

    # 等待动态内容加载
    await page.waitForSelector('.news-item', {'timeout': 10000})

    news_items = await page.querySelectorAll('.news-item')
    for item in news_items:
        title = await page.evaluate('(item) => item.innerText', item)
        print(f"新闻标题: {title}")

    await browser.close()

asyncio.get_event_loop().run_until_complete(fetch_news())

通过这些案例,我们可以看到,尽管动态内容的抓取比静态内容更具挑战性,但通过使用正确的工具和技术,我们依然可以有效地获取所需的数据。无论是模拟浏览器操作的 Selenium,还是无头浏览器技术,选择合适的工具可以让这一任务变得简单许多。

在这里插入图片描述


4.3 数据抽取表达式(XPath, 正则表达式)

在网络爬虫的艺术中,精确地提取目标数据是一项至关重要的技能。XPath 和正则表达式就像是爬虫工程师的瑞士军刀,它们提供了强大的能力来定位和抽取网页中的数据。

4.3.1 重点基础知识讲解

  • XPath:XPath 是一种在 XML 文档中查找信息的语言,也常用于 HTML。它允许开发者通过元素和属性进行导航,非常适合于复杂的文档结构。
  • 正则表达式:正则表达式是一种强大的文本处理工具,用于搜索、替换那些符合某个模式(规则)的字符串。在数据抽取中,正则表达式能够快速地从一段文本中提取出我们感兴趣的部分。
  • 工具选择:Python 中处理 XPath 的库包括 lxml 和 Scrapy。对于正则表达式,Python 的内置库 re 提供了丰富的功能。

4.3.2 重点案例:使用 XPath 提取新闻标题和链接

假设我们的目标是从新闻网站上提取新闻标题和对应的链接。这里,我们使用 lxml 库来处理 XPath 表达式。

from lxml import etree
import requests

url = "https://news.example.com"
response = requests.get(url)
tree = etree.HTML(response.content)

titles = tree.xpath('//h2[@class="title"]/text()')
links = tree.xpath('//h2[@class="title"]/a/@href')

for title, link in zip(titles, links):
    print(f"新闻标题: {title}, 链接: {link}")

4.3.3 拓展案例 1:使用正则表达式提取电子邮件地址

在某些情况下,你可能需要从网页中提取电子邮件地址。正则表达式在这种任务中表现出色。

import re
import requests

url = "https://contact.example.com"
response = requests.get(url)
content = response.text

emails = re.findall(r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+', content)

for email in emails:
    print(f"发现电子邮件: {email}")

4.3.4 拓展案例 2:结合使用 BeautifulSoup 和正则表达式

有时候,结合使用 BeautifulSoup 和正则表达式可以提供更灵活的数据抽取方式。比如,提取包含特定文本模式的所有段落。

from bs4 import BeautifulSoup
import requests
import re

url = "https://blog.example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 假设我们想提取包含日期(如 "2023-01-01")的段落
pattern = re.compile(r'\d{4}-\d{2}-\d{2}')
paragraphs = soup.find_all('p', string=pattern)

for paragraph in paragraphs:
    if pattern.search(paragraph.text):
        print(f"找到含日期的段落: {paragraph.text}")

通过这些案例,我们看到了 XPath 和正则表达式在数据抽取中的强大能力。无论是精确地定位网页元素,还是从复杂的文本中提取信息,掌握这些技能都将极大增强你的爬虫效率和准确性。练习和应用这些技术,让你的数据抓取之旅更加顺利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1432302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时间序列预测——GRU模型

时间序列预测——GRU模型 在深度学习领域&#xff0c;循环神经网络&#xff08;RNN&#xff09;是处理时间序列数据的一种常见选择。上期已介绍了LSTM的单步和多步预测。本文将深入介绍一种LSTM变体——门控循环单元&#xff08;GRU&#xff09;模型&#xff0c;包括其理论基础…

ArcGIS Pro 按照字段进行融合或拆分

ArcGIS Pro 按字段融合 在ArcGIS Pro中&#xff0c;通过使用“融合”工具可以轻松地合并具有相同字段的图层。 步骤一&#xff1a;打开ArcGIS Pro 启动ArcGIS Pro应用程序&#xff0c;确保您已经登录并打开您的项目。 步骤二&#xff1a;添加图层 将包含相同字段的图层添加到…

【C++】C++入门 — 类和对象初步介绍

类和对象 1 类的作用域2 类的实例化3 类对象模型4 this指针介绍&#xff1a;特性&#xff1a; Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 1 类的作用域 类定义了一个新的作用域&#xff0c;类的…

项目安全问题及解决方法-----xss处理

XSS 问题的根源在于&#xff0c;原本是让用户传入或输入正常数据的地方&#xff0c;被黑客替换为了 JavaScript 脚本&#xff0c;页面没有经过转义直接显示了这个数据&#xff0c;然后脚本就被 执行了。更严重的是&#xff0c;脚本没有经过转义就保存到了数据库中&#xff0c;随…

Redis之基础篇

Redis简介 Redis是一种基于键值对&#xff08;Key-Value&#xff09;的NoSQL数据库&#xff0c;它支持string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xff09;、set&#xff08;集合&#xff09;、zset&#xff08;有序集…

matplotlib-中文乱码问题解决方案

前言 本文主要解决matplotlib在画图时&#xff0c;出现的中文乱码问题&#xff0c;具体问题示意如下&#xff1a; 下面将针对这个问题直接给出具体的解决步骤。 具体步骤 1、首先去网上下载并安装SimHei字体&#xff0c;其它字体也行&#xff0c;如下 并将它安装在此目录下…

面试150 位1的个数 位运算

Problem: 191. 位1的个数 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考 复杂度 Code public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n){int res 0;while (n ! 0){res 1;n & n - 1;// 把最后…

海康IPC摄像机接入国标平台,发现一直不在线(离线)的处理方式

目 录 一、问题 二、问题分析 &#xff08;一&#xff09;常见设备离线问题的原因 &#xff08;二&#xff09;原因分析 三、问题查处 &#xff08;一&#xff09;设备端排查故障&#xff08;设备端自查&#xff09; 1、检查GB28181参数配置是否有误 2、…

【算法与数据结构】739、LeetCode每日温度

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;   程序如下&#xff1a; 复杂度分析&#xff1a; 时间复杂度&#xff1a; O ( ) O() O()。空间复…

【2月比赛合集】28场可报名的数据挖掘大奖赛,任君挑选!

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 Kaggle&#xff08;2场比赛&#xff09;阿里天池&#xff08;…

Elasticsearch:集群故障排除和优化综合指南

Elasticsearch 是一个强大的搜索和分析引擎&#xff0c;是许多数据驱动应用程序和服务的核心。 它实时处理、分析和存储大量数据的能力使其成为当今快节奏的数字世界中不可或缺的工具。 然而&#xff0c;与任何复杂的系统一样&#xff0c;Elasticsearch 可能会遇到影响其性能和…

【Vue项目中使用videojs播放本地mp4的项目】

目录 以下是一个使用video.js播放本地mp4文件的Vue项目代码示例&#xff1a;1. 首先&#xff0c;在终端中使用以下命令安装video.js和video.js插件&#xff1a;2. 在Vue组件中&#xff0c;引入video.js和videojs-youtube插件&#xff1a;3. 配置video-js.css文件&#xff0c;可…

python给word插入脚注

1.需求 最近因为工作需要&#xff0c;需要给大量文本的脚注插入内容&#xff0c;我就写了个小程序。 2.实现 下面程序是我已经给所有脚注插入了两次文本“幸福”&#xff0c;给脚注2到4再插入文本“幸福” from win32com import clientdef add_text_to_specific_footnotes(…

1-2 动手学深度学习v2-基础优化方法-笔记

最常见的算法——梯度下降 当一个模型没有显示解的时候&#xff0c;该怎么办呢&#xff1f; 首先挑选一个参数的随机初始值&#xff0c;可以随便在什么地方都没关系&#xff0c;然后记为 w 0 \pmb{w_{0}} w0​在接下来的时刻里面&#xff0c;我们不断的去更新 w 0 \pmb{w_{0}…

Unity制作随风摇摆的植物

今天记录一下如何实现随风摇摆的植物&#xff0c;之前项目里面的植物摇摆实现是使用骨骼动画实现的&#xff0c;这种方式太消耗性能&#xff0c;植物这种东西没必要&#xff0c;直接使用顶点动画即可。 准备 植物不需要使用标准的PBR流程&#xff0c;基础的颜色贴图加上法向贴…

使用_NT_SYMBOL_PATH在启动VS前设置PDB路径

一、背景 由于公司相关项目的开发管理方式&#xff0c;导致公司会存在多个分支的版本正在开发/测试中。 在这样的背景下&#xff0c;我的日常工作中有时会出现存在某个分支的项目软件的某个功能出现了问题需要我去排查解决&#xff0c;而我当前并不在该分支上开发。于是只能安装…

嵌入式linux移植篇之根文件系统(rootfs)

根文件系统首先是内核启动时所 mount(挂载)的第一个文件系统&#xff0c;系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。单独的 Linux 内核是没法正常工作的&#xff0c;必须要搭配根文件系统。 根文件系统的目录结构 根文…

【SpringBoot】RBAC权限控制

&#x1f4dd;个页人主&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;SpringBoot⛺️稳重求进&#xff0c;晒太阳 权限系统与RBAC模型 权限 为了解决用户和资源的操作关系&#xff0c; 让指定的用户&#xff0c;只能操作指定的资源。 权限功能 菜单权限&a…

自建服务器监控工具uptime kuma

web服务器使用 雨云 提供的2核2g 这里使用1panel的uptime kuma 首先&#xff0c;如果你使用雨云&#xff0c;那么可以直接省去安装1panel的烦恼 直接选择预装后&#xff0c;等待部署完成即可看到面板信息&#xff0c;进入面板&#xff0c;点击应用商店 在应用商店里找到upti…

视云闪播截图

视云闪播截图 1. 截图设置2. 热键设置3. 视频截取3.1. 保存 -> 完成 References 深度学习图像数据获取工具。 视云闪播 https://www.netposa.com/Service/Download.html 1. 截图设置 视云闪播 -> 系统设置 -> 截图设置 2. 热键设置 视云闪播 -> 系统设置 ->…