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

前言

  • 欢迎来到“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 可以提取文本。

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选择器还可以进行嵌套选择,从父元素选择子元素。

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选择器示例:

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() 可以提取文本。

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选择器支持复杂的条件过滤,可以根据元素的属性值或文本内容进行筛选。

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 使用。

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选择器使用,以进一步提取特定元素的内容。

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选择器示例:

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选择器可以方便地提取元素的属性和文本内容。

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选择器也支持嵌套选择,从父元素选择子元素。

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选择器的使用方法,可以有效地提取网页中的数据。

  • 26
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

blues_C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值