前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scrapy 爬虫框架学习记录

Scrapy 爬虫框架学习记录

作者头像
caoqi95
发布2019-03-28 11:32:20
5740
发布2019-03-28 11:32:20
举报
文章被收录于专栏:caoqi95的记录日志

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

创建项目

安装完 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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.11.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建项目
  • 创建爬虫
  • 启动爬虫
  • 提取数据
    • 使用 CSS 来提取数据
      • 使用 XPath 提取数据
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档