scrapy 快速入门
来源:互联网 发布:传智播客c语言教程 编辑:程序博客网 时间:2024/06/05 19:35
安装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 scrapyclass 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 scrapyclass 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 scrapyclass 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这个爬虫框架,请查阅相关文档进一步学习。
- scrapy 快速入门
- 【scrapy】学习Scrapy入门
- Scrapy入门--Scrapy是什么
- <scrapy>scrapy入门学习
- 【scrapy】学习Scrapy入门
- Scrapy入门
- scrapy入门
- Scrapy入门
- Scrapy入门
- Scrapy入门
- Scrapy入门
- scrapy入门
- Scrapy 入门
- scrapy入门
- scrapy 入门
- scrapy入门
- 快速安装scrapy
- Scrapy爬虫入门
- 从中层开发到高级架构及管理的思考【草稿】
- 解决secureCRT 远程连接是空白界面问题
- 2.数据链路层
- numpy.random中的shuffle和permutation
- 函数式接口
- scrapy 快速入门
- 关于Eclipse+CDT+Cygwin配置C/C++开发环境
- HTTP状态码
- ShowCnMsgOnDebian
- 腾讯笔试题:输入16的倍数个字符串,按格式排版输出
- JavaScript学习-screen对象
- 最小二乘法理论、推导、算法
- UITableView的懒人封装(几句代码搞定网络加载,上下拉刷新)
- 在Ubuntu上用python3安装caffe(仅CPU)