首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年08月08日 16:10

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'])
    

更多精致内容:

From:https://www.cnblogs.com/CodeRealm/p/18349334
本文地址: http://shuzixingkong.net/article/919
0评论
提交 加载更多评论
其他文章 机器学习的数学基础--向量,矩阵
机器学习与传统编程的一个重要区别在于机器学习比传统编程涉及了更多的数学知识。不过,随着机器学习的飞速发展,各种框架应运而生,在数据分析等应用中使用机器学习时,使用现成的库和框架成为常态,似乎越来越不需要数学知识了。 其实,现成的库和框架只是帮助我们简化机器学习的开发任务,如果想要对模型训练结果进行调
机器学习的数学基础--向量,矩阵 机器学习的数学基础--向量,矩阵 机器学习的数学基础--向量,矩阵
数据结构 分块 & 莫队
分块 一种优化暴力的思想。 通常是将原数据划分成适当块(一般为 \(\sqrt{n}\)),对每块数据进行预处理,进而达到比暴力更优的时间复杂度。 划分 确定块长后,一般需要开两个数组存储每一块的右边界与原数据所属块序号,更加方便后续操作。 int sq=sqrt(n); for(int i=1;i
数据结构 分块 & 莫队
Kotlin 循环与函数详解:高效编程指南
Kotlin中的循环结构让你能轻松遍历数组或范围内的元素。使用`for`循环结合`in`操作符,可以简洁地访问数组中的每个项,如字符串数组或整数数组。对于范围,可以用`..`来定义一系列连续的值并进行迭代。此外,Kotlin支持通过`break`和`continue`控制循环流程。函数则允许封装可复
在 React 项目中 Editable Table 的实现
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。 本文作者:佳岚 可编辑表格在数栈产品中是一种比较常见的表单数据交互方式,一般都支持动态的新增、删除、排序等基础功能。 交互分类 可编辑表格一般为两种交互形式: 实时保存
在 React 项目中 Editable Table 的实现 在 React 项目中 Editable Table 的实现 在 React 项目中 Editable Table 的实现
基于SiliconCloud快速体验GraphRag.Net
SiliconCloud介绍 SiliconCloud 基于优秀的开源基础模型,提供高性价比的 GenAI 服务。 不同于多数大模型云服务平台只提供自家大模型 API,SiliconCloud上架了包括 Qwen、DeepSeek、GLM、Yi、Mistral、LLaMA 3、SDXL、Instan
基于SiliconCloud快速体验GraphRag.Net 基于SiliconCloud快速体验GraphRag.Net 基于SiliconCloud快速体验GraphRag.Net
git的快速入门(含常用指令)
目录概念什么是gitgit与GitHub有什么区别提交、仓库、分支git的使用从GitHub上下载别人的代码直接将代码下载到本地克隆仓库获取代码将自己的代码上传到GitHub 本文拟将用通俗的语言描述git的使用方法,如有出入,请批评指正 概念 什么是git Git可以想象成一个超级高效的&quot
git的快速入门(含常用指令) git的快速入门(含常用指令) git的快速入门(含常用指令)
在一串字符串中Java使用正则匹配电话号码的方法
本文简要介绍了Java中正则表达式匹配电话号码的方法,本文通过导入必要的Pattern和Matcher类,然后定义了一个测试字符串和一个正则表达式;接着,本文使用Pattern.compile()方法编译正则表达式,并使用matcher()方法创建Matcher对象;最后,使用find()方法查找匹
【Playwright+Python】系列教程(八)鉴权Authentication的使用
写在前面 还是有些絮叨的感觉,官方翻译和某些博主写那个玩楞,基本都是软件直接翻译后的产物。 读起来生硬不说,甚至有的时候不到是什么意思,真的是实在不敢恭维。 到底是什么意思? 就是你已经登陆过一次,在Session、Cookie未失效的情况下,登录过一次后,下次就不用再走一遍登录的过程,从而缩短了脚
【Playwright+Python】系列教程(八)鉴权Authentication的使用 【Playwright+Python】系列教程(八)鉴权Authentication的使用