您当前的位置 :三板富> 科技 > 正文
20行Python scrapy 代码,去采集「蓝桥」训练营
2022-02-19 21:16:01 来源:程序那点事官方百家号 编辑:news2020

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

settings 的 4 个级别

优先级最高 - 命令行,例如 scrapy crawl my_spider -s LOG_LEVEL=WARNINI

优先级第二 - 爬虫文件自己的设置,例如在 xxx.py文件中设置 custom_settings

优先级第三 - 项目模块,这里指的是 settings.py文件中的配置;

优先级第四 - default_settings属性配置;

优先级第五 - 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 配置的一些技巧

通用配置写在项目的 settings.py文件中;

爬虫个性化设置写在 custom_settings变量内;

不同进行的爬虫,配置要初始化在命令行内。

本篇博客的爬虫案例

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

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参数,这也是接口中常用的一个参数,其值代表接口返回哪些字段(包含哪些属性),如下图所示。 接下来就使用 scrapy 将其实现,并把结果保存到 json 文件中。

lanqiao.py 文件代码

import jsonimport scrapyfrom lq.items import LqItemclass 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 scrapyclass 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 = FalseCONCURRENT_REQUESTS = 16DOWNLOAD_DELAY = 3

爬虫运行结果:

累计爬取到 **600+**课程信息。

作者:梦想橡皮擦链接:https://juejin.cn/post/7066249132628770824

标签: scrapy Python

相关阅读
版权和免责申明

凡注有"三板富 | 专注于新三板的第一垂直服务平台"或电头为"三板富 | 专注于新三板的第一垂直服务平台"的稿件,均为三板富 | 专注于新三板的第一垂直服务平台独家版权所有,未经许可不得转载或镜像;授权转载必须注明来源为"三板富 | 专注于新三板的第一垂直服务平台",并保留"三板富 | 专注于新三板的第一垂直服务平台"的电头。

最新热点

精彩推送

 

Copyright © 1999-2020 www.3bf.cc All Rights Reserved 
三板富投资网  版权所有 沪ICP备2020036824号-16联系邮箱:562 66 29@qq.com