Scrapy 爬虫框架学习记录

2019-03-28 11:32:20 浏览数 (1)

打算做一个小小的项目,用于下载论文,所以先学学爬虫的一些相关知识。

创建项目

安装完 scrapy 后,新建一个爬虫的目录,然后在命令行窗口进入该目录,输入以下命令:

代码语言:javascript复制
scrapy startproject projectname

该目录会包含以下内容:

代码语言:javascript复制
projectname/
    scrapy.cfg            # 部署配置文件

    projectname/          # 项目的Python模块,你将从这里导入你的代码
        __init__.py

        items.py          # 项目 items 定义文件

        middlewares.py    # 项目 middlewares 文件

        pipelines.py      # 项目 pipelines 文件

        settings.py       # 项目设置文件

        spiders/          # 将在以后放置 spiders 的目录
            __init__.py

创建爬虫

上面出现的 spiders 里面包含自己定义的类, Scrapy 将用其来爬去网页的信息。spiders 里面定义的类,必须继承 scrapy.Spider 这个类,以及定义一些初始的请求。比如,如何跟踪页面中的链接,以及如何解析下载的页面内容以提取数据。下面是一个爬虫的示例代码,来自官方文档:

代码语言:javascript复制
import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

如上所示,这个子类定义了一些属性和方法:

  • name:爬虫的名字。在项目中必须是唯一的,也就是说,不能为不同的 Spiders设置相同的名称。
  • start_requests:必须返回一个可迭代的请求(可以返回请求列表或编写生成器函数),这时 Spider 将开始爬行。后续请求将从这些初始请求中连续生成。
  • parse:将被调用以处理为每个请求下载的响应的方法。 response 参数是 TextResponse 的一个实例,它保存页面内容并具有处理内容的其他有用方法。

启动爬虫

要让爬虫工作,请转到项目的顶级目录并在命令行窗口输入以下命令,启动爬虫:

代码语言:javascript复制
scrapy crawl quotes   ## quotes 是 spider 的 name

将会有下面这样的结果:

在文件目录下也会生成两个 HTML 文件:

解释一下刚刚爬虫的过程:Scrapy 安排了 scrapy.Request 对象,其由 Spider 的 start_requests 方法返回。收到每个响应后,它会实例化 Response 对象并调用与请求相关的回调方法(在本例中为 parse 方法),将响应作为参数传递。

提取数据

推荐在 scrapy shell 中学习提取数据,可以通过以下方式:

代码语言:javascript复制
scrapy shell "http://quotes.toscrape.com/page/1/"
使用 CSS 来提取数据

如下图所示,是使用 CSS 来提取数据。可以看到结果是一个名为 SelectorList 的类似列表的对象,它表示包含 XML / HTML 元素的 Selector 对象列表,并允许运行更多查询以细化选择或提取数据。

提取标题的文字内容:

使用 extract() 返回的是 list 对象,为了提取具体内容可以用 extract_first():

或者也可以使用切片的方式,但是使用切片的话需要注意 IndexError

使用 XPath 提取数据

除了 CSS,Scrapy 选择器还支持使用 XPath 表达式:

XPath 表达式提供了更多功能,因为除了导航结构之外,它还可以查看内容。使用 XPath,可以选择包含文本 “下一页” 的链接。这使得 XPath 非常适合抓取任务。

更多内容可以查看:using XPath with Scrapy Selectors

0 人点赞