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 。