使用CrawlSpider爬取全站数据。

CrawpSpider和Spider的区别

CrawlSpider使用基于规则的方式来定义如何跟踪链接和提取数据。它支持定义规则来自动跟踪链接,并可以根据链接的特征来确定如何爬取和提取数据。CrawlSpider可以对多个页面进行同样的操作,所以可以爬取全站的数据。CrawlSpider可以使用LinkExtractor用正则表达式自动提取链接,而不需要手动编写链接提取代码。
Spider和CrawlSpider都是Scrapy的Spider类的子类。
注意:CrawlSpider是不支持请求传参的!(多个parse函数的参数之间的来回传递)

CrawlSpider使用步骤

  1. 创建一个工程 XXXPro scrapy startproject XXXPro
  2. cd XXXPro
  3. 创建爬虫文件(CrawlSpider):scrapy genspider -t crawl xxx www.xxxx.com
    • 链接提取器LinkExtractor:根据指定的规则(allow)(正则表达式)进行指定链接的提取
    • 规则解析器Rule:将链接提取器提取到的链接进行指定规则(callback)的解析

爬取全页的链接

在这里插入图片描述
我们可以根据每页的链接形式,使用正则表达式来进行提取。
通过使用下面的链接提取器,可以得到所有页面的链接,而且虽然提取到的链接是不全的,CrawlSpider还会自动补全。

    link = LinkExtractor(allow=r"/content/node_21745_")    # 这个链接提取器是用于在页面源码中根据制定规则进行正则匹配的

爬取每个新闻详情页的url

    link_detail = LinkExtractor(allow=r"/content/20")

补充规则解析器

    rules = (Rule(link, callback="parse_item", follow=False),   # #follow=True:可以将链接提取器 继续作用到 连接提取器提取到的链接 所对应的页面中Rule(link_detail, callback="parse_detail", follow=False))

parse解析函数

# 解析新闻标题def parse_item(self, response):# 注意:xpath表达式中不可以出现tbody标签a_list = response.xpath('/html/body/section[2]/div[3]/div[2]/div[1]/div[4]/ul/a')# print(li_list)for a in a_list:title = a.xpath('./li/p/text()').extract_first()item = SunproItem()item['title'] = title# print(" title:", title)yield itemprint(len(a_list))
    # 解析新闻内容def parse_detail(self, response):# print("parse_detail正在执行")content = response.xpath('//*[@id="news_con"]//text()').extract()content = ''.join(content)item = DetailItem()item['content'] = content# print("news content:", content)yield item

pipelines管道类

class SunproPipeline:def process_item(self, item, spider):if item.__class__.__name__ == 'SunproItem':print(item['title'])else:print(item['content'])return item

注意要在setings.py中开启管道类

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP图片文件管理功能系统源码

文件图库管理单PHP源码直接解压就能用,单文件,indexm.php文件可以重新命名,上传到需要访问的目录中, 可以查看目录以及各个文件,图片等和下载及修改管理服务。 源码下载:https://download.csdn.net/downloa…

零基础Linux_11(进程)进程程序替换+实现简单的shell

目录 1. 进程程序替换 1.1 程序替换原理 1.2 execl 接口 1.3 execv execlp execvp 1.4 exec 调各种程序 1.5 execle 接口 2. 实现简单的shell 2.1 打印提示和获取输入 2.2 拆开输入的命令和选项 2.3 创建进程和程序替换执行命令 2.4 内建命令实现路径切换 2.5 my…

html5 checkbox

1 选中状态的设置与获取 (1)获取checkbox是否选中: $("#checkbox").is(":checked");$("#checkbox-id")get(0).checked$(#checkbox-id).attr(checked)(2)设置checkbox是否选中 $("…

win10 ip设置

百度安全验证

第82步 时间序列建模实战:LightGBM回归建模

基于WIN10的64位系统演示 一、写在前面 这一期,我们介绍LightGBM回归。 同样,这里使用这个数据: 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndr…

Docker和容器化:简介和使用案例

Docker和容器化:简介和使用案例 引言 容器化技术在近年来变得越来越流行,为开发人员和运维团队提供了更加灵活、高效的软件部署和管理方式。其中,Docker是最为知名和广泛使用的容器化平台之一。本篇博客文章将介绍Docker和容器化的基本概念…

2023年【熔化焊接与热切割】考试资料及熔化焊接与热切割复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 2023年熔化焊接与热切割考试资料为正在备考熔化焊接与热切割操作证的学员准备的理论考试专题,每个月更新的熔化焊接与热切割复审模拟考试祝您顺利通过熔化焊接与热切割考试。 1、【单选题】 湿法水下焊接时…

力扣 -- 322. 零钱兑换(完全背包问题)

参考代码&#xff1a; 未优化代码&#xff1a; class Solution { public:int coinChange(vector<int>& coins, int amount) {int n coins.size();const int INF 0x3f3f3f3f;//多开一行&#xff0c;多开一列vector<vector<int>> dp(n 1, vector<i…

华硕X555YI, Win11下无法调节屏幕亮度

翻出一个旧电脑华硕X555YI&#xff0c;装Win11玩&#xff0c;已经估计到会有一些问题。 果然&#xff0c;装完之后&#xff0c;发现屏幕无法调节亮度。试了网上的一些方法&#xff0c;比如修改注册表等&#xff0c;无效。 估计是显卡比较老&#xff0c;哪里没兼容。然后用驱动…

vue3简易文字验证码

大神勿喷&#xff0c;简易版本&#xff0c;demo中可以用一下。 需要几个文字自己codelen 赋值 灵活点直接父组件传过去&#xff0c;可以自己改造 首先创建一个生成数字的js **mathcode.js**function MathCode(num){let str "寻寻觅觅冷冷清清凄凄惨惨戚戚乍暖还寒时候…

洛谷 P1151 子数整数

【题目链接】 洛谷 P1151 子数整数 【题目考点】 1. 循环&#xff1a;数位分离 2. 数字组合 【解题思路】 解法1&#xff1a;取出三个三位数字 对于一个五位数字 a 1 a 2 a 3 a 4 a 5 a_1a_2a_3a_4a_5 a1​a2​a3​a4​a5​ s u b 1 a 1 a 2 a 3 sub_1a_1a_2a_3 sub1​…

js中的call() apply() bind()的用法

call() apply() bind() 都是用来重定义this这个对象的,不能改变箭头函数中的this指向 bind方法多了一个括号&#xff0c;bind返回的是一个新的函数&#xff0c;必须调用才能够执行 <!DOCTYPE html> <html lang"en"><head><meta charset"…

【C++进阶(七)】仿函数深度剖析模板进阶讲解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 模板进阶 1. 前言2. 仿函数的概念3. 仿函数的实…

kubectl命令举例

为了使读者能够快速掌握kubectl命令的使用方法&#xff0c;下面对常用的命令进行介绍。 1. kubectl create命令 此命令通过文件或者标准输入创建一个资源对象&#xff0c;支持YAML或者JSON格式的配置文件。例如&#xff0c;如果用户创建了一个Nginx的YAML配置文件&#xff0c…

22.app.js的全局数据共享

app.js中定义的全局变量适合 不修改且仅在js中使用的变量 目录 1 全局变量 2 修改全局变量 3 app.js中的变量不能直接在wxml中渲染 4 全局方法 1 全局变量 比如我现在想定义一个全局的变量something&#xff0c;直接在APP中写就行了 之后你可以在任何一个页面中&…

LCR 075.数组的相对排序

​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;LCR 075. 数组的相对排序 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 先将 arr1 中在 arr2 中出现过的元素按顺序排序&#xff0c;然后将剩余元素按升序排序。 解题代码&#xff1a; c…

代码随想录算法训练营第五十六天 | 动态规划 part 14 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和(dp)

目录 1143.最长公共子序列思路代码 1035.不相交的线思路代码 53. 最大子序和&#xff08;dp&#xff09;思路代码 1143.最长公共子序列 Leetcode 思路 本题和718. 最长重复子数组 区别在于这里不要求是连续的了&#xff0c;但要有相对顺序&#xff0c;即&#xff1a;“ace” …

软件设计模式系列之二十四——模板方法模式

在软件设计领域&#xff0c;设计模式是一组被反复使用、多次实践验证的经典问题解决方案。其中&#xff0c;模板方法模式是一种行为型设计模式&#xff0c;用于定义一个算法的骨架&#xff0c;将算法中的某些步骤延迟到子类中实现&#xff0c;从而使子类可以重新定义算法的某些…

Unity调用API函数对系统桌面和窗口截图

Unity3D调用WINAPI函数对系统窗口截图 引入WINAPI函数调用WINAPI函数进行截图使用例子 引入WINAPI函数 using System; using System.Collections; using System.Runtime.InteropServices; using System.Drawing;[DllImport("user32.dll")]private static extern Int…

JAVA 泛型、序列化和复制

泛型提供了编译时类型安全检测机制&#xff0c;该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数。比如我们要写一个排序方法&#xff0c;能够对整型数组、字符串数组甚至其他任何类型的数组进行排序&a…