Scrapy详细教程入门详解之创建爬虫项目

最近用Scrapy做一个项目,简单做一下记录。

Scrapy是什么呢?它是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。它就是一个很强大的爬虫框架,并且还支持分步式。

环境配置这个就略过了。

入门:创建一个名为"myspider"的Scrapy爬虫项目

scrapy startproject myspider
#它会在前当目录创建一个myspider的目录

scrapy爬虫项目结构:

scrapy 目录结构.png

spiders目录就是存放爬虫文件的。

items.py 是字段

middlewares.py是中间件

pipelines.py是管道文件

settings.py 是全局配置文件

scrapy.cfg 是项目的基础配置文件

项目创建好后,现在创建一个爬虫:

#在你创建好项目成功后提示你怎么创建一个爬虫,下面这条语句会在你项目创建成功后,显示在你的命令窗口中。
cd myspider #进入你的爬虫项目
scrapy genspider example(爬虫名称) example.com(爬取的域名)
#例如 创建一个名为baidu的爬虫 爬取域名为baidu.com 命令如下.
scrapy genspider baidu baidu.com

创建的这个爬虫它是以basi模板创建的爬虫,也是默认的模板。

#查看爬虫的模板命令
scrapy genspider --list
#默认会有下面几个模板
basic # 最基础的Spider
crawl # 定义了一些rules,适合爬取有规律的网站
csvfeed	# 按行遍历来解析CSV源
xmlfeed	# 通过迭代各个节点来分析XML源

创建爬虫的时候可以 自己指定 模板:

#像下面这样,指定模板
scrapy genspider -t basic baidu baidu.com

然后就会在spiders目录下生成一个baidu.py文件,内容像下面这样:

import scrapy


class BaiduSpider(scrapy.Spider):
    name = 'baidu'
    allowed_domains = ['baidu.com']
    start_urls = ['http://baidu.com/']

    def parse(self, response):
        pass

爬虫就创建好了,运行爬虫

scrapy crawl baidu #爬虫就会启动,运行结束后就会自动退出。

运行结果如下:

$ scrapy crawl baidu

2020-02-05 13:02:31 [scrapy.utils.log] INFO: Scrapy 1.5.1 started (bot: myspider)
2020-02-05 13:02:31 [scrapy.utils.log] INFO: Versions: lxml 4.2.5.0, libxml2 2.9.8, cssselect 1.1.0, parsel 1.5.2, w3lib 1.21.0, Twisted 19.2.0, Python 3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)], pyOpenSSL 18.0.0 (OpenSSL 1.1.1a  20 Nov 2018), cryptography 2.4.2, Platform Windows-10-10.0.18362-SP0
2020-02-05 13:02:31 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'myspider', 'NEWSPIDER_MODULE': 'myspider.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['myspider.spiders']}
2020-02-05 13:02:32 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
2020-02-05 13:02:33 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2020-02-05 13:02:33 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2020-02-05 13:02:33 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2020-02-05 13:02:33 [scrapy.core.engine] INFO: Spider opened
2020-02-05 13:02:33 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2020-02-05 13:02:33 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2020-02-05 13:02:36 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET http://baidu.com/robots.txt> (failed 1 times): [<twisted.python.failure.Failure twisted.internet.error.ConnectionDone: Connection was closed cleanly.>]
2020-02-05 13:02:36 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://baidu.com/robots.txt> (referer: None)
2020-02-05 13:02:36 [scrapy.downloadermiddlewares.robotstxt] DEBUG: Forbidden by robots.txt: <GET http://baidu.com/>
2020-02-05 13:02:36 [scrapy.core.engine] INFO: Closing spider (finished)
2020-02-05 13:02:36 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/exception_count': 2,
 'downloader/exception_type_count/scrapy.exceptions.IgnoreRequest': 1,
 'downloader/exception_type_count/twisted.web._newclient.ResponseNeverReceived': 1,
 'downloader/request_bytes': 436,
 'downloader/request_count': 2,
 'downloader/request_method_count/GET': 2,
 'downloader/response_bytes': 2680,
 'downloader/response_count': 1,
 'downloader/response_status_count/200': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2020, 2, 5, 5, 2, 36, 959112),
 'log_count/DEBUG': 4,
 'log_count/INFO': 7,
 'response_received_count': 1,
 'retry/count': 1,
 'retry/reason_count/twisted.web._newclient.ResponseNeverReceived': 1,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'start_time': datetime.datetime(2020, 2, 5, 5, 2, 33, 461671)}
2020-02-05 13:02:36 [scrapy.core.engine] INFO: Spider closed (finished)

会显示scrapy的版本,以及一些其他信息,中间件这些,可以看到中间件的加载顺序,这个是很有用的,调试的时候可以查看到你自己的中间件有没有被加载。

注意:一般网站都有robots.txt文件,我们爬取默认也会遵循robots规则,所以一般我们需要关闭它修改setting.py文件中将 ROBOTSTXT_OBEY = True 改成 ROBOTSTXT_OBEY = False


爬虫启动命令:

1.启动爬虫,结速后自动关闭爬虫,中途断开重新执行。

scrapy crawl baidu

2.启动爬虫,中途断开(比如 ctrl+c打断)会将任务保存到job_info目录中的001文件中,重新启动爬如果指定这个任务则会恢复001任务继续执行。

scrapy crawl baidu -s JOBDIR=job_info/001

3.启动爬虫,结束后自动关闭爬虫,不打印日志。

scrapy crawl baidu --nolog


更多命令,你可以使用 --help参数查看例如:

$ scrapy crawl baidu --help


Usage
=====
  scrapy crawl [options] <spider>

Run a spider

Options
=======
--help, -h              show this help message and exit
-a NAME=VALUE           set spider argument (may be repeated)
--output=FILE, -o FILE  dump scraped items into FILE (use - for stdout)
--output-format=FORMAT, -t FORMAT
                        format to use for dumping items with -o

Global Options
--------------
--logfile=FILE          log file. if omitted stderr will be used
--loglevel=LEVEL, -L LEVEL
                        log level (default: DEBUG)
--nolog                 disable logging completely
--profile=FILE          write python cProfile stats to FILE
--pidfile=FILE          write process ID to FILE
--set=NAME=VALUE, -s NAME=VALUE
                        set/override setting (may be repeated)
--pdb                   enable pdb on failure

相信这个讲解也很详细了,如果还有问题,欢迎留言交流。

Tags python scrapy 爬虫

留言(0)

评论