“揭秘CentosChina爬虫项目:掌握Scrapy框架的必备技巧与数据库设计“

news2024/9/29 3:21:45

Centoschina

项目要求

爬取centoschina_cn的所有问题,包括文章标题和内容

数据库表设计

库表设计:

image-20240808161837432

数据展示:

image-20240808161722167

项目亮点

  • 低耦合,高内聚。

    爬虫专有settings

    custom_settings = custom_settings_for_centoschina_cn
    
    custom_settings_for_centoschina_cn = {
        'MYSQL_USER': 'root',
        'MYSQL_PWD': '123456',
        'MYSQL_DB': 'questions',
    }
    
  • DownloaderMiddleware使用

    class CentoschinaDownloaderMiddleware:
        # Not all methods need to be defined. If a method is not defined,
        # scrapy acts as if the downloader middleware does not modify the
        # passed objects.
    
        @classmethod
        def from_crawler(cls, crawler):
            # This method is used by Scrapy to create your spiders.
            s = cls()
            crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
            return s
    
        # 处理请求
        def process_request(self, request, spider):
            # Called for each request that goes through the downloader
            # middleware.
    
            # Must either:
            # - return None: continue processing this request 继续执行下一步操作,不处理默认返回None
            # - or return a Response object 直接返回响应, 如scrapy和pyppeteer不需要用下载器中间件访问外网,直接返回响应, pyppeteer有插件,一般和scrapy还能配合,selenium不行,没有插件
            # - or return a Request object 将请求返回到schdular的调度队列中供以后重新访问
            # - or raise IgnoreRequest: process_exception() methods of
            #   installed downloader middleware will be called
            return None
    
        # 处理响应
        def process_response(self, request, response, spider):
            # Called with the response returned from the downloader.
    
            # Must either;
            # - return a Response object 返回响应结果
            # - return a Request object 结果不对(判断结果对不对一般判断状态码和内容大小)一般返回request,也是将请求返回到schdular的调度队列中供以后重新访问
            # - or raise IgnoreRequest
            return response
    
        # 处理异常:如超时错误等
        def process_exception(self, request, exception, spider):
            # Called when a download handler or a process_request()
            # (from other downloader middleware) raises an exception.
    
            # Must either:
            # - return None: continue processing this exception 继续执行下一步,没有异常
            # - return a Response object: stops process_exception() chain 如果其返回一个 Response 对象,则已安装的中间件链的 process_response() 方法被调用。Scrapy将不会调用任何其他中间件的 process_exception() 方法。
            # - return a Request object: stops process_exception() chain 将请求返回到schdular的调度队列中供以后重新访问
            pass
    
        def spider_opened(self, spider):
            spider.logger.info("Spider opened: %s" % spider.name)
    
  • DownloaderMiddleware中抛弃请求写法

    • 适用场景:请求异常,换代理或者换cookie等操作
    # from scrapy.exceptions import IgnoreRequest
    # raise IgnoreRequest(f'Failed to retrieve {request.url} after {max_retries} retries')
    

    例子:处理下载异常并重试请求

    import logging
    from scrapy.exceptions import IgnoreRequest
    
    class RetryExceptionMiddleware:
        def __init__(self):
            self.logger = logging.getLogger(__name__)
    
        def process_exception(self, request, exception, spider):
            # 记录异常信息
            self.logger.warning(f'Exception {exception} occurred while processing {request.url}')
            
            # 检查是否达到重试次数限制
            max_retries = 3
            retries = request.meta.get('retry_times', 0) + 1
            
            if retries <= max_retries:
                self.logger.info(f'Retrying {request.url} (retry {retries}/{max_retries})')
                # 增加重试次数
                request.meta['retry_times'] = retries
                return request
            else:
                self.logger.error(f'Failed to retrieve {request.url} after {max_retries} retries')
                raise IgnoreRequest(f'Failed to retrieve {request.url} after {max_retries} retries')
    
    

    例子:切换代理

    import random
    
    class SwitchProxyMiddleware:
        def __init__(self, proxy_list):
            self.proxy_list = proxy_list
            self.logger = logging.getLogger(__name__)
    
        @classmethod
        def from_crawler(cls, crawler):
            proxy_list = crawler.settings.get('PROXY_LIST')
            return cls(proxy_list)
    
        def process_exception(self, request, exception, spider):
            self.logger.warning(f'Exception {exception} occurred while processing {request.url}')
            
            # 切换代理
            proxy = random.choice(self.proxy_list)
            self.logger.info(f'Switching proxy to {proxy}')
            request.meta['proxy'] = proxy
            
            # 重试请求
            return request
    
    
  • piplines中抛弃item写法

    • 适用场景:数据清洗、去重、验证等操作
    # from scrapy.exceptions import DropItem
    # raise DropItem("Duplicate item found: %s" % item)
    
  • 保存到文件(通过命令)

    from scrapy.cmdline import execute
    execute(['scrapy', 'crawl', 'centoschina_cn', '-o', 'questions.csv'])
    

更多精致内容:

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

鸿蒙(API 12 Beta2版)媒体开发【使用OHAudio开发音频播放功能(C/C++)】

OHAudio是系统在API version 10中引入的一套C API&#xff0c;此API在设计上实现归一&#xff0c;同时支持普通音频通路和低时延通路。仅支持PCM格式&#xff0c;适用于依赖Native层实现音频输出功能的场景。 使用入门 开发者要使用OHAudio提供的播放或者录制能力&#xff0c…

根据 IP 地址配置子网示例(下挂 hub 接不同 vlan 终端)

我们一般根据端口配置子网比较简单&#xff0c;但是如果换接口&#xff0c;就又要到交换机上重新配置端口所属 vlan 了&#xff0c;紧急情况下&#xff0c;还是比较耽误时间的。但如果根据IP地址配置 vlan&#xff0c;则可以插在交换机上任意端口&#xff0c;排障时比较节省时间…

部分PC制造商不会帮助英特尔第13/14代酷睿延保 对用户来说可能是个问题

早前英特尔已经宣布大部分第 13/14 代酷睿桌面处理器将可以获得延长保修服务&#xff0c;即后续使用出现非人为损坏的问题后&#xff0c;用户都可以联系英特尔换一颗新处理器。然而英特尔承担责任不代表对用户来说就高枕无忧&#xff0c;例如只有盒装版处理器才能直接联系英特尔…

MySQL数据库分区

文章目录 1. 分区的基本概念2. 分区的类型3. 在 MySQL 中实现分区3.1 创建分区表3.2 插入数据3.3 查询数据3.4 修改分区3.5 查看分区信息 4. 具体示例4.1 范围分区 (Range Partitioning)4.2 列表分区 (List Partitioning)4.3 哈希分区 (Hash Partitioning)4.4 键分区 (Key Part…

Win32注册表操作

注册表的概念 注册表是一个存储计算机配置信息的数据库&#xff0c;用于存储计算机上的硬件、安装的软件、系统设置以及用户账户配置等重要信息。对注册表的编辑不当可能会影响计算机的正常运行。应用程序可以调用API函数来对注册表进行增、删等操作。 注册表结构 运行Regedi…

【Redis 进阶】Redis 典型应用 —— 分布式锁

一、什么是分布式锁 在一个分布式的系统中&#xff0c;也会涉及到多个节点访问同一个公共资源的情况&#xff0c;此时就需要通过锁来做互斥控制, 避免出现类似于 “线程安全” 的问题。 而 Java 的 synchronized 或者 C 的 std::mutex&#xff0c;这样的锁都是只能在当前进程…

Embedding技术之Word Embedding

Word Embedding是什么&#xff1f; Word Embedding——词嵌入是将单词映射为数值向量&#xff0c;以捕捉单词间的语义和句法关系&#xff0c;为自然语言处理任务提供有效的特征表示。——自然语言处理——Word2Vec、GloVe、FastText。 Word Embedding属于静态向量&#xff0c…

深度学习入门(四):激活函数与LSTM

激活函数 激活函数在神经网络中扮演着至关重要的角色。它们的主要功能是引入非线性因素&#xff0c;这使得神经网络能够学习和近似任何非线性函数&#xff0c;从而处理复杂的数据模式和决策边界。如果没有激活函数&#xff0c;即使网络拥有很多层&#xff0c;其表达能力仍然只…

青岛国真携手图扑软件共建青岛西海岸区一网统管平台

为深入贯彻关于垃圾分类的重要指示精神&#xff0c;积极响应住房和城乡建设部开展的全国城市生活垃圾分类宣传周活动&#xff0c;5 月 25 - 27 日&#xff0c;以“发挥行业协会新动能 助力垃圾分类新时尚”为主题的“ 2023 垃圾分类高峰论坛”在青岛西海岸成功举办。 青岛国真智…

使用影子凭证进行域权限维持

本文来源无问社区&#xff0c;更对实战内容&#xff0c;渗透思路可前往查看http://wwlib.cn/index.php/artread/artid/15293.html Microsoft 推出了 Windows Hello 企业版 &#xff08;WHfB&#xff09;&#xff0c;以使用基于密钥的信任模型替换传统的基于密码的身份验证。此…

【Material-UI】按钮组:尺寸与颜色详解

文章目录 一、按钮组概述1. 组件介绍2. 基本用法 二、按钮组的尺寸&#xff08;Sizes&#xff09;1. 小尺寸&#xff08;Small&#xff09;2. 中等尺寸&#xff08;Medium&#xff09;3. 大尺寸&#xff08;Large&#xff09; 三、按钮组的颜色&#xff08;Colors&#xff09;1…

gitea docker 快捷安装部署

前言 在前一篇博文&#xff08;什么是 Gitea&#xff1f;&#xff09;中&#xff0c;我们详细介绍了gitea的功能特性&#xff0c;以及其与其它git服务器之间的特性多维度对比。 在本文中&#xff0c;我们将详细介绍gitea的快捷安装部署&#xff0c;docker方式&#xff01; 1…

qt客户端与服务端通信

服务器要一处于监听状态 客户端主动连接服务器 服务器的ui界面 客户端的ui界面 很简陋 服务端listen 按钮的槽函数 QHostAddress::Any,port 监听任何端口 void MainWindow::on_listen_clicked() {if(ui->lineEdit->text().isEmpty()){return ;}int port ui->li…

【第九节】python中xml解析和json编解码

目录 一、Python XML 解析 1.1 什么是XML 1.2 Python 对 XML 的解析方法 1.3 SAX解析xml 1.4 xml.dom解析xml 1.6 ElementTree解析XML 二、Python编解码json 2.1 什么是json 2.2 使用json 库 2.3 使用第三方库Demjson 一、Python XML 解析 1.1 什么是XML XML&#x…

Python新手错误集锦(PyCharm)

# 自学Python&#xff0c;用Pycharm作环境。我这个手新到这时我学习的第一个编程软件&#xff0c;且本人专业是化学&#xff0c;以前对电脑最高级的使用是玩扫雷游戏。所以这里集合的错误都是小透明错误&#xff0c;大部分人请绕道。不断更新中...... 缩进错误 记住“indent”…

Jmeter之BeanShell使用(全网最详细的介绍)-第九天

一.什么是BeanShell Java写成的⼩型、免费的Java源代码解释器可以执⾏标准Java语句和表达式,完全符合java语法的java脚本语⾔&#xff08;需要会javase语⾔&#xff09;包括⼀些脚本命令&#xff0c;有⾃⼰的⼀些语法和⽅法&#xff0c;是⼀种松散类型的脚本语⾔&#xff08;这…

静电消除器的产品功能介绍

省维护&#xff1a;超高等级 冲击波可引起空间隔断&#xff0c;从而将外部空气的进入降至最低。与以往的针尖保护构造相比&#xff0c;通过形成绝对的空气屏障&#xff0c;实现了低流量且惊人的省维护性能。 大范围消除静电 配备了 Hi-Power I.C.C. 系统&#xff0c;除了可根据…

普通话水平测试证书真的有用吗?

对于部分考生而言报名普通话水平测试只是随大流&#xff0c;看周围同学都考了&#xff0c;自己也来报名。还有一些呢是看到博主总结哪些证好考有用&#xff0c;先拿下再说但是并不知道具体有什么用。那么&#xff0c;普通话水平测试证书&#xff0c;究竟能为我们带来什么呢&…

MyBatis Generator 代码生成器数据库表新增字段,不覆盖原文件

1.数据库窜库&#xff0c;配置了覆盖插件他会找其他库中同名的表 修改数据库链接 添加 &amp;nullCatalogMeansCurrenttrue <!-- 配置数据源&#xff0c;需要根据自己的项目修改 --><jdbcConnection driverClass"com.mysql.cj.jdbc.Driver"connect…

钡铼技术防水分线盒M12双通道4路DIN智能建筑自动化

钡铼技术的DB系列4路M12双通道预铸线缆分线盒是专为智能建筑自动化和工业自动化设备设计的先进解决方案。其工业级设计和耐酸碱腐蚀材料壳体&#xff0c;使其能够在恶劣环境下稳定运行&#xff0c;并且具备IP67和IP69K防护等级&#xff0c;保证了在高压高温水流清洗条件下的可靠…