安装Scrapy

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

首先我们安装Scrapy。

  1. pip install scrapy

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

  1. 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专门抽象了一个爬虫父类,我们只需要重写其中的方法,就可以迅速得到一个可以不断爬行的爬虫。

  1. import scrapy
  2. class QuotesSpider(scrapy.Spider):
  3. name = "quotes"
  4. def start_requests(self):
  5. urls = [
  6. 'http://quotes.toscrape.com/page/1/',
  7. 'http://quotes.toscrape.com/page/2/',
  8. ]
  9. for url in urls:
  10. yield scrapy.Request(url=url, callback=self.parse)
  11. def parse(self, response):
  12. page = response.url.split("/")[-2]
  13. filename = 'quotes-%s.html' % page
  14. with open(filename, 'wb') as f:
  15. f.write(response.body)
  16. self.log('Saved file %s' % filename)

上面的爬虫有几个地方需要解释一下:

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

开始链接

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

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

提取数据

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

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

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

  1. ModuleNotFoundError: No module named 'win32api'

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

  1. pip install pypiwin32

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

编写爬虫

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

  1. class Baisibudejie(scrapy.Spider):
  2. name = 'jokes'
  3. start_urls = ['http://www.budejie.com/text/']
  4. def parse(self, response):
  5. lies = response.css('div.j-r-list >ul >li')
  6. for li in lies:
  7. username = li.css('a.u-user-name::text').extract()
  8. content = li.css('div.j-r-list-c-desc a::text').extract()
  9. yield {'username': username, 'content': content}

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

  1. scrapy runspider use_scrapy.py -o user.json

页面跳转

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

  1. class CsdnBlogSpider(scrapy.Spider):
  2. name = 'csdn_blog'
  3. start_urls = ['http://blog.csdn.net/u011054333/article/list/1']
  4. def __init__(self, **kwargs):
  5. super().__init__(**kwargs)
  6. self.base_url = 'http://blog.csdn.net'
  7. def parse(self, response):
  8. articles = response.css('div#article_list div.article_item')
  9. for article in articles:
  10. title = article.css('div.article_title a::text').extract_first().strip()
  11. link = self.base_url + article.css('div.article_title a::attr(href)').extract_first().strip()
  12. yield {'title': title, 'link': link}
  13. pages = response.css('div#papelist')
  14. next_page_url = pages.css('a').re_first('<a href=\"(.*)\">下一页')
  15. if next_page_url is not None:
  16. yield scrapy.Request(urllib.parse.urljoin(self.base_url, next_page_url))

scrapy命令

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

创建项目

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

  1. scrapy startproject myproject [project_dir]

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

创建爬虫

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

  1. scrapy genspider mydomain mydomain.com

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

  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. class MydomainSpider(scrapy.Spider):
  4. name = "mydomain"
  5. allowed_domains = ["mydomain.com"]
  6. start_urls = ['http://mydomain.com/']
  7. def parse(self, response):
  8. pass

运行爬虫

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

  1. scrapy list

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

  1. scrapy crawl 'csdn_blog' -o blog.json

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

设置编码

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

  1. FEED_EXPORT_ENCODING = 'utf-8'

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

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

Scrapy爬虫快速入门的更多相关文章

  1. scrapy爬虫 快速入门

    Scrapy 1. 简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络 ...

  2. Scrapy框架-scrapy框架快速入门

    1.安装和文档 安装:通过pip install scrapy即可安装. Scrapy官方文档:http://doc.scrapy.org/en/latest Scrapy中文文档:http://sc ...

  3. Scrapy 爬虫框架入门案例详解

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:崔庆才 Scrapy入门 本篇会通过介绍一个简单的项目,走一遍Scrapy抓取流程,通过这个过程,可以对 ...

  4. Python之Scrapy爬虫框架 入门实例(一)

    一.开发环境 1.安装 scrapy 2.安装 python2.7 3.安装编辑器 PyCharm 二.创建scrapy项目pachong 1.在命令行输入命令:scrapy startproject ...

  5. scrapy爬虫框架入门教程

    scrapy安装请参考:安装指南. 我们将使用开放目录项目(dmoz)作为抓取的例子. 这篇入门教程将引导你完成如下任务: 创建一个新的Scrapy项目 定义提取的Item 写一个Spider用来爬行 ...

  6. 【python】Scrapy爬虫框架入门

    说明: 本文主要学习Scrapy框架入门,介绍如何使用Scrapy框架爬取页面信息. 项目案例:爬取腾讯招聘页面 https://hr.tencent.com/position.php?&st ...

  7. [Python] Scrapy爬虫框架入门

    说明: 本文主要学习Scrapy框架入门,介绍如何使用Scrapy框架爬取页面信息. 项目案例:爬取腾讯招聘页面 https://hr.tencent.com/position.php?&st ...

  8. scrapy爬虫框架入门实例(一)

    流程分析 抓取内容(百度贴吧:网络爬虫吧) 页面: http://tieba.baidu.com/f?kw=%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB&ie=ut ...

  9. scrapy爬虫 简单入门

    1. 使用cmd+R命令进入命令行窗口,并进入你需要创建项目的目录 cd 项目地址 2. 创建项目 scrapy startproject <项目名> cd <项目名> 例如 ...

随机推荐

  1. 一口气说出 4种 LBS “附近的人” 实现方式,面试官笑了

    引言 昨天一位公众号粉丝和我讨论了一道面试题,个人觉得比较有意义,这里整理了一下分享给大家,愿小伙伴们面试路上少踩坑.面试题目比较简单:"让你实现一个附近的人功能,你有什么方案?" ...

  2. xargs与exec区别

    平时使用find命令查找出文件的时候有时候后面有时候用-exec有时候用管道加xargs,这2个到底有什么不同?下面就这2个的不同做简单介绍. 零.实验环境 [root@osker /]# find ...

  3. 初探CI,Github调戏Action手记——自动构建并发布

    前言 最近在做脚本的说明文档时使用了vuepress这个东西 前端实在是菜,只能随便写写了 正常写完md文件之后推送至github做版本控制 而前端页面的生成则是在本地,部署也是在本地手工进行 一套下 ...

  4. VirtualBox的四种网络连接方式【转】

    VirtualBox中有4中网络连接方式: NAT Bridged Adapter Internal Host-only Adapter VMWare中有三种,其实他跟VMWare 的网络连接方式都是 ...

  5. std::string::copy函数

    size_t copy (char* s, size_t len, size_t pos = 0) const;

  6. 使用 Chrome 插件 Vimium 打造黑客浏览器

    之前一直用 cVim,与 Vimium 功能类似,但是之后不在更新了,故转战到 Vimium. 简介 官网:http://vimium.github.io/ Vimium 是 Google Chrom ...

  7. A - Smith Numbers POJ

    While skimming his phone directory in 1982, Albert Wilansky, a mathematician of Lehigh University,no ...

  8. C#开发BIMFACE系列32 服务端API之模型对比3:批量获取模型对比状态

    系列目录     [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列31 服务端API之模型对比2:获取模型对比状态>中介绍了根据对比ID,获取一笔记录的对比状态.由于模 ...

  9. 菜鸡试飞----SRCの信息收集手册

    whois信息 微步在线 https://x.threatbook.cn/ 站长之家 http://whois.chinaz.com/ dns信息-----检测是否存在dns域传送漏洞 子域名的收集 ...

  10. [PHP] excel 的导入导出

    其实excel导入导出挺简单的,导出最简单! 其原理都是把数据读出来,导出是从数据库中读出数据,导入是从文件读出数据! 导出写入文件,导入写入数据库! 但是在导入表的时候,用的是PHPExcel, 不 ...