Scrapy 编写第一个爬虫

Scrapy 编写第一个爬虫Spider用于编写从单个网站(或者多个网站)爬取数据的类。其包含了一个用于下载的初始URL,如何抓取网页中的其他链接以及如何分析网站页面的内容,封装到 item 容器中。

为了创建一个Spider,您必须继承自 scrapy.Spider类,且定义以下三个属性:

  • name: 用于区别Spider,该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
  • start_urls: 包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一,更多的url则从初始的url获取到的数据中提取。
  • parse()spider的一个方法,被调用时,每个初始URL完成下载后生成的 Response对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URLRequest对象。

以下为我们的第一个Spider代码,保存在 tutorial/spiders 目录下的 dmoz_spider.py 文件中:

import scrapy

class DmozSpider(scrapy.Spider):
    name = "geekdocs"
    allowed_domains = ["geek-docs.com"]
    start_urls = [
        "https://geek-docs.com/vulkan/vulkan-tutorial/vulkan-understand-instance.html",
    ]

    def parse(self, response):
        filename = response.url.split("/")[-2]
        with open(filename, 'wb') as f:
            f.write(response.body)

进入项目的根目录,执行下列命令启动 spider:

scrapy crawl geekdocs

scrapy crawl geekdocs 启动用于爬取 geek-docs.comspider,您将得到类似如下的输出:

2019-07-30 23:49:16 [scrapy.utils.log] INFO: Scrapy 1.5.0 started (bot: tutorial)
2019-07-30 23:49:16 [scrapy.middleware] INFO: Enabled extensions:
2019-07-30 23:49:17 [scrapy.middleware] INFO: Enabled downloader middlewares:
2019-07-30 23:49:17 [scrapy.middleware] INFO: Enabled spider middlewares:
2019-07-30 23:49:17 [scrapy.middleware] INFO: Enabled item pipelines:
2019-07-30 23:49:17 [scrapy.core.engine] INFO: Spider opened
2019-07-30 23:49:17 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2019-07-30 23:49:17 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://geek-docs.com/robots.txt> (referer: None)
2019-07-30 23:49:18 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://geek-docs.com/vulkan/vulkan-tutorial/vulkan-understand-instance.html> (referer: None)
2019-07-30 23:49:18 [scrapy.core.engine] INFO: Closing spider (finished)
2019-07-30 23:49:18 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
2019-07-30 23:49:18 [scrapy.core.engine] INFO: Spider closed (finished)

如图所示:
Scrapy 编写第一个爬虫
查看输出结果,可以看到输出的log中包含定义在 start_urls 的初始URL,并且与spider中是一一对应的。在log中可以看到其没有指向其他页面( (referer:None) )。

除此之外,更有趣的事情发生了,就像我们 parse 方法指定的那样,在tutorial目录下,有一个包含url所对应的内容的文件被创建了: vulkan-tutorial
Scrapy 编写第一个爬虫

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程