自学内容网 自学内容网

python Scrapy 框架 demo

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


python Scrapy 框架 demo

1. 安装

安装 Scrapy
首先,确保你已经安装了 Scrapy,可以使用 pip 进行安装:

pip install scrapy

在这里插入图片描述
验证 Scrapy 是否安装成功
成功安装 Scrapy 后,运行以下命令验证:

scrapy version

在这里插入图片描述

2. 百度热搜爬取demo

2.1. 初始化项目

首先,启动一个 Scrapy 项目:
scrapy startproject baidu_hots
在这里插入图片描述
初始后的项目结构:
在这里插入图片描述
结构说明:

baidu_hots/                  ----外层目录
    ├── baidu_hots/          ----Scrapy框架的用户自定义python代码
    │   ├── __init__.py
    │   ├── items.py         ----Items代码模板(继承类)
    |   ├── middlewares.py   ----Middlewares代码模板(继承类)(扩展功能)
    │   ├── pipelines.py     ----代码模版(继承类)
    │   ├── settings.py      ----scrapy爬虫的配置文件
    │   └── spiders/         ----代码模板(继承类)
    │       ├── __init__.py
    ├── scrapy.cfg           ----部署scrapy爬虫的配置文件

2.2. 修改 items.pyitems.py

用于定义我们将爬取的数据结构:

import scrapy


"""
用于定义我们将爬取的数据结构:
"""
class BaiduHotsItem(scrapy.Item):
    rank = scrapy.Field()
    title = scrapy.Field()
2.3. 创建 spiders/baidu_spider.py

在 spiders/ 目录下创建一个爬虫文件 baidu_spider.py

import scrapy
from baidu_hots.items import BaiduHotsItem
import pdb  # 导入调试库


from scrapy.spidermiddlewares.httperror import HttpError




class BaiduSpider(scrapy.Spider):
    name = 'baidu_hots'
    allowed_domains = ['top.baidu.com']
    start_urls = ['https://top.baidu.com/board?platform=pc&sa=pcindex_entry']


    def parse(self, response):
        hot_search_items = response.css('div.active-item_1Em2h')
        for item in hot_search_items:
            rank = item.css('div.sign-index_mtI7K::text').get()
            title = item.css('div.c-single-text-ellipsis::text').get()
            # pdb.set_trace()  # 设置断点
            if rank is None or rank.strip() == "":
                continue
            if rank and title:
                baidu_item = BaiduHotsItem()
                baidu_item['rank'] = rank.strip()
                baidu_item['title'] = title.strip()


                yield baidu_item


    def errback_httpbin(self, failure):
        # 错误时进入此处
        self.logger.error(repr(failure))


        # 可以通过 failure 检查异常类型
        if failure.check(HttpError):
            response = failure.value.response
            self.logger.error(f'HttpError on {response.url}')
2.4. 修改 pipelines.py

pipelines.py 文件可以用来处理抓取到的数据(例如,保存到数据库或文件):

class BaiduHotsPipeline:


    def process_item(self, item, spider):
        print(f"【{item['rank']}{item['title']}")
        return item
2.5. 修改 settings.py
BOT_NAME = "baidu_hots"
SPIDER_MODULES = ["baidu_hots.spiders"]
NEWSPIDER_MODULE = "baidu_hots.spiders"
ROBOTSTXT_OBEY = True

ITEM_PIPELINES = {
    "baidu_hots.pipelines.BaiduHotsPipeline": 300,
}

REQUEST_FINGERPRINTER_IMPLEMENTATION = "2.7"
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
FEED_EXPORT_ENCODING = "utf-8"
LOG_ENABLED = True
LOG_LEVEL = 'INFO'  # 可以改为 DEBUG 来查看详细的调试信息
LOG_FILE = 'scrapy_log.txt'

3. settings.py 相关配置说明

项目和模块相关配置
BOT_NAME = “baidu_hots”: 定义你的 Scrapy 项目的名称。在 Scrapy 中,项目名通常被用于标识爬虫和某些自动生成的路径。
SPIDER_MODULES = [“baidu_hots.spiders”]: 告诉 Scrapy 爬虫(spider)模块存放的路径,通常会在项目的 spiders 文件夹中。
NEWSPIDER_MODULE = “baidu_hots.spiders”: 创建新的爬虫时,Scrapy 会自动将爬虫生成在这个模块下。

请求和响应相关配置

ROBOTSTXT_OBEY = True: 是否遵守 robots.txt 文件。robots.txt 是网站管理员用于指示爬虫哪些内容是允许爬取的,设置为 True 则遵守这些规则。

CONCURRENT_REQUESTS = 16: 同时处理的最大请求数量,默认值是 16。如果需要更多并发请求,可以调高此值。

DOWNLOAD_DELAY = 3: 设置每个请求之间的延迟(以秒为单位),避免对目标站点造成压力。默认没有延迟,可以根据需要调整。

CONCURRENT_REQUESTS_PER_DOMAIN = 16 和 CONCURRENT_REQUESTS_PER_IP = 16: 分别指定对每个域名或每个 IP 的最大并发请求数。如果需要爬取大量内容,可以增加这个值。

Cookies 和调试相关配置

COOKIES_ENABLED = False: 是否启用 Cookies。默认是启用的。如果不需要 Cookies,可以设置为 False 以禁用。

TELNETCONSOLE_ENABLED = False: 是否启用 Telnet 控制台。默认是启用的,但大多数项目中不需要这个功能,设置为 False 关闭。

请求头相关配置

DEFAULT_REQUEST_HEADERS: 设置默认的请求头,这里通常会设置 User-Agent 和 Accept-Language。这个配置项被注释掉了,说明它使用默认请求头。如果需要自定义,可以启用并设置。

爬虫和下载中间件配置

SPIDER_MIDDLEWARES 和 DOWNLOADER_MIDDLEWARES: 用于启用或禁用特定的爬虫或下载中间件。中间件是拦截和处理请求与响应的特殊组件。你可以通过修改这些项来添加、删除或修改中间件。

Item 管道相关配置

ITEM_PIPELINES = {“baidu_hots.pipelines.BaiduHotsPipeline”: 300}: 用于配置 Item 管道。这里启用了 BaiduHotsPipeline 管道,并且优先级为 300。Scrapy 中多个管道可以有不同的优先级,数值越低优先级越高。

自动限速(AutoThrottle)配置

AUTOTHROTTLE_ENABLED = True: 是否启用自动限速功能。这个功能可以自动根据服务器的响应速度调整爬取速度,避免对服务器造成过大压力。

AUTOTHROTTLE_START_DELAY = 5: 初始的下载延迟时间。开启 AutoThrottle 后,Scrapy 会在每次请求间隔时动态调整这个值。

AUTOTHROTTLE_MAX_DELAY = 60: 最大下载延迟时间。如果服务器响应非常慢,延迟可以增加到这个值。

AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0: 设置 Scrapy 试图在目标服务器上保持的并发请求数。

HTTP 缓存相关配置

HTTPCACHE_ENABLED = True: 是否启用 HTTP 缓存。启用后,Scrapy 会缓存请求的响应数据,以便在多次运行时重用,减少对目标服务器的请求。

HTTPCACHE_EXPIRATION_SECS = 0: 缓存的过期时间,以秒为单位。0 表示不会过期。

HTTPCACHE_DIR = “httpcache”: 缓存存放的目录。

HTTPCACHE_IGNORE_HTTP_CODES = []: 指定哪些 HTTP 响应代码不应该被缓存,比如你可以忽略 404 错误。

HTTPCACHE_STORAGE = “scrapy.extensions.httpcache.FilesystemCacheStorage”: 指定缓存存储的方式。这里使用的是文件系统缓存。

日志相关配置

LOG_ENABLED = True: 是否启用日志。设置为 True 启用日志输出。

LOG_LEVEL = ‘INFO’: 日志级别。可以设置为 DEBUG、INFO、WARNING、ERROR、CRITICAL。你目前设置为 INFO,如果需要更多调试信息,可以设置为 DEBUG。

LOG_FILE = ‘scrapy_log.txt’: 指定日志文件的路径。如果不指定,日志会输出到控制台。这里将日志输出到 scrapy_log.txt 文件。

其他配置

REQUEST_FINGERPRINTER_IMPLEMENTATION = “2.7”: 使用最新的请求指纹算法(自 Scrapy 2.7 开始提供)。这个算法用于为每个请求生成唯一的指纹以避免重复爬取。

TWISTED_REACTOR = “twisted.internet.asyncioreactor.AsyncioSelectorReactor”: 使用 AsyncioSelectorReactor 作为 Scrapy 的事件循环机制,提供异步支持。

FEED_EXPORT_ENCODING = “utf-8”: 输出的文件编码设置为 utf-8。

4. 启动爬虫测试

scrapy crawl <spider_name>

其中<spider_name> 是你在爬虫文件中定义的爬虫名称,通常在爬虫类中通过 name 属性指定。

在这里插入图片描述


原文地址:https://blog.csdn.net/weixin_38316697/article/details/142637326

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!