Python爬虫从入门到精通:(36)CrawlSpider实现深度爬取_Python涛哥

2023-11-03

我们来看下CrawlSpider实现深度爬取。

爬取阳光热线标题、状态、和详情页内容。

https://wz.sun0769.com/political/index/politicsNewest?id=1&type=4&page=


创建CrawlSpider工程

  1. scrapy startproject sunPro

  2. cd sunPro

  3. scrapy genspider -t crawl sun www.xxx.com

  4. 修改配置文件等

在这里插入图片描述


页面解析

提取下页码链接

我们看到这个网站有很多页面,我们先来提取下页码链接。
在这里插入图片描述

很容易分析到页面链接的规律,写下正则:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class SunSpider(CrawlSpider):
    name = 'sun'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['https://wz.sun0769.com/political/index/politicsNewest?id=1&type=4&page=']
    # 提取页码链接
    link = LinkExtractor(allow=r'id=1&page=\d+')

    rules = (
        Rule(link, callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        print(response)

在这里插入图片描述

这里我们主要学习深度爬取,后面只用一页作为案例。follow=False

数据解析

我们来获取当前页的标题、详情页地址和状态

在这里插入图片描述

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from sunPro.items import SunproItem


class SunSpider(CrawlSpider):
    name = 'sun'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['https://wz.sun0769.com/political/index/politicsNewest?id=1&type=4&page=']
    # 提取页码链接
    link = LinkExtractor(allow=r'id=1&page=\d+')

    rules = (
        Rule(link, callback='parse_item', follow=False),
    )

    # 页面数据解析
    def parse_item(self, response):
        li_list = response.xpath('/html/body/div[2]/div[3]/ul[2]/li')
        for li in li_list:
            title = li.xpath('./span[3]/a/text()').extract_first()
            detail_url = 'https://wz.sun0769.com' + li.xpath('./span[3]/a/@href').extract_first()
            status = li.xpath('./span[2]/text()').extract_first()

            # 保存item提交给管道
            item = SunproItem()
            item['title'] = title
            item['detail_url'] = detail_url
            item['status'] = status



**手动发送请求**

现在我们用手动发送请求的方式解析详情页数据:

```python
# 页面数据解析
def parse_item(self, response):
    li_list = response.xpath('/html/body/div[2]/div[3]/ul[2]/li')
    for li in li_list:
        title = li.xpath('./span[3]/a/text()').extract_first()
        detail_url = 'https://wz.sun0769.com' + li.xpath('./span[3]/a/@href').extract_first()
        status = li.xpath('./span[2]/text()').extract_first()

        # 保存item提交给管道
        item = SunproItem()
        item['title'] = title
        item['detail_url'] = detail_url
        item['status'] = status

        yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={'item': item})
        
# 详情页数据解析
def parse_detail(self, response):
    content = response.xpath('/html/body/div[3]/div[2]/div[2]/div[2]/pre/text()').extract_first()
    item = response.meta['item']

    item['content'] = content
    yield item

运行一下,我们就获取了全部数据

在这里插入图片描述


完整代码:

sum.py

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from sunPro.items import SunproItem

class SunSpider(CrawlSpider):
    name = 'sun'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['https://wz.sun0769.com/political/index/politicsNewest?id=1&type=4&page=']
    # 提取页码链接
    link = LinkExtractor(allow=r'id=1&page=\d+')

    rules = (
        Rule(link, callback='parse_item', follow=False),
    )

    # 页面数据解析
    def parse_item(self, response):
        li_list = response.xpath('/html/body/div[2]/div[3]/ul[2]/li')
        for li in li_list:
            title = li.xpath('./span[3]/a/text()').extract_first()
            detail_url = 'https://wz.sun0769.com' + li.xpath('./span[3]/a/@href').extract_first()
            status = li.xpath('./span[2]/text()').extract_first()

            # 保存item提交给管道
            item = SunproItem()
            item['title'] = title
            item['status'] = status

            yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={'item': item})

    # 详情页数据解析
    def parse_detail(self, response):
        content = response.xpath('/html/body/div[3]/div[2]/div[2]/div[2]/pre/text()').extract_first()
        item = response.meta['item']

        item['content'] = content
        yield item

items.py

import scrapy

class SunproItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    status = scrapy.Field()
    content = scrapy.Field()

Pipeline.py

class SunproPipeline:
    def process_item(self, item, spider):
        print(item)
        return item

settings.py

略~请自己学会熟练配置!


总结

CrawlSpider实现的深度爬取

  • 通用方式:CrawlSpider + Spider实现

关注Python涛哥!学习更多Python知识!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬虫从入门到精通:(36)CrawlSpider实现深度爬取_Python涛哥 的相关文章

  • 使用 Python Multiprocessing Pool.map() 的问题在 Python 3.7.2 中变得棘手,但在 3.6.2 中很快完成

    我刚刚将Python从3 6 2 gt 3 7 2并且遇到了问题multiprocessing图书馆 我在 Django 应用程序中使用它 该应用程序在工作函数中使用 Django 特定的函数 见下文 在我的代码中 我有以下内容 impor
  • 将 JSON 发布到 Python CGI

    我已经安装了 Apache2 并且 Python 可以工作 但我有一个问题 我有两页 一个是 Python 页面 另一个是带有 JQuery 的 Html 页面 有人可以告诉我如何让我的 ajax 帖子正常工作吗
  • 如何在 Debian 上的 virtualenv 中安装 numpy?

    注 参见这另一篇文章 https stackoverflow com questions 6442754 how to install h5py numpylibhdf5 as non root on a debian linux syst
  • 在Python中,如何将矩阵逆时针旋转90度?

    gt gt gt def rotate matrix k List List int For example if I have m 1 2 3 2 3 3 5 4 3 rotate matrix m should give me 3 3
  • Pycharm 从 Git 子模块导入

    我在 Pycharm 中有一个 python 项目 其中有一个嵌套的 Git 子模块 这是文件夹结构 my git repo git submodule repo package1 foo py bar py package2 baz py
  • Python 转换矩阵

    我有一个如下所示的列表 2 1 3 1 2 3 1 2 2 2 我想要的是一个转换矩阵 它向我显示如下序列 1 后跟 1 的频率是多少 1 后面跟着 2 的频率是多少 1 后跟 3 的频率是多少 2 后跟 1 的频率是多少 2 后跟 2 的
  • 键入的完整命令行

    我想获得输入时的完整命令行 This join sys argv 在这里不起作用 删除双引号 另外 我不想重新加入已解析和拆分的内容 有任何想法吗 你太迟了 当键入的命令到达 Python 时 您的 shell 已经发挥了它的魔力 例如 引
  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • Django 多对多关系(类别)

    我的目标是向我的 Post 模型添加类别 我希望以后能够按不同类别 有时是多个类别 查询所有帖子 模型 py class Category models Model categories 1 red 2 blue 3 black title
  • Python - Unicode 到 ASCII 的转换

    我无法在不丢失数据的情况下将以下 Unicode 转换为 ASCII u ABRA xc3O JOS xc9 I tried encode and decode他们不会这么做 有人有建议吗 Unicode 字符u xce0 and u xc
  • ValueError:数据必须为正(boxcox scipy)

    我正在尝试将我的数据集转换为正态分布 0 8 298511e 03 1 3 055319e 01 2 6 938647e 02 3 2 904091e 02 4 7 422441e 02 5 6 074046e 02 6 9 265747e
  • 将 window.location 传递给 Flask url_for

    我正在使用 python 在我的页面上 当匿名用户转到登录页面时 我想将一个变量传递到后端 以便它指示用户来自哪里 发送 URL 因此 当用户单击此锚链接时 a href Sign in a 我想发送用户当前所在页面的当前 URL
  • 如何用正则表达式替换多个匹配/组?

    通常我们会编写以下内容来替换一场比赛 namesRegex re compile r is life re I replaced namesRegex sub r butter There is no life in the void pr
  • 为什么 Collections.counter 这么慢?

    我正在尝试解决罗莎琳德的基本问题 即计算给定序列中的核苷酸 并在列表中返回结果 对于那些不熟悉生物信息学的人来说 它只是计算字符串中 4 个不同字符 A C G T 出现的次数 我期望collections Counter是最快的方法 首先
  • 从 wxPython 事件处理程序中调用函数

    我正在努力寻找一种在 wxPython 事件处理函数中使用函数的方法 假设我有一个按钮 单击该按钮时 它会使用事件处理程序运行一个名为 OnRun 的函数 但是 用户忘记单击 OnRun 按钮之前的 RadionButton 我想弹出一个
  • 如何展平解析树并存储在字符串中以进行进一步的字符串操作 python nltk

    我正在尝试从树结构中获取扁平树 如下所示 我想将整个树放在一个字符串中 就像没有检测到坏树错误一样 S NP SBJ NP DT The JJ high JJ seven day PP IN of NP DT the CD 400 NNS
  • 如何创建用于霍夫曼编码和解码的树?

    对于我的作业 我将对霍夫曼树进行编码和解码 我在创建树时遇到问题 并且陷入困境 不要介意打印语句 它们只是让我测试并查看函数运行时的输出是什么 对于第一个 for 循环 我从主块中用于测试的文本文件中获取了所有值和索引 在第二个 for 循
  • Python:如何在不先创建整个列表的情况下计算列表的总和?

    通常我们必须 1 声明一个列表 2 使用以下方法计算该列表的总和sum 但现在我希望指定一个以 1 开头 间隔为 4 100 个元素的列表 如下所示 1 5 9 13 17 21 25 29 33 37 我不想涉及数学公式 所以 1 如何在
  • pandas.read_fwf 忽略提供的数据类型

    我正在从文本文件导入数据框 我想指定列的数据类型 但 pandas 似乎忽略了dtype input 一个工作示例 from io import StringIO import pandas as pd string USAF WBAN S
  • 基于值的 matplotlib 条形图颜色

    有没有一种方法可以根据条形图的值对条形图的条形进行着色 例如 values below 0 5 red values between 0 5 to 0 green values between 0 to 08 blue etc 我找到了一些

随机推荐

  • Python学习--函数与Lambda表达式

    链接 DataWhale函数与Lambda表达式 目录 1 函数 函数的定义 函数的调用 函数的返回值 函数文档及注解 函数参数 1 位置参数 2 默认参数 3 可变参数 4 关键字参数 5 命名关键字参数 6 参数组合 变量作用域 内嵌函
  • 一个能干掉90%候选人的Kafka面试连环炮!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 1 写在前面 2 如何保证宕机时数据不丢失 3 多副本冗余的高可用机制 4 多副本之间数据如何同步 5 ISR到底指的什么东西 6 acks参数的含义 7 最后
  • Less 18 (请求头注入--user-agent注入)

    文章目录 1 题目分析 2 构造SQL 3 手工注入 4 使用python进行注入 5 SQLmap注入 1 题目分析 首先我们来分析一下题目 经过尝试 我们知道 当我们输入正确的用户名和密码的时候 后台会将User Agent返回到屏幕上
  • 全国计算机等级考试题库二级C操作题100套(第89套)

    第89套 给定程序中 函数fun的功能是 求出形参ss所指字符串数组中最长字符串的 长度 其余字符串左边用字符 补齐 使其与最长的字符串等长 字符串数组中共 有M个字符串 且串长
  • 正点STM32F407核心板+ESP8266实现简单通信(详细讲解)

    1 ESP8266固件库的烧录 如果用串口助手连上板子 给8266发送AT指令发现老是报错error 可以重新烧录一下固件库 正点的ESP8266资料下载网址 http www openedv com thread 308397 1 1 h
  • tcp连接多久会自动断开_K8s 节点断开连接后,本在运行的 Pod 会如何?

    在工作节点与主节点断开连接后 工作节点上的 Pod 是什么状态 是否在继续运行 Kubernetes 控制器又在做什么 本文对此进行了实例研究 一一解答 作者 Bhargav Bhikkaji 翻译 Bach 才云 校对 星空下的文仔 才云
  • 微信小程序云开发之初体验(详细教程)

    微信小程序云开发之初体验 小程序云开发是微信最近推出的新的一项能力 它弱化了后端以及运维的概念 开发者无需搭建服务器 使用微信平台提供的api即可完成核心的业务开发 目前提供三大基础能力支持 云函数 在云端运行的代码 微信私有协议天然鉴权
  • 刷脸支付普及逐渐攀升产业生态逐渐形成

    刷脸让支付生态重返硬件年代 刷脸支付机具的生产 销售 铺设 维护涉及大量成本 客观存在压货风险大 后期服务难 地推成本高等问题 模式重而受益低 导致银行和大多数中小支付机构入局刷脸支付的意愿则整体薄弱得多 银联高调入局之际 2019 也是支
  • 《啊哈算法》学习——桶排序

    学习啊哈算法第一天 第一章第一节最快最简单的桶排序 问题描述 班级五名同学的分数排序 十分制 问题分析及思路 借助大小为10的一维数组 初始化为0 意味该分数没有人得 接下来处理分数 如有两个人得5分 即将a 5 2 记录下分数即出现次数后
  • Spring Validation 接口入参校验

    一 前言 JSR 是 Java Specification Requests 的缩写 含义为 JAVA 规范提案 JSR 303 Bean Validation 规范 正是一套基于 JavaBean 参数校验的标准 Hibernate Va
  • s3c2440移植ucGUI

    编译环境 ADS1 2 开发板 TQ2440 主要参考这篇文章 stm32 UCGUI 完美移植 ucGUI版本 3 90 ucGUI3 90下载地址 UCGUI最新3 90版源码 屏幕 联想VGA电脑屏幕 最大分辨率1024x768 1
  • vue如何编写自定义指令directive

    vue已经给我们内置了很多很好用的指令了 v mode v show 等等 但是有时候当这些指令不能满足我们需求的时候 我们还可以使用vue的自定义指令功能编写我们的指令 这是一个很强大的功能 需要说明的是 尽管自定义指令这个功能很强大 但
  • 3D MAX导出插件编写

    转 3D MAX导出插件编写 2011 6 9阅读1667 评论0 文章版权归博客园 BigCoder所有 转载请于明显位置标明原文作者及出处 以示尊重 原文出处 http www cnblogs com csyisong archive
  • 用GDB远程调试运行于QEMU的程序

    1 前言 限于作者能力水平 本文可能存在谬误 因此而给读者带来的损失 作者不做任何承诺 2 测试环境 本文使用 Ubuntu 16 04 4 LTS QEMU 环境进行调试 3 用 GDB 调试 QEMU 内程序 3 1 编写用来调试的程序
  • 国内使用reCaptcha验证码的完整教程

    国内使用reCaptcha验证码的完整教程
  • 查看系统端口占用

    第一步 win R打开 输入cmd进入命令窗口 第二步 输入netstat ano回车 找到对应的进程PID为14472 或者采用这个方法 用 netstat ntlp 查看监听端口 无3000 第三步 输入命令tasklist回车 找到对
  • C#Expression表达式树(lambda)的使用——Parameter、Property、Call、构建Select、构建Where

    1 定义参数 Parameter 访问属性 Property private static void Main string args 1 定义参数 Parameter 访问属性 Property 定义表达式树中的参数或变量 linq表达式
  • SSH密码暴力破解及防御实战

    前言 本文对目前流行的 SSH 密码暴力破解工具进行实战研究 分析和总结 对渗透攻击测试和安全防御具有一定的参考价值 首先介绍几款常用的ssh暴力破解工具 1 hydra 海德拉 指定用户破解 Examples hydra l user P
  • nn.moduleList 和Sequential由来、用法和实例 —— 写网络模型

    对于cnn前馈神经网络如果前馈一次写一个forward函数会有些麻烦 在此就有两种简化方式 ModuleList和Sequential 其中Sequential是一个特殊的module 它包含几个子Module 前向传播时会将输入一层接一层
  • Python爬虫从入门到精通:(36)CrawlSpider实现深度爬取_Python涛哥

    我们来看下CrawlSpider实现深度爬取 爬取阳光热线标题 状态 和详情页内容 https wz sun0769 com political index politicsNewest id 1 type 4 page 创建CrawlSp