scrapy|请求传参实现的深度爬取-meta参数

概要

请求传参实现的深度爬取
深度爬取:爬取的数据没有在同一张页面中(首页数据+详情页数据)
在scrapy中如果没有请求传参我们是无法持久化存储数据,也就是无法通过管道存储数据   【持久化存储:管道】

实现方式:scrapy.Request(url,callback,meta)
- meta是一个字典,可以将meta传递给callback
callback取出meta:
    -response.meta['item']

需求和实现

爬取电影的标题详情介绍

  • 标题
    在这里插入图片描述

  • 详情页介绍
    在这里插入图片描述

  • 实现

  • spider.py

import scrapy

from firstBlood.items import FirstbloodItem   # items.py中的类

class DainyingSpider(scrapy.Spider):
    name = 'dainying'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['https://dygou.tv/index.php/vodshow/6-----------.html'] # 首页

    def parse(self, response):
        movies = response.xpath('//*[@id="show_page"]/div[2]/div/div[2]/ul[1]/li')  # 浏览器解析即可

        for movie in movies:
            title = movie.xpath('./a/@title').extract_first() # 同理
            url = 'https://dygou.tv/' + movie.xpath('./a/@href').extract_first()


            item = FirstbloodItem()
            item['title'] = title

            # 对详情页界面发起请求
            yield scrapy.Request(url=url, callback=self.parse_detail,meta={'item':item}) # 传递item对象
    # 在Scrapy中,meta 是一个字典,它允许你在请求之间传递数据。meta 可以包含任何你需要在爬虫的不同阶段之间共享的信息

    # 自定义 解析方法  去获得详情页的数据
    def parse_detail(self,response):
        item = response.meta['item']  # 获取item
        detail = response.xpath('/html/body/div[3]/div[1]/div[1]/div/div/section[1]/div[1]/span').extract_first()
        item['detail'] = detail  # 请求传参在这种详情页面的信息挖掘 方面起到了作用
        yield item   # 提交给管道
  • 参数
    在这里插入图片描述

  • items.py

import scrapy


class FirstbloodItem(scrapy.Item):
    title = scrapy.Field()
    detail = scrapy.Field()
    pass

名词解释

  • 深度爬取

在这里插入图片描述

  • 请求传参

传参 传递的是meta中的item对象

yield scrapy.Request(url=url, callback=self.parse_detail,meta={'item':item}) # 传递item对象

...

item = response.meta['item']  # 获取item

item['detail'] = detail  # 请求传参在这种详情页面的信息挖掘 方面起到了作用

yield item   # 提交给管道
MySQL Extract 是一种从数据记录(通常是从 SELECT 查询结果集)中提取特定字段值的功能。它类似于 SQL 中的 `EXTRACT` 函数,在某些版本的 MySQL 数据库中可用,特别是 MySQL 的旧版本,如 MySQL 5.6 及更早版本。 ### 使用方式 在旧版的 MySQL 中,可以通过 `EXTRACT` 函数来获取日期时间信息,例如年份、月份、日、小时等。其语法通常是: ```sql SELECT EXTRACT(field FROM timestamp); ``` 其中: - `field` 可以为 `YEAR`, `MONTH`, `DAY`, `HOUR`, `MINUTE`, 或 `SECOND`; - `timestamp` 是需要从中提取信息的时间戳字段。 **例子** 假设有一个表名为 `orders`,包含列 `order_date` 存储订单的日期时间信息: ```sql SELECT order_id, order_date, EXTRACT(YEAR FROM order_date) AS year, EXTRACT(MONTH FROM order_date) AS month, EXTRACT(DAY FROM order_date) AS day, EXTRACT(HOUR FROM order_date) AS hour, EXTRACT(MINUTE FROM order_date) AS minute, EXTRACT(SECOND FROM order_date) AS second FROM orders; ``` ### 注意事项 需要注意的是,`EXTRACT` 函数并非在所有版本的 MySQL 中都可用,特别地,它不再出现在 MySQL 8.0 及以后版本的标准功能集中。对于现代的 MySQL 版本,你可以使用 `DATE_FORMAT()` 或者 `STR_TO_DATE()` 结合其他函数来达到类似的效果。 ### 替代方案 在新版本的 MySQL 中,可以使用如下方法来替代 `EXTRACT` 函数: #### 通过 `DATE_FORMAT()` 如果只需要日期部分,可以使用 `DATE_FORMAT()` 来转换日期字符串到指定格式,然后解析出需要的部分。例如: ```sql SELECT DATE_FORMAT(order_date, '%Y') AS year, DATE_FORMAT(order_date, '%m') AS month, DATE_FORMAT(order_date, '%d') AS day, HOUR(order_date) AS hour, MINUTE(order_date) AS minute, SECOND(order_date) AS second FROM orders; ``` #### 使用正则表达式匹配 对于需要精确到秒甚至毫秒的情况,可以考虑使用正则表达式匹配查询的结果字符串: ```sql SELECT order_id, order_date, REGEXP_EXTRACT(order_date, '(\d{4})') AS year, REGEXP_EXTRACT(order_date, '(\d{2})') AS month, REGEXP_EXTRACT(order_date, '(\d{2})') AS day, REGEXP_EXTRACT(order_date, '(\d{2}):') AS start_hour, REGEXP_EXTRACT(order_date, ':(\d{2}):') AS minutes_part, REGEXP_EXTRACT(order_date, ':(\d{2})') AS end_minutes, REGEXP_EXTRACT(order_date, ':(\d{2})\.(\d*)') AS seconds_and_milliseconds FROM orders; ``` --- ### 相关问题: 1. **如何在新的 MySQL 版本中获取日期时间信息?** 2. **SQL Server 和 PostgreSQL 提供了哪些相似的函数用于日期时间操作?** 3. **在处理日期时间数据时,应该优先选择哪种方法?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胜天半月子

打不打商的无所谓,能帮到你就好

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

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

打赏作者

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

抵扣说明:

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

余额充值