Python 爬虫入门(十):Scrapy选择器「详细介绍」

Python 爬虫入门(十):Scrapy选择器「详细介绍」

  • 前言
  • [1. CSS选择器](#1. CSS选择器)
    • [1.1 基本用法](#1.1 基本用法)
    • [1.2 提取属性和文本](#1.2 提取属性和文本)
    • [1.3 嵌套选择](#1.3 嵌套选择)
  • [2. XPath选择器](#2. XPath选择器)
    • [2.1 基本用法](#2.1 基本用法)
    • [2.2 提取属性和文本](#2.2 提取属性和文本)
    • [2.3 条件过滤](#2.3 条件过滤)
  • [3. 正则表达式选择器](#3. 正则表达式选择器)
    • [3.1 基本用法](#3.1 基本用法)
    • [3.2 结合Scrapy选择器使用](#3.2 结合Scrapy选择器使用)
  • [4. PyQuery选择器](#4. PyQuery选择器)
    • [4.1 基本用法](#4.1 基本用法)
    • [4.2 提取属性和文本](#4.2 提取属性和文本)
    • [4.3 嵌套选择](#4.3 嵌套选择)
  • 总结

前言

  • 欢迎来到"Python 爬虫入门"系列文章。在网络爬虫中,选择器是解析和提取网页内容的重要工具,不同的选择器有不同的特点和应用场景。
  • 在本文中,我将详细介绍四种常用的选择器:CSS选择器、XPath选择器、正则表达式和PyQuery选择器 ,并结合具体实例讲解如何在Scrapy中使用这些选择器来提取数据。为了更好的展示,我们将使用 https://jsonplaceholder.typicode.com 的数据。

1. CSS选择器

CSS选择器是通过CSS样式规则来选取HTML元素的一种方法。它直观、简洁且易于理解,是Scrapy中常用的选择器之一。

1.1 基本用法

在Scrapy中,可以使用 response.css() 方法来使用CSS选择器。

以下是常用的CSS选择器示例:

1.2 提取属性和文本

CSS选择器不仅可以选择元素,还可以提取元素的属性和文本内容。

使用 ::attr(attribute_name) 可以提取属性,使用 ::text 可以提取文本。

python 复制代码
import scrapy

class CSSSelectorSpider(scrapy.Spider):
    name = "css_selector_spider"
    start_urls = ['https://jsonplaceholder.typicode.com/users']

    def parse(self, response):
        # 提取用户的名字
        names = response.css('.username::text').getall()
        for name in names:
            yield {'name': name}
        
        # 提取用户的电子邮件地址
        emails = response.css('.email::text').getall()
        for email in emails:
            yield {'email': email}

1.3 嵌套选择

CSS选择器还可以进行嵌套选择,从父元素选择子元素。

python 复制代码
import scrapy

class CSSSelectorSpider(scrapy.Spider):
    name = "css_selector_spider"
    start_urls = ['https://jsonplaceholder.typicode.com/comments']

    def parse(self, response):
        # 选择具有特定类的div中的所有评论
        comments = response.css('div.comment-body p::text').getall()
        for comment in comments:
            yield {'comment': comment}

2. XPath选择器

XPath选择器是一种通过路径表达式来选取XML或HTML文档中的节点的方法。

它功能强大,支持复杂的节点选择和条件过滤。

2.1 基本用法

在Scrapy中,可以使用 response.xpath() 方法来使用XPath选择器。

以下是一些常用的XPath选择器示例:

python 复制代码
import scrapy

class XPathSelectorSpider(scrapy.Spider):
    name = "xpath_selector_spider"
    start_urls = ['https://jsonplaceholder.typicode.com/posts']

    def parse(self, response):
        # 选择所有的文章标题
        titles = response.xpath('//h2/text()').getall()
        for title in titles:
            yield {'title': title}

2.2 提取属性和文本

XPath选择器同样可以提取元素的属性和文本内容。

使用 @attribute_name 可以提取属性,使用 text() 可以提取文本。

python 复制代码
import scrapy

class XPathSelectorSpider(scrapy.Spider):
    name = "xpath_selector_spider"
    start_urls = ['https://jsonplaceholder.typicode.com/users']

    def parse(self, response):
        # 提取用户的名字
        names = response.xpath('//div[@class="username"]/text()').getall()
        for name in names:
            yield {'name': name}
        
        # 提取用户的电子邮件地址
        emails = response.xpath('//div[@class="email"]/text()').getall()
        for email in emails:
            yield {'email': email}

2.3 条件过滤

XPath选择器支持复杂的条件过滤,可以根据元素的属性值或文本内容进行筛选。

python 复制代码
import scrapy

class XPathSelectorSpider(scrapy.Spider):
    name = "xpath_selector_spider"
    start_urls = ['https://jsonplaceholder.typicode.com/comments']

    def parse(self, response):
        # 选择具有特定属性值的元素
        special_elements = response.xpath('//div[@data-type="example"]').getall()
        for element in special_elements:
            yield {'special_element': element}

        # 选择包含特定文本的元素
        specific_elements = response.xpath('//p[contains(text(), "specific text")]/text()').getall()
        for element in specific_elements:
            yield {'specific_element': element}

3. 正则表达式选择器

正则表达式选择器是通过模式匹配来提取文本内容的一种方法。

它适用于处理结构不规则的文本数据。

3.1 基本用法

在Scrapy中,可以使用 re 模块来编写正则表达式,并结合 response.textresponse.body 使用。

python 复制代码
import scrapy
import re

class RegexSelectorSpider(scrapy.Spider):
    name = "regex_selector_spider"
    start_urls = ['https://jsonplaceholder.typicode.com/posts']

    def parse(self, response):
        # 提取所有的文章ID
        ids = re.findall(r'"id": (\d+)', response.text)
        for id_ in ids:
            yield {'id': id_}

3.2 结合Scrapy选择器使用

正则表达式可以结合Scrapy的CSS选择器或XPath选择器使用,以进一步提取特定元素的内容。

python 复制代码
import scrapy
import re

class RegexSelectorSpider(scrapy.Spider):
    name = "regex_selector_spider"
    start_urls = ['https://jsonplaceholder.typicode.com/comments']

    def parse(self, response):
        # 使用CSS选择器选择特定元素,然后使用正则表达式提取内容
        elements = response.css('div.comment-body').getall()
        for element in elements:
            emails = re.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', element)
            for email in emails:
                yield {'email': email}

4. PyQuery选择器

PyQuery选择器是一个类似于jQuery的Python库,提供了简洁的语法来操作HTML文档。

4.1 基本用法

在Scrapy中,可以使用 pyquery 模块来使用PyQuery选择器。

以下是一些常用的PyQuery选择器示例:

python 复制代码
import scrapy
from pyquery import PyQuery as pq

class PyQuerySelectorSpider(scrapy.Spider):
    name = "pyquery_selector_spider"
    start_urls = ['https://jsonplaceholder.typicode.com/posts']

    def parse(self, response):
        # 使用PyQuery选择器选择所有的文章标题
        doc = pq(response.text)
        titles = doc('h2').items()
        for title in titles:
            yield {'title': title.text()}

4.2 提取属性和文本

PyQuery选择器可以方便地提取元素的属性和文本内容。

python 复制代码
import scrapy
from pyquery import PyQuery as pq

class PyQuerySelectorSpider(scrapy.Spider):
    name = "pyquery_selector_spider"
    start_urls = ['https://jsonplaceholder.typicode.com/users']

    def parse(self, response):
        # 使用PyQuery选择器提取用户名
        doc = pq(response.text)
        usernames = doc('.username').items()
        for username in usernames:
            yield {'username': username.text()}
        
        # 提取电子邮件地址
        emails = doc('.email').items()
        for email in emails:
            yield {'email': email.text()}

4.3 嵌套选择

PyQuery选择器也支持嵌套选择,从父元素选择子元素。

python 复制代码
import scrapy
from pyquery import PyQuery as pq

class PyQuerySelectorSpider(scrapy.Spider):
    name = "pyquery_selector_spider"
    start_urls = ['https://jsonplaceholder.typicode.com/comments']

    def parse(self, response):
        # 使用PyQuery选择器选择所有评论
        doc = pq(response.text)
        comments = doc('div.comment-body p').items()
        for comment in comments:
            yield {'comment': comment.text()}

总结

不同的选择器有不同的特点和适用场景。通过掌握CSS选择器、XPath选择器、正则表达式和PyQuery选择器的使用方法,可以有效地提取网页中的数据。

相关推荐
移远通信27 分钟前
智能硬件开发革命:低代码平台+物联网
python·物联网·低代码·智能硬件
亚林瓜子29 分钟前
python的web框架flask(hello,world版)
python·flask·conda·web·python3
IT从业者张某某1 小时前
Python数据可视化-第7章-绘制3D图表和统计地图
python·3d·信息可视化
攻城狮7号1 小时前
Python爬虫第13节-解析库pyquery 的使用
爬虫·python·python爬虫
在线打码2 小时前
禅道MCP Server开发实践与功能全解析
python·ai·禅道·deepseek·mcp·zentao·mcp server
恶霸不委屈2 小时前
重新定义健康监护!基于DeepSeek的人体生理状况智能检测装置技术解析
人工智能·python·deepseek·生理监测
我感觉。2 小时前
Anaconda环境管理及 pycharm、jupyter notebook 的配置
开发语言·pytorch·python·深度学习
Code_流苏2 小时前
《Python星球日记》第22天:NumPy 基础
python·numpy·多维数组·python数据分析·向量化计算
程序员一诺3 小时前
【Flask开发】嘿马文学web完整flask项目第4篇:4.分类,4.分类【附代码文档】
后端·python·flask·框架
Rolei_zl3 小时前
Python小程序 - 文件处理3:正则表达式
python