Scrapy爬虫从入门到实例精讲(上)

最近几天一直在学习Scrapy这个框架,打算用几篇文章来总结一下自己这段时间学习的知识。

      首先我们需要简单介绍一下Scrapy是个什么东西。先来看一张图,是从官网上弄下来的。


Scrapy是一个框架,这个框架是用来爬取网站数据的,并且该框架为我们提供了各种接口,包括爬虫接口,管道接口,数据

存储接口以及数据库访问接口等等。

上图中绿色的箭头表示数据的流向,从Scheduler开始发起请求,返回数据后使用Spider来抓取我们想要的数据,之后把

数据交给相应的数据库,如果返回的数据中包含链接,则Scheduler再次发起请求,直到所有请求发送完毕。

那么就先从一个最简单的例子开始,当然开始之前还是要进行相应的准备工作。

  • 安装Scrapy
	pip install Scrapy

大家注意在安装Scrapy时可能会遇到很多错误,特别是windows系统,这是因为Scrapy需要的依赖库很多,而且每一个都有相应的版本要求。我在安装的时候就遇到了一个问题“Miscrosoft visual studio 14.0 is required”,在网上查了一下,这是因为缺少一个叫Twisted-17.9.0-cp36-cp36m-win32.whl的文件,在网上下载了这个文件,具体要下载哪个版本的文件要根据你的电脑是32位还是64位来定。安装该文件后,再运行pip install Scrapy就可以了。当然你在安装时可能还会遇到其他的问题,这里就不一一列举了。
安装好Scrapy后,就可以进行数据爬取了。今天我们先用一个单一的py文件来爬取网络数据,明天我们再使用一个工程去爬取。
这个程序是要爬取一个网站所有人员的发言,爬取后存储为一个.csv文件并且保存到本地。
# -*- coding:utf-8 -*-
import io
import sys
import scrapy


sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
class JokeSpider(scrapy.Spider):
	"""docstring for JulyeduSpider"""
	name = 'jokespider'
	start_urls = ['http://quotes.toscrape.com/tag/humor/']

	def parse(self, response):
		for joke in response.xpath('//div[@class="quote"]'):
			print(joke.xpath('span[1]/text()').extract_first())
			print(joke.xpath('span[2]/small/text()').extract_first())
			# print(joke.xpath('a/p[@class="course-info-tip info-time"][1]/text()').extract_first())

			yield {'content':joke.xpath('span[1]/text()').extract_first(),
			'Author':joke.xpath('span[2]/small/text()').extract_first()}
		
		# 得到下一页的网址,并且判断是否有下一页
		next_page = response.xpath('//li[@class="next"]/a/@href').extract_first()
		if next_page is not None:
			next_page = response.urljoin(next_page)
			yield scrapy.Request(next_page, callback = self.parse)
用这个例子来简单说明一下Scrapy是如何使用的。
代码开始还是解决中文编码的问题,之后定义了一个类JokeSpider,当然这个名字可以自己起。在class里有两个变量,name和start_urls,这两个名字是并不可少,一个是给这个爬虫一个名字,另一个告诉Scrapy爬虫的起始网页地址,从哪个网站开始爬取。
得到数据后,定义了解析数据的函数parse。这里采用xpath的处理办法,当然你也可以使用selenium webdriver或者BeautifulSoup,或者其他你擅长的方法进行爬取。框架就是有这个好处,这些东西框架都已经集成好了,你用哪个都可以。
相应的数据得到后,就是返回数据了。这里使用了yield这个关键字,用迭代的方法返回数据,减少内存的开销。其实python中的yield关键字挺不好理解的,建议大家花点时间好好研究一下,有些公司在面试时就爱问这个东西。推荐大家看看廖雪峰的一篇文章,里面介绍的很详细。https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
存储数据后就要处理“下一页”的问题了,首先要判断该页面有没有“下一页(next)”,如果有就再次发起请求,然后再parse取回来的数据。 这里使用了框架提供的urljoin函数,通过
	next_page = response.xpath('//li[@class="next"]/a/@href').extract_first()
得到的网页“ 下一页”的链接地址是一个不完整的地址,通过Scrapy提供的urljoin函数可以帮我们把网页的链接地址补充完整。补充完整之后就再次发起请求,同时提供一个回调函数,当然我们这里的回调函数还是parse,即进行递归调用。
上述代码完成后就需要在命令行中运行Scrapy,找到自己的该py文件的路径,然后运行下面的语句


我给该文件起名为“ScrapySpider2.py”,运行上面这个命令。runspider命令是运行一个单一的py文件,今后我们还会说到更多Scrapy的命令。后面的-o是输出的意思,意思是将ScrapySpider.py的输出结果保存在该目录下的一个叫ScrapySpider2.csv文件,当然你也可以输出xml或者json文件等等,这些文件格式Scrapy都是支持的,主要取决于你后台数据库的类型。
下面就是我运行之后结果的截图,仅供参考

这是使用Scrapy最简单的一种情况,今后几天还会更新有关Scrapy更多的内容。
与您共勉!

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值