Centoschina

项目要求

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

数据库表设计

库表设计:

数据展示:

项目亮点

  • 低耦合,高内聚。

    爬虫专有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'])

更多精致内容:

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

  1. 第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令

    第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令 Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --u ...

  2. 关于Scrapy爬虫项目运行和调试的小技巧(下篇)

    前几天给大家分享了关于Scrapy爬虫项目运行和调试的小技巧上篇,没来得及上车的小伙伴可以戳超链接看一下.今天小编继续沿着上篇的思路往下延伸,给大家分享更为实用的Scrapy项目调试技巧. 三.设置网 ...

  3. 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码

    第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...

  4. 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...

  5. 第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies

    第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于star ...

  6. 第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用

    第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用 xpath表达式 //x 表示向下查找n层指定标签,如://div 表示查找所有div标签 /x 表示向下查找一层指定的标签 ...

  7. Python爬虫进阶之Scrapy框架安装配置

    Python爬虫进阶之Scrapy框架安装配置 初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此 ...

  8. python爬虫入门(六) Scrapy框架之原理介绍

    Scrapy框架 Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬 ...

  9. 爬虫基础(五)-----scrapy框架简介

    ---------------------------------------------------摆脱穷人思维 <五> :拓展自己的视野,适当做一些眼前''无用''的事情,防止进入只关 ...

  10. 爬虫(二)之scrapy框架

    01-scrapy介绍 02-项目的目录结构: scrapy.cfg 项目的主配置信息.(真正爬虫相关的配置信息在settings.py 文件中) items.py 设置数据存储模板,用于结构化数据, ...

随机推荐

  1. 一文了解Spark引擎的优势及应用场景

    Spark引擎诞生的背景 Spark的发展历程可以追溯到2009年,由加州大学伯克利分校的AMPLab研究团队发起.成为Apache软件基金会的孵化项目后,于2012年发布了第一个稳定版本. 以下是S ...

  2. 图最短路径之Dijkstra

    Dijkstra's shortest path algorithm 算法参考地址:Dijsktra's algorithm (geeksforgeeks.org) 算法的简介: 1)该算法用来计算最 ...

  3. Linux 内核:设备驱动模型(5)平台设备驱动

    Linux 内核:设备驱动模型(5)平台设备驱动 背景 我们已经大概熟悉了Linux Device Driver Model:知道了流程大概是怎么样的,为了加深对LDDM框架的理解,我们继续来看pla ...

  4. 3.8折年终钜惠,RK3568J国产工业评估板

    3.8折年终钜惠,RK3568J国产工业评估板活动火热进行中,错过等一年! -核心板国产化率100%,提供报告-瑞芯微四核ARM Cortex-A55@1.8GHz-4K视频解码.1080P视频编码. ...

  5. Python 引用不确定的函数

    在Python中,引用不确定的函数通常意味着我们可能在运行时才知道要调用哪个函数,或者我们可能想根据某些条件动态地选择不同的函数来执行.这种灵活性在处理多种不同逻辑或根据不同输入参数执行不同操作的场景 ...

  6. python3求取大文件sha1值和md5

    小文件 import hashlib import base64 filePath = "test.txt" with open(filePath, "rb") ...

  7. 如何用python计算不定积分

    在Python中,计算不定积分(即原函数或反导数)可以通过SymPy库实现.SymPy是一个用于符号数学的Python库,支持许多类型的数学对象,包括整数.有理数.实数.复数.函数.极限.积分.微分. ...

  8. vulnhub - BREACH: 1

    vulnhub - BREACH: 1 描述 作为多部分系列中的第一部分,Breach 1.0 旨在成为初学者到中级的 boot2root/CTF 挑战.解决将需要可靠的信息收集和持久性相结合.不遗余 ...

  9. CentOS7离线安装devtoolset-9并编译redis6.0.5

    首先参照https://www.cnblogs.com/wdw984/p/13330074.html,来进行如何安装Centos和离线下载rpm包. 离线下载jemalloc,上传到CentOS的/d ...

  10. 虚拟 DOM 实现原理?

    虚拟 DOM 的实现原理主要包括以下 3 部分: 用 JavaScript 对象模拟真实 DOM 树,对真实 DOM 进行抽象: diff 算法 - 比较两棵虚拟 DOM 树的差异: pach 算法 ...