返回介绍

10.1 BasicSpider 类

发布于 2025-04-21 19:15:28 字数 2684 浏览 0 评论 0 收藏

10.1.1 Scrapy 的爬虫类和模板

这一节来看 Scrapy 爬虫项目中最关键的文件,也就是项目 spider 文件夹中的爬虫文件。9.2 节曾经使用 scrapy genspider baidu baidu.com 这条命令来生成 spider 爬虫文件,可以看到,默认生成的爬虫类继承自 scrapy.Spider 类,这个类是 Scrapy 爬虫框架提供的最基础的爬虫类。

Scrapy 的爬虫类定义了如何爬取某个网站,也就是说 spider 文件夹中的爬虫文件是定义爬取的动作及分析某个网页(或者某些网页)的地方。Scrapy 为不同的爬取需求提供了多种不同的爬虫类,分别对应不同的爬虫模板。可以在命令行中查看 Scrapy 为用户提供了哪些爬虫模板。

先生成项目,并进入项目根目录。

>scrapy startproject pachong
>cd pachong 

然后运行以下代码。

>scrapy genspider -l
Available templates: 
  basic 
  crawl 
  csvfeed 
xmlfeed 

可以看到 Scrapy 为用户提供了 4 种可用的爬虫模板,分别代表 4 种不同的爬虫类,下面简单介绍一下。

(1)BasicSpider 类。这是最简单的爬虫类,在生成模板时,系统默认使用 BasicSpider 类生成了基础爬虫模板,每个其他的爬虫类都必须继承自该类。

(2)CrawlSpider 类。这是爬取一般网站常用的爬虫类。其定义了一些规则(rule),方便用户跟进某种类型的链接。用户可以在命令行中指定使用 crawl 模板来生成基于 CrawlSpider 类的爬虫。

>scrapy genspider -t crawl sina sina.com.cn

这样就使用 crawl 模板生成了继承自 CrawlSpider 类的新浪网爬虫文件。

(3)CSVFeedSpider 类。该爬虫类除了按行遍历而不是节点之外,其他和 XMLFeedSpider 十分类似。

(4)XMLFeedSpider 类。这是一个设计用于通过迭代各个节点来分析 XML 源(XML feed)的爬虫类。

在 Scrapy 提供的 4 种爬虫类中,BasicSpider 类和 CrawlSpider 类是最常用的爬虫类,将分别在本章和下一章中着重介绍。

10.1.2 BasicSpider 类简介

BasicSpider 类就是 scrapy.Spider 类,是最基本的爬虫类,每个其他的爬虫类必须继承自该类。scrapy.Spider 并没有提供什么特殊的功能,其仅仅提供了 start_requests() 的默认实现,也就是读取并请求 spider 属性中的 start_urls,并将返回的结果调用 spider 的 parse 方法解析。

9.2 节百度爬虫实例并没有定义请求动作去请求百度首页,而是直接在 parse 方法中定义解析规则,这就是因为这个爬虫继承自 scrapy.Spider 类,这个类已经默认实现了 start_requests() 方法,这个方法帮助我们读取并请求了 spider 属性中的 start_urls,并把返回的结果(response)传给了 parse 方法。

通过前面的介绍,读者现在应该知道,当启动 Scrapy 爬虫时,爬虫会直接爬取 start_urls 中的网址。如果在登录的情况下才能正常爬取网站,用户是不希望爬虫在启动时直接爬取 start_urls 中的网址的,这个时候可以重写 start_requests 方法,在这个方法中先登录网站,示例如下。

class ExampleSpider(scrapy.Spider):
     name = 'examplespider' 
     #重写 start_requests 方法,使用 scrapy.FormRequest(本书后面会介绍) 
     #登录网站,设置回调函数为 logged_in
     def start_requests(self): 
         return [scrapy.FormRequest("http://www.example.com/login",  
                 formdata={'user': 'someone', 'pass': 'secret'},  
                 callback=self.logged_in)] 
     #定义回调函数 logged_in,解析登录后的网页 
     def logged_in(self, response): 
pass 

这里提到了回调函数。所谓回调函数,就是在用户发起请求的时候,指定用来执行后续解析的函数。在 Scrapy 的请求方法中,我们使用 callback 指定回调函数,callback 的值既可以是字符串形式的回调函数名称,也可以直接使用对象方法名称。如果没有指定回调函数,系统默认使用 parse 方法解析返回的响应(response)。

上面的代码中指定了 scrapy.FormRequest 的回调函数为 logged_in 方法,这样在执行了 scrapy.FormRequest 请求后,系统会将返回的 response 传入 logged_in 方法进行解析。

还有一点需要解释一下:读者应该注意到上面的代码中,start_requests() 方法返回的是一个 list,这是因为 start_requests() 方法必须返回一个可迭代的对象(如列表等)。当然了,由于 start_requests() 方法仅在爬虫开始运行时执行一次,也可以构造为生成器,使用 yield 返回。

下节将用爬取我爱我家二手房房源数据的例子来演示使用 scrapy.Spider 类编写爬虫的方法。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。