美文网首页
20行Python scrapy 代码,去采集【蓝桥】训练营

20行Python scrapy 代码,去采集【蓝桥】训练营

作者: 梦想橡皮擦 | 来源:发表于2022-02-19 10:57 被阅读0次

    scrapy 中的 settings.py 文件在项目中是非常重要的,因其包含非常多的配置。
    这篇博客基于官方手册为你说明 settings.py 文件相关配置,并补充一些扩展说明。

    settings 的 4 个级别

    1. 优先级最高 - 命令行,例如 scrapy crawl my_spider -s LOG_LEVEL=WARNINI
    2. 优先级第二 - 爬虫文件自己的设置,例如在 xxx.py 文件中设置 custom_settings
    3. 优先级第三 - 项目模块,这里指的是 settings.py 文件中的配置;
    4. 优先级第四 - default_settings 属性配置;
    5. 优先级第五 - default_settings.py 文件中的配置。

    settings 配置的读取,一般使用 spider 中的 from_crawler 方法,在中间件,管道,扩展中都可以进行调用。

    settings 配置读取操作非常简单,上一篇博客已经有所涉及,命令格式如下所示:

    scrapy settings --get 配置变量名称
    

    settings 常用配置

    基本配置

    • BOT_NAME:爬虫名称;
    • SPIDER_MODULES:爬虫模块列表;
    • NEWSPIDER_MODULE:模块在哪里使用 genspider 命令创建新的爬虫;

    日志

    scrapy 日志与 logging 模块一致,使用 5 个级别:
    配置名为 LOG_LEVEL,最低的是 DEBUG(默认),INFO,WARNING,ERROR,CRITICAL(最高)。
    其余日志相关配置如下,

    • LOGSTATS_INTERVAL:设置日志频率,默认是 60 秒,可以修改为 5 秒,
    • LOG_FILE:日志文件;
    • LOG_ENABLED:是否启用日志,关闭了运行爬虫,就啥都不输出了;
    • LOG_ENCODING:编码;
    • LOG_FORMAT:日志格式,这个可以参考 logging 模块学习;
    • LOG_DATEFORMAT:同上,负责格式化日期/时间;

    统计

    • STATS_DUMP:默认开启,爬虫采集完毕,将爬虫运行信息统计并输出到日志;
    • DOWNLOADER_STATS:启用下载中间件统计;
    • DEPTH_STATSDEPTH_STATS_VERBOSE:统计深度相关设置;
    • STATSMAILER_RCPTS:爬虫采集完毕,发送邮箱列表。

    性能

    • CONCURRENT_REQUESTS:最大并发请求数,抓取不同网站时使用,该值默认是 16,如果一次请求耗时 0.2 秒,则并发极限是 16/0.2 = 80 次请求
    • CONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP:单个域或者单个 IP 的最大并发请求数;
    • CONCURRENT_ITEMS:每次请求并发处理的最大文件数,如果 CONCURRENT_REQUESTS=16CONCURRENT_ITEMS=100,则表示每秒有 1600 个文件会被写入数据库;
    • DOWNLOAD_TIMEOUT:下载器在超时前等待的时间量;
    • DOWNLOAD_DELAY:下载延迟,限制爬取速度,配合 RANDOMIZE_DOWNLOAD_DELAY 使用,会使用一个随机值 * DOWNLOAD_DELAY
    • CLOSESPIDER_TIMEOUTCLOSESPIDER_ITEMCOUNTCLOSESPIDER_PAGECOUNTCLOSESPIDER_ERRORCOUNT:四个配置比较类似,都是为了提前关闭爬虫,分别为时间,抓取 item 的数量,发出一定的请求数,发生一定的错误量。

    抓取相关

    • USER_AGENT:用户代理;
    • DEPTH_LIMIT:抓取的最大深度,在深度抓取时有用;
    • ROBOTSTXT_OBEY:是否遵守 robots.txt 约定;
    • COOKIES_ENABLED:是否禁用 cookie,禁用之后有时能提高采集速度;
    • DEFAULT_REQUEST_HEADERS:请求头;
    • IMAGES_STORE:使用 ImagePipeline 时图片的存储路径;
    • IMAGES_MIN_WIDTHIMAGES_MIN_HEIGHT:筛选图片;
    • IMAGES_THUMBS:设置缩略图;
    • FILES_STORE:文件存储路径;
    • FILES_URLS_FIELDFILES_RESULT_FIELD:使用 Files Pipeline 时的一些变量名配置;
    • URLLENGTH_LIMIT:允许抓取网站地址的最大长度。

    扩展功能

    • ITEM_PIPELINES:管道配置;
    • COMMANDS_MODULE:自定义命令;
    • DOWNLOADER_MIDDLEWARES:下载中间件;
    • SCHEDULER:调度器;
    • EXTENSIONS:扩展;
    • SPIDER_MIDDLEWARES:爬虫中间件;
    • RETRY_*:设置了 Retry 相关中间件配置;
    • REDIRECT_*:设置了 Redirect 相关中间件配置;
    • METAREFRESH_*:设置了 Meta-Refresh 中间件相关配置;
    • MEMUSAGE_*:设置了内存相关配置。

    settings 配置的一些技巧

    1. 通用配置写在项目的 settings.py 文件中;
    2. 爬虫个性化设置写在 custom_settings 变量内;
    3. 不同进行的爬虫,配置要初始化在命令行内。

    本篇博客的爬虫案例

    这一次的爬虫就采集蓝桥训练营的课程吧,页面经过测试得到的请求地址如下:

    https://www.lanqiao.cn/api/v2/courses/?page_size=20&page=2&include=html_url,name,description,students_count,fee_type,picture_url,id,label,online_type,purchase_seconds_info,level
    

    其中参数除了 page_sizepage 以外,还存在一个 include 参数,这也是接口中常用的一个参数,其值代表接口返回哪些字段(包含哪些属性),如下图所示。

    20行Python代码、爬虫、蓝桥训练营,一篇博客整合这几个关键词
    接下来就使用 scrapy 将其实现,并把结果保存到 json 文件中。

    lanqiao.py 文件代码

    import json
    import scrapy
    
    from lq.items import LqItem
    
    
    class LanqiaoSpider(scrapy.Spider):
        name = 'lanqiao'
        allowed_domains = ['lanqiao.cn']
    
        def start_requests(self):
            url_format = 'https://www.lanqiao.cn/api/v2/courses/?page_size=20&page={}&include=html_url,name,description,students_count,fee_type,picture_url,id,label,online_type,purchase_seconds_info,level'
            for page in range(1, 34):
                url = url_format.format(page)
                yield scrapy.Request(url=url, callback=self.parse)
    
        def parse(self, response):
            json_data = json.loads(response.text)
            for ret_item in json_data["results"]:
                item = LqItem(**ret_item)
                yield item
    

    代码中直接将 ret_item 赋值到了 LqItem 的构造函数中,实现对字段的赋值。

    items.py 文件代码

    该类主要对数据字段进行限制。

    import scrapy
    
    
    class LqItem(scrapy.Item):
    
        # define the fields for your item here like:
        # name = scrapy.Field()
        html_url = scrapy.Field()
        name = scrapy.Field()
        description = scrapy.Field()
        students_count = scrapy.Field()
        fee_type = scrapy.Field()
        picture_url = scrapy.Field()
        id = scrapy.Field()
        label = scrapy.Field()
        online_type = scrapy.Field()
        purchase_seconds_info = scrapy.Field()
        level = scrapy.Field()
    

    settings.py 开启部分配置

    BOT_NAME = 'lq'
    
    SPIDER_MODULES = ['lq.spiders']
    NEWSPIDER_MODULE = 'lq.spiders'
    
    USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36'
    
    ROBOTSTXT_OBEY = False
    CONCURRENT_REQUESTS = 16
    DOWNLOAD_DELAY = 3
    

    爬虫运行结果:

    20行Python代码、爬虫、蓝桥训练营,一篇博客整合这几个关键词
    累计爬取到 600+课程信息。
    20行Python代码、爬虫、蓝桥训练营,一篇博客整合这几个关键词

    写在后面

    今天是持续写作的第 <font color=red>254</font> / 365 天。
    期待 <font color=#04a9f4>关注</font>,<font color=#04a9f4>点赞</font>、<font color=#04a9f4>评论</font>、<font color=#04a9f4>收藏</font>。

    更多精彩

    《爬虫 100 例,专栏销售中,买完就能学会系列专栏》

    20行Python代码、爬虫、蓝桥训练营,一篇博客整合这几个关键词

    <center>
    ↓ ↓ ↓ ↓一对一指导你的疑问↓ ↓ ↓ ↓</center>
    <center>
    ↓↓↓扫码添加博主参加【78技术人社群】~Python分部↓↓↓</center>

    相关文章

      网友评论

          本文标题:20行Python scrapy 代码,去采集【蓝桥】训练营

          本文链接:https://www.haomeiwen.com/subject/skzulrtx.html