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

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

时间:2024-08-08 17:18:20浏览次数:8  
标签:exception return self request 爬虫 spider Scrapy proxy CentosChina

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

更多精致内容:

标签:exception,return,self,request,爬虫,spider,Scrapy,proxy,CentosChina
From: https://www.cnblogs.com/CodeRealm/p/18349334

相关文章

  • "阳光高考爬虫项目揭秘:增量爬虫与断点续抓的Python实战"
    阳光高考项目项目要求爬取各大高校基本信息和招生简章(招生简章要求存储为pdf格式并且入库)数据库表设计idtask_urlstatus:0(未抓取),1(抓取中),2(抓取完毕),3(错误),4(更新中),5(数据更新成功),6(数据未更新,保持原样),9(暂无),8(暂无)3:错误,是因为此div下根本没p标签,所以根本等不到......
  • ecosia 搜索引擎爬虫
    因为他有cloudflare五秒盾所以需要先破五秒盾网上找的资料已验证可用 然后替换代码里的url_baseDocker运行一个容器就可以了。启动命令为:dockerrun-d\--name=flaresolverr\-p8191:8191\-eLOG_LEVEL=info\--restartunless-stopped\ghcr.io/flareso......
  • Python爬虫实战:实时微信推送奥运奖牌榜信息
    最近奥运会正在巴黎如火如荼地进行。为了能第一时间获得我国运动健儿的获奖情况,我给大家分享一个python爬虫项目——实时微信推送奥运奖牌榜信息。爬虫每隔5分钟抓取一次奥林匹克官网奖牌榜数据,对比上次抓取的数据,如果奖牌数量或者排名有变化,就将新的获奖信息推送到......
  • Python爬虫案例与实战:爬取源代码练习评测结果
    Python爬虫案例与实战:爬取源代码练习评测结果本章案例将介绍用Python编写程序实现简单网站的模拟登录,然后保持登录后的网页会话,并在会话中模拟网页表单提交,之后使用Requests库的高级特性爬取提交之后的返回结果。在HTTP网页中,如登录、提交和上传等操作一般通过向网页发送......
  • Python爬虫案例与实战:爬取豆瓣电影简介
    Python爬虫案例与实战:爬取豆瓣电影简介本章案例将介绍如何爬取豆瓣电影简介,以此帮助读者学习如何通过编写爬虫程序来批量地从互联网中获取信息。本案例中将借助两个第三方库----Requests库和BeautifulSoup库。通过Requests库获取相关的网页信息,通过BeautifulSoup库解析大......
  • 爬虫中XPath的应用与元素定位
    在爬虫开发中,XPath是一种强大的语言,用于在XML和HTML文档中查找信息。它允许开发者通过定义路径表达式来选取文档中的节点或节点集。在网页爬虫中,XPath常用于精确定位和提取页面上的数据。本文将详细介绍XPath的基础语法、常见用法以及如何在爬虫中利用XPath获取页面元素。......
  • python爬虫预备知识三-多进程
    python实现多进程的方法:fork、multiprocessing模块创建多进程。os.fork方法os.fork方法只适合于unix/linux系统,不支持windows系统。fork方法调用一次会返回两次,原因在于操作系统将当前进程(父进程)复制出一份进程(子进程),这两个进程几乎完全相同,fork方法分别在父进程和子进程中......
  • 爬虫简易说明
    想必大家都了解爬虫,也就是爬取网页你所需要的信息相比于网页繁多的爬虫教程,本篇主要将爬虫分为三个部分,以便你清楚,代码的功能以及使用,这三部分分别为1.获取到源代码2.根据网页中的标签特征,获取源代码你所需要的部分3.想一下如何根据页面的逻辑将一系列的网页自动化抓取接下来......
  • 爬虫系统稳定性的监控方案
    在爬虫系统的开发和运营过程中,保持其稳定性至关重要。随着数据量和任务复杂度的增加,爬虫系统面临着各种挑战,如网络波动、目标网站结构变化、数据存储压力等。因此,建立一个全面的监控体系,及时发现和处理问题,是保证爬虫系统稳定运行的关键。本文将分析和总结如何通过多种监控手段......
  • 爬虫“拥抱大模型”,有没有搞头?
    前言大模型是当前最热门的研究方向之一,千行百业加速“拥抱大模型”。如今,越来越多的研究机构和企业选择开放大模型的源代码和训练数据,促进了学术界和工业界的合作与交流,推动了技术进步,相关生态越来越好。这也使得,无论体量大小,各公司都有参与的机会,越来越多的大模型开始支持多模......