返回介绍

9.2 Scrapy 目录结构和简单爬虫实例

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

9.2.1 Scrapy 目录结构

本节用例子来介绍 Scrapy 目录结构、讲解 Scrapy 的用法。现在假如要使用 Scrapy 爬取百度首页右上角的栏目名称和其 URL,首先从命令行进入准备放置爬虫项目的目录。例如,爬虫项目准备放在 D 盘 sp 这个文件夹下,进入命令行,输入 D:并按回车键,然后输入 cd sp 并按回车键,进入 sp 这个文件夹,如图 9-2 所示。

图 9-2 进入放置爬虫项目的目录

现在可以使用下面的命令创建第一个 Scrapy 项目,如图 9-3 所示。

图 9-3 创建 Scrapy 项目

>scrapy startproject pachong1 

这个命令就在 sp 文件夹下创建了一个名为 pachong1 的 Scrapy 爬虫项目。它的目录结构如下。

pachong1/
     scrapy.cfg 
     pachong1/ 
         __init__.py 
         items.py 
         middlewares.py 
         pipelines.py 
         settings.py 
         spiders/ 
__init__.py  

(1)scrapy.cfg 是项目的配置文件,一般不用设置。scrapy.cfg 所在的目录就是项目的根目录。

(2)items.py 文件是保存爬取到数据的容器。要爬取什么数据,就要在这里面定义。

(3)pipelines.py 处理已经爬取到的数据。例如,要把爬取的 item 去重或者保存到数据库,就要在这个文件里面定义。

(4)middlewares.py 是中间件文件,主要用来对所有发出的请求、收到的响应或者 spider 做全局性的自定义设置,后面章节会有专门的介绍。

(5)settings.py 是 Scrapy 爬虫框架的设置文件。

(6)spiders 文件夹用于存放编写的爬虫代码,也就是说,爬虫主要逻辑就是在这里面定义的,可以在这个文件夹里定义多个爬虫,目前这个文件夹里面还没有爬虫文件,因为还没有生成或编写爬虫文件。

刚才使用 scrapy startproject pachong1 生成了爬虫项目,可以看到命令行有如下提示。

cd pachong1
scrapy genspider example example.com 

这个提示告诉我们使用 Scrapy 的模板生成爬虫文件的方法,按照提示执行生成爬虫文件的这两条命令。

>cd pachong1                       #进入项目目录
>scrapy genspider baidu baidu.com  #生成爬虫文件 

上面的两条命令在项目的 spiders 文件夹下面生成了一个名称为 baidu.py 的爬虫文件。scrapy genspider baidu baidu.com 这条生成爬虫文件的命令中,baidu 是为这个爬虫起的名字,baidu.com 是这个爬虫要爬取的网址。

用 Notepad++编辑器打开 baidu.py 文件,将看到如下代码。

import scrapy
 
class BaiduSpider(scrapy.Spider): 
    name='baidu' 
    allowed_domains=['baidu.com'] 
    start_urls=['http://baidu.com/'] 
 
    def parse(self, response): 
pass 

第一行引入 Scrapy,然后定义一个 BaiduSpider 的类,这个类继承自 scrapy.Spider 这个类。name 属性定义的是爬虫的名字,也就是刚才生成爬虫文件命令中的爬虫名字 baidu。在一个爬虫项目中,可以定义多个爬虫,但爬虫的 name 必须是唯一的。allowed_domains 定义过滤爬取的域名,不在此允许范围内的域名会被过滤而不会进行爬取。start_urls 定义爬虫启动时默认爬取的网址,在通常情况下,爬虫默认从 start_urls 开始爬取。

最后定义了一个 parse 方法,这个方法使用 Scrapy 爬取 start_urls 后得到的响应(response)作为参数。这个方法就是解析爬取到网页的方法,在这里可以定义如何解析爬取到的网页,从 response 中提取出需要的信息。

以上逐行介绍了 Scrapy 爬虫框架生成的爬虫文件模板,可以在这个模板基础上增加具体的提取规则、解析方法等。

9.2.2 百度爬虫实现

实战-爬虫编写-爬取百度首页

前面已经把百度爬虫文件生成好了,下面具体编写百度爬虫。

第一步,定义要爬取的数据。item.py 是用于定义爬取数据的容器,它定义要爬取哪些字段的数据。打开 items.py 文件,能看到 Scrapy 爬虫框架默认生成了如下代码。

class Pachong1Item(scrapy.Item):
    #define the fields for your item here like: 
    #name = scrapy.Field() 
    pass

这是项目创建时自动生成的代码,它给了人们很好的提示,也就是使用类似 name =scrapy.Field() 来定义要提取的字段,非常简洁。这里提取两个字段,一个是栏目(tilte),另一个是栏目对应的 URL。把代码改成如下的形式。

import scrapy
 
class Pachong1Item(scrapy.Item): 
    title = scrapy.Field() 
    url = scrapy.Field()

这里按照项目生成的 item 默认模板定义了一个继承自 scrapy.Item 的 Pachong1Item 类,然后定义了两个要提取的字段 - title 和 url。

第二步,编写爬虫文件。打开 spiders 文件夹下的 baidu.py 爬虫文件,这个文件中已经生成了 BaiduSpider 这个爬虫类,start_urls 正是要爬取的百度首页,Scrapy 启动后默认会从 start_urls 开始爬取,然后把得到的响应(response)传递给 parse 解析方法。因此,可以直接在 parse 方法中编写百度首页的解析规则,提取数据到 item 及生成要进一步处理的 URL。这里仅需提取出需要的栏目名称和 URL 即可。下面简单看一下 Scrapy 爬虫框架如何提取数据、解析网页。

9.2.3 Scrapy 选择器

Scrapy 爬虫框架在 Lxml 库基础上构建了提取数据的一套机制,它们被称作选择器(seletors),因为它们通过特定的 XPath 或者 CSS 表达式来“选择”HTML 文件中的某个部分。Scrapy 选择器在速度和解析准确性上与 Lxml 库非常相似。

通过前面章节的学习,读者对 XPath 语法已经有比较深入的了解,同时由于 XPath 提供了比 CSS 选择器更强大的功能,因此在后面需要提取数据时,推荐继续使用 XPath 语法。

具体如何使用选择器呢?

Scrapy 爬虫框架提供了选择器的快捷方式 - response.xpath() 及 response.css(),让用户可以直接使用选择器,本书主要使用 response.xpath() 这个选择器,其参数就是 XPath 路径。例如要提取出百度首页“新闻”栏目的名称,可以在 parse 方法中编写以下代码。

#首先导入前面定义好的 Pachong1Item 类
from pachong1.items import Pachong1Item    
 
def parse(self, response): 
    item = Pachong1Item()      #初始化 Item 类 
    item['title'] = response.xpath( 
'//*[@id="u1"]/a[1]/text()').extract()[0] 

上面的代码首先把定义好数据字段的 items 类导进来,然后使用 item = Pachong1Item() 初始化这个 items 数据容器,items 数据容器的使用语法类似 Python 字典,这里为其增加了 title 这个键和对应提取出来的值。请注意,Scrapy 爬虫框架为了提取真实的原文数据,需要调用 extract() 方法序列化提取节点为 unicode 字符串,这样提取出来的是全部匹配元素的列表。如果要提取第一个匹配到的元素,既可以使用代码中写的列表切片方法,也可以调用 extract_first() 提取。下面继续提取对应的 URL。

item['url'] = response.xpath(
                '//*[@id="u1"]/a[1]/@href').extract_first()

这里使用了 extract_first() 提取第一个数据,这种方法比前面提取 title 所使用的 extract()[0]方法更好,因为如果没有匹配的元素,extract_first 方法会返回 None,而 extract()[0]则会直接报错。为了让读者看到提取的结果,下面把提取的数据打印出来。

print(item['title'])
print(item['url']) 

最后返回 item。

return item 

这里暂时不对提取的数据做保存或其他操作,至此百度 Scrapy 爬虫框架就编写完成了。在命令行中定位到项目根目录下,使用如下命令运行这个爬虫。

>scrapy crawl baidu 

这样就运行了 Scrapy 百度爬虫,但是读者可能没有在屏幕上看到打印结果,而是发现类似 Forbidden by robots.txt 这样的提示,如图 9-4 所示。

图 9-4 运行提示

这是因为新版本的 Scrapy 爬虫框架默认遵守 robots 协议,而百度的 robots 协议不允许爬取其首页。这时可以打开 settings.py,设置 Scrapy 爬虫框架的 ROBOTSTXT_OBEY 为 False,在 setting.py 中找到这个变量,设置 ROBOTSTXT_OBEY=False 并保存,然后再次运行。

>scrapy crawl baidu 

如果顺利,读者会在日志信息的中间位置看到打印出的爬取结果,如图 9-5 所示。

图 9-5 Scrapy 爬虫框架运行结果

这一节从爬取百度首页这个例子入手,讲解了 Scrapy 目录结构、数据容器 items、选择器及小型爬虫的编写方法。通过这个小例子,读者应该初步学习到使用 Scrapy 爬虫框架编写爬虫的方法。后面的章节将详细讲解 Scrapy 爬虫框架的技术细节。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

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