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

在这里插入图片描述

文章目录

  • 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 和正则表达式在数据抽取中的强大能力。无论是精确地定位网页元素,还是从复杂的文本中提取信息,掌握这些技能都将极大增强你的爬虫效率和准确性。练习和应用这些技术,让你的数据抓取之旅更加顺利!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】内存管理深入解析

目录 1. 内存的五大区域1.1 栈区&#xff08;Stack&#xff09;1.2 堆区&#xff08;Heap&#xff09;1.3 全局/静态存储区1.4 常量存储区1.5 代码区 2. 回顾c语言的动态内存管理2.1 malloc/calloc/realloc2.2 free 3. C中的新旧对话3.1 new3.2 delete 4. new/delete的实现原理…

ES6 ~ ES11 学习笔记

课程地址 ES6 let let 不能重复声明变量&#xff08;var 可以&#xff09; let a; let b, c, d; let e 100; let f 521, g "atguigu", h [];let 具有块级作用域&#xff0c;内层变量外层无法访问 let 不存在变量提升&#xff08;运行前收集变量和函数&#…

ZigBee学习——在官方例程上实现串口通信

Z-Stack版本为3.0.2 IAR版本为10.10.1 文章目录 一、添加头文件二、定义接收缓冲区三、编写Uart初始化函数四、编写串口回调函数五、函数声明六、函数调用七、可能遇到的问题(function “halUartInit“ has no prototype) 以下所有操作都是在APP层进行&#xff0c;也就是这个文…

[Python 安装]

进入Python的官方下载页面 http://www.python.org/download/ 然后进行软件的下载 下载好之后点击exe会出现安装界面&#xff0c;接着进行安装&#xff0c;选择安装路径。 运行Python 安装成功后&#xff0c;打开命令提示符窗口&#xff08;winR,在输入cmd回车&#xf…

C程序训练:二分查找法的应用之2

本文来自&#xff1a;C程序训练&#xff1a;二分查找法的应用之2 在《C程序训练&#xff1a;二分查找法的应用》一文中介绍了利用二分查找计算某个区间中数的个数&#xff0c;本文介绍利用二分查找法计算数列中出现单个数字的位置。题目描述如下。 题目描述&#xff1a;一维整…

Python进阶--下载想要的格言(基于格言网的Python爬虫程序)

注&#xff1a;由于上篇帖子&#xff08;Python进阶--爬取下载人生格言(基于格言网的Python3爬虫)-CSDN博客&#xff09;篇幅长度的限制&#xff0c;此篇帖子对上篇做一个拓展延伸。 目录 一、爬取格言网中想要内容的url 1、找到想要的内容 2、抓包分析&#xff0c;找到想…

Netty源码系列 之 bind绑定流程 源码

Netty框架总览 Netty是一个基于NIO异步通信框架 Netty框架是由许多组件&#xff0c;优化的数据结构所构建成。 正是通过灵活的组件构建&#xff0c;优化后的数据结构&#xff0c;进而才能保证Netty框架面对高并发场景具有一定的能力 Netty相关组件 Netty重要的组件有&…

代码随想录算法训练营DAY14 | 二叉树 (1)

一、二叉树理论基础 1.存储方式 链式存储&#xff1a; 顺序存储&#xff1a; 2.二叉树标准定义(Java) public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {…

spring cloud stream

背景 主要解决不同消息中间件切换问题。实现不同中间件的代码解耦。 链接: 支持的中间件 后文使用kafka测试。 引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stream</artifactId></depende…

微服务介绍、使用 Nacos 实现远程调用以及 OpenFeign 的使用

1 微服务的概念 区别于单体项目 单体项目拆分成微服务项目的目标&#xff1a;高内聚、低耦合 拆分思路 纵向拆分&#xff1a;根据功能模块 横向拆分&#xff1a;抽取可复用模块 2 微服务拆分——远程调用 背景&#xff1a;微服务单一职责&#xff0c;每个服务只有自己的功能…

电脑没有声音是怎么回事?几招快速解决

当电脑突然失去声音&#xff0c;这可能成为一种令人烦恼的体验&#xff0c;尤其是在你期望享受音乐、观看视频或进行在线会议的时候。幸运的是&#xff0c;大多数时候&#xff0c;电脑没有声音的问题是可以迅速解决的。电脑没有声音是怎么回事&#xff1f;本文将为你介绍一些常…

老是抓不准现货白银实时报价怎么办?

现货白银的实时报价是不断变动的&#xff0c;投资者要了解当下的现货白银实时走势&#xff0c;并且依靠对实时报价的分析预判未来的趋势&#xff0c;这是不容易的&#xff0c;但是不是不能做到呢&#xff1f;也不是。因为市场不是横盘就是趋势&#xff0c;只要有趋势&#xff0…

零代码3D可视化快速开发平台

老子云平台 老子云3D可视化快速开发平台&#xff0c;集云压缩、云烘焙、云存储云展示于一体&#xff0c;使3D模型资源自动输出至移动端PC端、Web端&#xff0c;能在多设备、全平台进行展示和交互&#xff0c;是全球领先、自主可控的自动化3D云引擎。此技术已经在全球申请了专利…

.NET Avalonia开源、免费的桌面UI库 - SukiUI

前言 今天分享一款.NET Avalonia基于MIT License协议开源、免费的桌面UI库&#xff1a;SukiUI。 Avalonia介绍 Avalonia是一个强大的框架&#xff0c;使开发人员能够使用.NET创建跨平台应用程序。它使用自己的渲染引擎绘制UI控件&#xff0c;确保在Windows、macOS、Linux、An…

用云手机打造tiktok账号需要注意些什么?

随着tiktok平台的火热&#xff0c;越来越多的商家开始尝试更高效的tiktok运营方法。其中&#xff0c;tiktok云手机作为一种新科技引起了很多人的注意&#xff0c;那么用云手机运营tiktok需要注意些什么&#xff1f;下文将对此进行详细解析。 1. 不是所有的云手机都适合做tiktok…

跳过mysql密码并重置密码 shell脚本

脚本 目前只是验证了5.7 版本是可以的&#xff0c;8.多的还需要验证 以下是一个简单的Shell脚本&#xff0c;用于跳过MySQL密码设置并重置密码&#xff1a; #!/bin/bash yum install psmisc -y# 停止MySQL服务 sudo service mysqld stop# 跳过密码验证 sudo mysqld --skip-g…

通过 docker-compose 部署 Flink

概要 通过 docker-compose 以 Session Mode 部署 flink 前置依赖 Docker、docker-composeflink 客户端docker-compose.yml version: "2.2" services:jobmanager:image: flink:1.17.2ports:- "8081:8081"command: jobmanagervolumes:- ${PWD}/checkpoin…

分析伦敦银报价总失败?你试试这样

做伦敦银交易的投资者要先对伦敦银报价进行分析&#xff0c;但是有些投资者反映自己分析伦敦银报价总是失败&#xff0c;抓不住市场价格的变化趋势&#xff0c;为什么会这样呢&#xff1f;我们可以从以下这两个方面来考虑。 转变分析工具。为什么分析伦敦银报价总失败&#xff…

提升你的PHP开发效率:探索JetBrains PhpStorm 2022的全新特性

在当今快速发展的软件开发领域&#xff0c;选择一个强大且高效的开发工具对于提升开发效率、保证代码质量至关重要。对于PHP开发者来说&#xff0c;JetBrains PhpStorm一直是市场上最受欢迎的IDE之一。随着JetBrains PhpStorm 2022的发布&#xff0c;这款工具带来了一系列创新功…

蓝桥杯-求阶乘-python

问题描述 满足N!的末尾恰好有K个0的最小的N是多少&#xff1f; 如果这样的N不存在输出一1。 思路解析 末尾的0是由10产生的&#xff0c;而10是由质数2和5产生的 在求阶乘的过程中&#xff0c;只要是偶数就会有2&#xff0c;而5相对2更少&#xff0c;所以对于10的数量我们可以…