Python爬虫实战-使用Scrapy框架爬取土巴兔(二)

通过上一篇文章 Python爬虫实战-使用Scrapy框架爬取土巴兔(一)我们对Scrapy有了初步的认识,也准备好了开发环境。接下来我们进入正式的开发环节。

该系列其它文章

  • Python爬虫实战-使用Scrapy框架爬取土巴兔(一)
  • Python爬虫实战-使用Scrapy框架爬取土巴兔(三)
  • Python爬虫实战-使用Scrapy框架爬取土巴兔(四)
  • Python爬虫实战-使用Scrapy框架爬取土巴兔(五)

该篇文章主要讲Scrapy的工程创建配置

一.创建Scrapy工程

Scrapy提供Shell命令可以直接创建工程,例如项目名为tubatu,执行命令:

scrapy startproject tubatu

创建成功后在pycharm中打开工程,我们能够得到文件夹目录如下:

Python爬虫实战-使用Scrapy框架爬取土巴兔(二)_第1张图片
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"的文件都是关于项目的配置。

Python爬虫实战-使用Scrapy框架爬取土巴兔(二)_第2张图片
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 logging

import redis
from requests.packages.urllib3.connectionpool import log as requests_log

from msic.core.service import mongodb_service

#设置requests日志等级
requests_log.setLevel(logging.WARNING)

# Redis
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
REDIS_DATABASE_NAME = 0
redis_client = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DATABASE_NAME)

# MongoDB
MONGODB_HOST = "127.0.0.1"
MONGODB_PORT = 27017
mongodb_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哦。

你可能感兴趣的:(Python爬虫实战-使用Scrapy框架爬取土巴兔(二))