不积跬步,无以至千里;不积小流,无以成江海。

Dean's blog

  • Join Us on Facebook!
  • Follow Us on Twitter!
  • LinkedIn
  • Subcribe to Our RSS Feed

Scrapy快速预览

在上一篇安装Scrapy后,我们使用一个简单的Demo快速体验下。

创建项目

先创建一个存放源代码的目录,例如Codes。在cmd中进入到该目录,使用Scrapy命令添加项目:

scrapy startproject fastDemo

输出:

New Scrapy project 'fastDemo', using template directory 'D:\Software\Anaconda3\lib\site-packages\scrapy\templates\project', created in:
F:\Codes\fastDemo

You can start your first spider with:
cd fastDemo
scrapy genspider example example.com

添加成功后,即会自动创建fastDemo,目录下的内容有:

│ scrapy.cfg                               #部署配置文件
│
└─fastDemo
        │   items.py                        #项目项定义文件
        │   middlewares.py           #中间件
        │   pipelines.py                  #管道
        │   settings.py                    #项目配置文件
        │   __init__.py
        │
        ├─spiders                          #爬虫目录
        │ │ __init__.py
        │ │
        │ └─__pycache__
        └─__pycache__

创建爬虫

将cmd定位到fastDemo目录,使用scrapy创建爬虫:

scrapy genspider demo www.mirthsoft.com

其中genspider的命令格式是:

scrapy genspider [-t template] name domain

其中-t可以以scrapy预定义的爬虫模板作为基础,目前有:

 

basic
crawl
csvfeed
xmlfeed

不指定是为basic。执行后在spiders目录下,自动创建了demo.py,默认内容如下:

# -*- coding: utf-8 -*-
import scrapy


class DemoSpider(scrapy.Spider):
    name = 'demo'
    allowed_domains = ['www.mirthsoft.com']
    start_urls = ['http://www.mirthsoft.com/']

    def parse(self, response):
        pass

其中:

        name  爬虫名称

        allowed_domains  爬虫爬取的域名列表,超出这个范围的不会爬取

        start_urls 爬虫的启动地址

如果我们不希望直接指定启动地址,例如启动的时候希望从数据库或其它位置获取启动地址时,可以这样:

# -*- coding: utf-8 -*-
import scrapy


class DemoSpider(scrapy.Spider):
    name = 'demo'
    allowed_domains = ['www.mirthsoft.com']
    #start_urls = ['http://www.mirthsoft.com/']

    def parse(self, response):
        pass

    def start_requests(self):
        urls = [
            'http://www.mirthsoft.com'
        ]
        for url in urls:
            yield scrapy.Request(url = url, callback=self.parse)

如代码,如果使用start_requests,需要返回一个Request的生成器。parse是爬取后的处理方法,可以在Request对象中指定为其它名称。在这里先将爬取到的数据保存到HTML中,如下:

    def parse(self, response):
        with(open("demo.html", "wb")) as f:
            f.write(response.body)

这样一个爬虫的基础代码就完成了。

执行爬虫

如果需要运行爬虫,可以在cmd中定位到fastDemo目录,执行:

scrapy crawl demo

执行后,会输出大量日志,如果执行成功,则可以查到保存的文件和类似如下的输出:

2019-12-25 17:15:26 [scrapy.core.engine] INFO: Spider opened
2019-12-25 17:15:26 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-12-25 17:15:26 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2019-12-25 17:15:27 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.mirthsoft.com/robots.txt> (referer: None)
2019-12-25 17:15:27 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.mirthsoft.com> (referer: None)
2019-12-25 17:15:27 [scrapy.core.engine] INFO: Closing spider (finished)

相关链接

安装Scrapy:http://www.mirthsoft.com/post/2019/12/22/scrapy-install

官方文档:https://docs.scrapy.org/en/latest

不允许评论
粤ICP备17049187号-1