高级爬虫: 高效无忧的 Scrapy 爬虫库
学习资料:
前面的教程我们已经学会了如何写出自己的爬虫, 轻轻松松就能写出一个高性能的爬虫. 如果你想更高效的开发, 爬取网页, 记录数据库, Scrapy 是值得一推的. 它是一个爬虫的框架, 而不是一个简单的爬虫. 它整合了爬取, 处理数据, 存储数据的一条龙服务. 如果你只需要偶尔的一两次爬爬网页, 前面的教程已经够了, 如果你需要每天靠爬虫吃饭, Scrapy 还是有必要了解的.
这个教程教你写出一个 Scrapy 形式的爬虫, 带你入门 Scrapy, 但是 Scrapy 不仅仅只有爬虫, 你需要学习更多. 那学习 Scrapy 的地方, 当然是他们自家网站咯.
Scrapy 的优势 ¶
Scrapy 是一个整合了的爬虫框架, 有着非常健全的管理系统. 而且它也是分布式爬虫, 但是比我们之前写的那个分布式爬虫高级多了. 下面就是 Scrapy 的框架示意图(来源). 它的管理体系非常复杂. 但是特别高效. 让你又刷网页, 又下载, 同时能处理数据. 简直千手观音呀.
而且做 Scrapy 的项目, 绝对不是只需要写一个脚本就能解决的. 为了把你带入门, 这次我们只写一个脚本, 只涉及里面的爬虫(spider)部分. 其他的部分你可以在这里深入学习.
- 官网教程 英文, 中文
- JasonDing 的学习Scrapy入门
- young-hz 的Scrapy研究探索系列
Scrapy 爬虫 ¶
好了, 我们开始今天的简单 Scrapy 教程吧. 首先你得安装 Scrapy. 在 terminal 或者 cmd 使用 pip 安装就好.
# python 2+
pip install scrapy
# python 3+
pip3 install scrapy
如果安装遇到任何问题, 它们家的网站是个好去处.
我们之前有做过爬取 莫烦Python 全网的信息. 用多进程 和异步爬取都做过. 这次, 我们就用 Scrapy 来实现这样的一个爬虫. 剧透一下, 做前两个的时候, 代码行数差不多都是 50+ 行, 但是 scrapy 只需要用 20+ 行代码就解决的上面的事. 哈哈, 功能强大吧.
我们导入 scrapy 模块, 并创建一个 spider 的 class. 并继承 scrapy.Spider
,
一定还要给这个 spider 一个名字, 我就用 mofan
好了, 因为是爬 莫烦Python 的.
给定一些初始爬取的网页, 写在 start_urls
里. 这里特别要提的是:
之前我们用 python 的 set 来去除重复的 url, 在 scrapy 中, 这是不需要的, 因为它自动帮你去重.
这可省心多了. 如果你想一次性看到全部代码, 请看到我的 github.
import scrapy
class MofanSpider(scrapy.Spider):
name = "mofan"
start_urls = [
'https://morvanzhou.github.io/',
]
# unseen = set()
# seen = set() # 我们不在需要 set 了, 它自动去重
接着我们还要定义这个 class 中的一个功能就能完事了. 我们使用 python 的 yield
来返回搜集到的数据
(为什么是yield? 因为在 scrapy 中也有异步处理, 加速整体效率).
这些 title 和 url 的数据, 我们都是用 scrapy 中抓取信息的方式.
class MofanSpider(scrapy.Spider):
...
def parse(self, response):
yield { # return some results
'title': response.css('h1::text').extract_first(default='Missing').strip().replace('"', ""),
'url': response.url,
}
urls = response.css('a::attr(href)').re(r'^/.+?/$') # find all sub urls
for url in urls:
yield response.follow(url, callback=self.parse) # it will filter duplication automatically
然后在这个response网页中筛选 urls
, 这里我们也不需要使用 urljoin()
这种功能给 url 改变形式. 它在 follow()
这一步会自动检测 url 的格式.
(真是省心啊~), 然后对于每个找到的 url, 然后 yield 重新使用 self.parse()
来爬取, 这里又是自动去重!
Scrapy 仿佛知道你最不想做什么, 它自动帮你都做好了. 开心~
最后需要运行的时候有点不同, 你需要在 terminal 或 cmd 中运行这个爬虫. 而且还能帮你保存刚刚 yield 的 {title:, url:}
的结果.
runspider 5-2-scrapy.py
就是选择你要跑的这个 Python 文件.
$ scrapy runspider 5-2-scrapy.py -o res.json
-o res.json
这个 -o
就是输出的指令, 你可以在那个文件夹中找到一个名字叫 res.json
的文件, 里面存有所有找到的 {title:, url:}
.
其实我们今天只做了 scrapy 中的爬虫, 一个正常的 scrapy 项目还包括有很多其他的内容(见下面). 这个教程就不会细说了, 因为学好 scrapy 还是比较麻烦的. 你可以在上面推荐给你的链接中, 继续深入学习 scrapy.
tutorial/
scrapy.cfg # deploy configuration file
tutorial/ # project's Python module, you'll import your code from here
__init__.py
items.py # project items definition file
middlewares.py # project middlewares file
pipelines.py # project pipelines file
settings.py # project settings file
spiders/ # a directory where you'll later put your spiders
__init__.py
相关教程
分享到:
如果你觉得这篇文章或视频对你的学习很有帮助, 请你也分享它, 让它能再次帮助到更多的需要学习的人.
莫烦没有正式的经济来源, 如果你也想支持 莫烦Python 并看到更好的教学内容, 赞助他一点点, 作为鼓励他继续开源的动力.