通过上一篇文章 Python爬虫实战-使用Scrapy框架爬取土巴兔(一)我们对Scrapy有了初步的认识,也准备好了开发环境。接下来我们进入正式的开发环节。
该篇文章主要讲Scrapy的工程创建与配置。
一.创建Scrapy工程
Scrapy提供Shell命令可以直接创建工程,例如项目名为tubatu,执行命令:
scrapy startproject tubatu
创建成功后在pycharm中打开工程,我们能够得到文件夹目录如下:
myproject/ tubatu/ -------该项目的python模块 spiders/ --------放置spider代码的目录(具体的爬取规则) __init__.py __init__.py items.py --------项目中的item文件(存放实体类) middlewares.py --------项目中的middlewares文件(中间件处理逻辑) pipelines.py --------项目中的pipelines文件(处理实体类的具体处理逻辑) settings.py --------项目的配置文件 scrapy.cfg --------项目的配置文件
二.Scrapy的基本配置
通过工程的目录文件列表,我们可以看到有名为"scrapy.cfg"、"settings.py"的文件都是关于项目的配scrapy.cfg
上面是scrapy.cfg文件中的全部内容,该文件定义了工程的具体配置路径和项目名称。我们不用做太多处理,因为实际上关于工程的配置基本都在settings.py这个文件中。
下面的代码是settings.py的全部内容:
# 首先将需要引用到的py文件导入到settings中from tubatu.config import USE_PROXY# Scrapy项目实现的bot的名字(也未项目名称)。 这将用来构造默认 User-Agent,同时也用来log。BOT_NAME = 'tubatu'# Scrapy搜索spider的模块列表。SPIDER_MODULES = ['tubatu.spiders']# 使用 genspider 命令创建新spider的模块。NEWSPIDER_MODULE = 'tubatu.spiders'# 如果启用,Scrapy将会尊重 robots.txt策略。# 开启后RobotsTxtMiddleware中间件过滤所有robots.txt eclusion standard中禁止的request。# 确认该中间件及 ROBOTSTXT_OBEY 设置被启用以确保Scrapy尊重robots.txt。ROBOTSTXT_OBEY = False# Scrapy downloader 并发请求(concurrent requests)的最大值。CONCURRENT_REQUESTS = 12# Twisted模块中Reactor最大线程池数量。REACTOR_THREADPOOL_MAXSIZE = 8# 下载器在下载同一个网站下一个页面前需要等待的时间。该选项可以用来限制爬取速度, 减轻服务器压力。同时也支持小数:DOWNLOAD_DELAY = 0# 如果启用,Scrapy将记录所有在request(Cookie 请求头)发送的cookies及response接收到的cookies(Set-Cookie 接收头)。COOKIES_ENABLED = False# 要激活下载器中间件组件,将其加入到 DOWNLOADER_MIDDLEWARES 设置中。# 该设置是一个字典(dict),键为中间件类的路径,值为其中间件的顺序(order)。DOWNLOADER_MIDDLEWARES = { 'msic.scrapy.middlewares.CustomUserAgentMiddleware': 2,#自定义的http请求中添加请求头的中间件 'tubatu.middlewares.RedirectionMiddleware': 998,#自定义的重定向的中间件}#CustomHttpProxyMiddleware自定义的http代理中间件#CatchExceptionMiddleware自定义的异常捕获中间件if USE_PROXY: DOWNLOADER_MIDDLEWARES['msic.scrapy.middlewares.CustomHttpProxyMiddleware'] = 1 DOWNLOADER_MIDDLEWARES['msic.scrapy.middlewares.CatchExceptionMiddleware'] = 999# 保存项目中启用的pipeline及其顺序的字典。该字典默认为空,值(value)任意。不过值(value)习惯设定在0-1000范围内。# 注释ITEM_PIPELINES中的内容是因为在Spider中定义了单独每个Spider处理数据需要用的item pipelines,而不是共用一个。# 如果你的item pipelines是Spider可以共用的则可以定义在settings.py中# 举个例子,假如有两个Spider,Spider A在进行数据处理时只想执行的是pipeline A中的方法,Spider B只想执行的是pipeline B中的方法。# 如果在settings.py中定义了的话,pipeline A或者B都会被执行到。这样不是我们想要的结果。# 所以可以在spider中单独定义。可以看第四篇文章的第三节“爬取规则”中的代码。# 代码片段是:# custom_settings = {# 'ITEM_PIPELINES': {# 'tubatu.pipelines.DesignPicturePipeline': 302,# }# }ITEM_PIPELINES = { # 'tubatu.pipelines.DesignPicturePipeline': 302}# 部分网站提供了原本只有ajax获取到的数据的纯HTML版本。 网站通过两种方法声明:# 在url中使用 #! - 这是默认的方式;# 使用特殊的meta标签 - 这在”main”, “index” 页面中使用。# 该配置开启时能够爬取经常抓取大量的 “index” 页面# 由于有些性能问题,且对于特定爬虫没有什么意义,所以默认关闭。AJAXCRAWL_ENABLED = False# 是否启用logging。LOG_ENABLED = True# log打印格式LOG_FORMAT = '%(asctime)s,%(msecs)d [%(name)s] %(levelname)s: %(message)s'
本文用到的配置只是scrapy所有配置中的部分,更多配置的相关参数可以参考官方文档。
三.项目自定义配置
细心的同学会发现文中使用了另一个关于配置的python文件——config.py。
这个文件主要是为了存放自定义的配置。例如:数据库的配置、Redis的配置、以及其他一些控制变量。
下面是config.py的全部内容:
import loggingimport redisfrom requests.packages.urllib3.connectionpool import log as requests_logfrom msic.core.service import mongodb_service#设置requests日志等级requests_log.setLevel(logging.WARNING)# RedisREDIS_HOST = '127.0.0.1'REDIS_PORT = 6379REDIS_DATABASE_NAME = 0redis_client = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DATABASE_NAME)# MongoDBMONGODB_HOST = "127.0.0.1"MONGODB_PORT = 27017mongodb_client = mongodb_service.get_client(MONGODB_HOST, MONGODB_PORT) DATABASE_NAME = "tubatu"mongodb = mongodb_service.get_db(mongodb_client, DATABASE_NAME)# 图片保存路径IMAGES_STORE = 'C:/scrapy'# 是否使用代理USE_PROXY = False
当然也可以将配置的内容写在文件中,通过读取文件的方式读取配置信息。
最后
工程的创建和配置都完成了,接下来我们开始编写中间件Python爬虫实战-使用Scrapy框架爬取土巴兔(三)。因为中间件是项目中所有spider共用的组件,所以要在编写spider的具体规则时就将它确定好。
附:
详细的项目工程在Github中,如果觉得还不错的话记得Star哦。
作者:imflyn
链接:https://www.jianshu.com/p/95403d6c1305
共同学习,写下你的评论
评论加载中...
作者其他优质文章