scrapy 快速入门

2023-11-16

安装Scrapy

Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv、json等文件中。

首先我们安装Scrapy。

pip install scrapy

在Windows上安装时可能会出现错误,提示找不到Microsoft Visual C++。这时候我们需要到它提示的网站visual-cpp-build-tools下载VC++ 14编译器,安装完成之后再次运行命令即可成功安装Scrapy。

error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

快速开始

第一个爬虫

以下是官方文档的第一个爬虫例子。可以看到,和我们手动使用request库和BeautifulSoup解析网页内容不同,Scrapy专门抽象了一个爬虫父类,我们只需要重写其中的方法,就可以迅速得到一个可以不断爬行的爬虫。

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属性,用来标识爬虫,该名字在一个项目必须是唯一的。
  • start_requests()
    方法,必须返回一个可迭代的列表(可以是列表,也可以是生成器),Scrapy会从这些请求开始抓取网页。
  • parse()
     方法用于从网页文本中抓取相应内容,我们需要根据自己的需要重写该方法。

开始链接

在上面的例子中使用start_requests()方法来设置起始URL,如果只需要简单指定URL还可以使用另一种简便方法,那就是设置类属性start_urls,Scrapy会读取该属性来设置起始URL。

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
        'http://quotes.toscrape.com/page/2/',
    ]

提取数据

这部分的练习可以使用Scrapy的shell功能。我们可以使用下面的命令启动Scrapy shell并提取百思不得姐段子的内容,成功运行之后会打开一个交互式shell,我们可以进行交互式编程,随时查看代码的运行结果。

scrapy shell 'http://www.budejie.com/text/'

可能会出现下面的错误,遇到这种情况是因为没有安装pypiwin32模块。

ModuleNotFoundError: No module named 'win32api'

这时候可以使用下面的命令安装。

pip install pypiwin32

运行成功之后在终端中看到以下内容,列举了在交互式shell中可以进行的操作。

[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x0000014EA8B3CD68>
[s]   item       {}
[s]   request    <GET http://www.budejie.com/text/>
[s]   response   <200 http://www.budejie.com/text/>
[s]   settings   <scrapy.settings.Settings object at 0x0000014EA8B3CA58>
[s]   spider     <DefaultSpider 'default' at 0x14ea8dc07f0>
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser

例如,如果我们要查看网页的内容,可以输入view(response),会打开默认浏览器并进入相应页面。

In [2]: view(response)
Out[2]: True

如果需要使用CSS选择器提取网页内容,可以输入相应的内容,比如说下面就获取了网页上的标题标签。

In [3]: response.css('title')
Out[3]: [<Selector xpath='descendant-or-self::title' data='<title>内涵段子_内涵笑话-百思不得姐官网,第1页</title>'>]

如果需要提取标签内容,可以使用Scrapy扩展的CSS选择器::text并使用extract()方法。如果直接对标签调用extract()会获取包含标签在内的整个文本。

In [8]: response.css('title::text').extract()
Out[8]: ['内涵段子_内涵笑话-百思不得姐官网,第1页']

如果选中的标签含有复数内容,可以使用extract_first()方法获取第一个元素。

response.css('title::text').extract_first()

也可以使用索引来选取内容。不过假如没有元素的话,extract_first()方法会返回None而索引会抛出IndexError,因此使用extract_first()更好。

response.css('title::text')[0].extract()

除了CSS选择器之外,Scrapy还支持使用re方法以正则表达式提取内容,以及xpath方法以XPATH语法提取内容。关于XPATH,可以查看菜鸟教程,写的还不错。

下面是提取百思不得姐段子的简单例子,在交互环境中执行之后,我们就可以看到提取出来的数据了。

li=response.css('div.j-r-list-c-desc')
content=li.css('a::text')

编写爬虫

确定如何提取数据之后,就可以编写爬虫了。下面的爬虫爬取了百思不得姐首页的用户名和段子。

class Baisibudejie(scrapy.Spider):
    name = 'jokes'
    start_urls = ['http://www.budejie.com/text/']

    def parse(self, response):
        lies = response.css('div.j-r-list >ul >li')
        for li in lies:
            username = li.css('a.u-user-name::text').extract()
            content = li.css('div.j-r-list-c-desc a::text').extract()
            yield {'username': username, 'content': content}

写好了爬虫之后,就可以运行了。我们可以使用下面的命令运行这个爬虫。运行成功之后,会出现user.json,其中就是我们爬取的数据。Scrapy支持多种格式,除了json之外,还可以将数据导出为XML、CSV等格式。

scrapy runspider use_scrapy.py -o user.json

页面跳转

如果爬虫需要跨越多个页面,需要在parse方法中生成下一步要爬取的页面。下面的例子是爬取我CSDN博客所有文章和连接的爬虫。这个爬虫没有处理CSDN博客置顶文章,所以置顶文章爬取的文章标题是空。

class CsdnBlogSpider(scrapy.Spider):
    name = 'csdn_blog'
    start_urls = ['http://blog.csdn.net/u011054333/article/list/1']

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.base_url = 'http://blog.csdn.net'

    def parse(self, response):
        articles = response.css('div#article_list div.article_item')
        for article in articles:
            title = article.css('div.article_title a::text').extract_first().strip()
            link = self.base_url + article.css('div.article_title a::attr(href)').extract_first().strip()
            yield {'title': title, 'link': link}

        pages = response.css('div#papelist')
        next_page_url = pages.css('a').re_first('<a href=\"(.*)\">下一页')
        if next_page_url is not None:
            yield scrapy.Request(urllib.parse.urljoin(self.base_url, next_page_url))

scrapy命令

为了更好的实现工程化管理,Scrapy还提供了scrapy命令来帮助我们管理爬虫。详细的命令用法请参考官方文档

创建项目

下面的命令可以创建一个Scrapy爬虫项目,它为我们规定了标准的项目格式。

scrapy startproject myproject [project_dir]

创建好之后,应该会出现如下的项目结构。spiders模块中放置所有爬虫,scrapy.cfg是项目的全局配置文件,其余文件是Scrapy的组件。

项目结构

创建爬虫

使用下面的命令可以创建一个爬虫,爬虫会放置在spider模块中。

scrapy genspider mydomain mydomain.com

生成的爬虫具有基本的结构,我们可以直接在此基础上编写代码。

# -*- coding: utf-8 -*-
import scrapy


class MydomainSpider(scrapy.Spider):
    name = "mydomain"
    allowed_domains = ["mydomain.com"]
    start_urls = ['http://mydomain.com/']

    def parse(self, response):
        pass

运行爬虫

在已经生成好的项目中,我们使用项目相关的命令来运行爬虫。首先需要列出所有可运行的爬虫,这会列出所有爬虫类中指定的name属性。

scrapy list

然后,我们可以按照name来运行爬虫。

scrapy crawl 'csdn_blog' -o blog.json

注意这两个命令都是项目相关的,只能用于已存在的项目。

设置编码

如果你使用上面的爬虫并导出为json格式,可能会发现所有汉字全变成了Unicode字符(类似\uA83B这样的)。自Scrapy1.2 起,增加了FEED_EXPORT_ENCODING属性,用于设置输出编码。我们在settings.py中添加下面的配置即可。

FEED_EXPORT_ENCODING = 'utf-8'

然后再重新导出一次。这次所有汉字都能正常输出了。

爬虫结果

以上就是Scrapy的快速入门了。我们了解了如何编写最简单的爬虫。如果查阅Scrapy的官方文档会发现Scrapy的功能远不止这里介绍的。本文就是起一个抛砖引玉的作用,如果希望进一步了解Scrapy这个爬虫框架,请查阅相关文档进一步学习。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scrapy 快速入门 的相关文章

随机推荐

  • C++中函数返回引用,及问题

    目录 函数返回值 返回引用 C 基础知识 函数返回引用深度解析 关于函数调用返回引用错误并且每次调用不一致的分析与解决 将引用作为函数返回值的格式 好处和规则 实用经验 45 禁止函数返回局部变量的引用 1 返回的是一个引用类型 也就是返回
  • 整数溢出的漏洞危害和预防

    智能合约作为区块链2 0的代表技术 适应于区块链去中心化 分布式的特点 具有独立运行 不可篡改的优良特性 可用于实现包含金融工具在内的各类分布式应用 开发者可以自行定义交易逻辑并开发代码发布到链上 合约代码在矿工节点的虚拟机环境 如EVM
  • vue踩坑填坑(一):引入模块组件

    在webpack vue开发中 如果在一个vue文件中引入另外一个封装的模块组件的vue文件 则有以下两种方式 首先想要在以下代码中引入一个封装好的输入框组件input text vue
  • cf服务器维护会不会掉分,《cf》枪王排位长时间不打会不会掉分? 枪王排位扣分机制介绍...

    川北在线核心提示 原标题 cf 枪王排位长时间不打会不会掉分 枪王排位扣分机制介绍 CF枪王排位大师以上不打会掉分么 很多小伙伴都在问枪王排位长时间不打会不会掉分 为此牛游戏小编为大家带来cf枪王排位扣分机制介绍 一起来看看枪王排位长时间不
  • Basic Level 1014 福尔摩斯的约会 (20分)

    题目 大侦探福尔摩斯接到一张奇怪的字条 我们约会吧 3485djDkxh4hhGE 2984akDfkkkkggEdsb s hgsfdk d Hyscvnm 大侦探很快就明白了 字条上奇怪的乱码实际上就是约会的时间星期四 14 04 因为
  • JDK8 HashMap put() 方法源码分析

    文章目录 一 前置知识 红黑树定义 二 构造方法 HashMap HashMap int initialCapacity float loadFactor tableSizeFor int cap 计算hashmap初始容量 三 put 方
  • 入门级题解7. 整数反转

    给你一个 32 位的有符号整数 x 返回将 x 中的数字部分反转后的结果 如果反转后整数超过 32 位的有符号整数的范围 231 231 1 就返回 0 假设环境不允许存储 64 位整数 有符号或无符号 思路 反转 想到链表反转 又看到是整
  • android studio对数据库进行,Android Studio 学习(四) 数据库

    文件存储 写数据 String data Data ti save FileOutputStream out null BufferedWriter writer null try out openFileOutput data Conte
  • C++毕业设计基于QT实现的超市收银管理系统源代码+数据库

    C 毕业设计基于QT实现的超市收银管理系统源代码 数据库 编译使用 编译完成后 需要拷贝 file目录下的数据库 POP db文件到可执行程序目录下 登录界面 主界面 会员管理 完整代码下载地址 基于QT实现的超市收银管理系统源代码 数据库
  • ctf.show 通关秘籍

    文章目录 CTF show 1 web签到题 2 web2 3 web3 CTF show 1 web签到题 访问web签到题的地址 发现页面只有 where is flag 字样 使用Fn F12进入调试模式 或者页面空白处点击右键查看网
  • mysql默认的数据库和表_MySQL 自带4个默认数据库

    默认数据库分类 information schema performance schema mysql test informance schema 保存了MySQl服务所有数据库的信息 具体MySQL服务有多少个数据库 各个数据库有哪些表
  • Mrosoft visual c++6.0打开文件未响应,快速解决。【最新办法,初学者都会】

    1 下载filetool的vc6 0的辅助工具 下载地址 http download microsoft com download vc60ent s1 6 0 w9xnt4 en us filetool exe 快速下载filetool
  • 为SQL Server Always On可用性组配置域控制器和Active Directory

    In this series for SQL Server Always On availability groups we are covering end to end configurations for SQL Server 201
  • echarts横向个性化柱状图

    先看一下效果图 横向柱状图 顶部小圈是一个图片 下面我们就来看看如何实现 1 第一步 先把柱状图中需要插入的图片 转换成base64格式 百度搜一下 可以搜到在线工具直接转换 2 html中定义一个div 用来盛放柱状图 div style
  • 《STL源码剖析》(二)——空间配置器

    一 为什么要有空间配置器 1 小块内存带来的内存碎片问题 单从内存分配的角度来讲 由于频繁分配 释放小块内存容易在堆中造成外碎片 极端情况下 堆中空闲的总量满足一个要求 但是这些空闲的块都不连续 导致任何一个单独的空闲的块都无法满足请求 2
  • C练题笔记之:Leetcode-793. 阶乘函数后 K 个零

    题目 f x 是 x 末尾是 0 的数量 回想一下 x 1 2 3 x 且 0 1 例如 f 3 0 因为 3 6 的末尾没有 0 而 f 11 2 因为 11 39916800 末端有 2 个 0 给定 k 找出返回能满足 f x k 的
  • NO-CARRIER

    自己动手写了创建虚拟接口 删除虚拟接口程序 频繁调用创建删除时 有时将接口up起来时会报错 Name not unique on network 利用ip link命令来查看接口 及其对应的索引 可以查看到与其他接口不同的是有个标志为 NO
  • 利用多个panel重叠来代替tabcontrol方法

    这两天 在弄一个C 软件 看着tabcontrol那个讨厌的标签 真是火大 折腾了1个周末加今天1个白天 总是不行 其实我就是想要一排按纽 来控掉不同的界面显示 今天打算使用多个pannel来代替tabcontrol 自己在旁边再弄几个按纽
  • Angular_学习笔记_01

    3天Angular视频课程 之 第1天 学习笔记 1 安装 Node 官网下载 一路Next gt 2 安装Angular cli sudo npm install g angular cli 3 ng new app name 4 运行项
  • scrapy 快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架 它不仅包含了爬虫的特性 还可以方便的将爬虫数据保存到csv json等文件中 首先我们安装Scrapy pip install scrapy 在Windows上安装时可能会出现