Scrapy 编写第一个爬虫,Spider用于编写从单个网站(或者多个网站)爬取数据的类。其包含了一个用于下载的初始URL,如何抓取网页中的其他链接以及如何分析网站页面的内容,封装到 item 容器中。
为了创建一个Spider,您必须继承自 scrapy.Spider类,且定义以下三个属性:
name: 用于区别Spider,该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。start_urls: 包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一,更多的url则从初始的url获取到的数据中提取。parse()是spider的一个方法,被调用时,每个初始URL完成下载后生成的Response对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的Request对象。
以下为我们的第一个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.com 的spider,您将得到类似如下的输出:
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)
如图所示:

查看输出结果,可以看到输出的log中包含定义在 start_urls 的初始URL,并且与spider中是一一对应的。在log中可以看到其没有指向其他页面( (referer:None) )。
除此之外,更有趣的事情发生了,就像我们 parse 方法指定的那样,在tutorial目录下,有一个包含url所对应的内容的文件被创建了: vulkan-tutorial 。

极客教程