python爬虫Scrapy介绍和 Tencent网站招聘数据抓取事例
-
Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。
-
框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。
- Scrapy 使用了 Twisted
['twɪstɪd](其主要对手是Tornado)异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。

Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
Scrapy的运作流程
代码写好,程序开始运行...
-
引擎:Hi!Spider, 你要处理哪一个网站? -
Spider:老大要我处理xxxx.com。 -
引擎:你把第一个需要处理的URL给我吧。 -
Spider:给你,第一个URL是xxxxxxx.com。 -
引擎:Hi!调度器,我这有request请求你帮我排序入队一下。 -
调度器:好的,正在处理你等一下。 -
引擎:Hi!调度器,把你处理好的request请求给我。 -
调度器:给你,这是我处理好的request -
引擎:Hi!下载器,你按照老大的下载中间件的设置帮我下载一下这个request请求 -
下载器:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载) -
引擎:Hi!Spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()这个函数处理的) -
Spider:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。 -
引擎:Hi !管道我这儿有个item你帮我处理一下!调度器!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。 -
管道``调度器:好的,现在就做!
以上Scrapy的简单介绍,下面写一个简单的事例来讲解如何用Scrapy来抓取数据。
要用Scrapy框架来做开发,首先要安装Scrapy包:
Windows 安装方式
- Python 2 / 3
- 升级pip版本:
pip install --upgrade pip - 通过pip 安装 Scrapy 框架
pip install Scrapy
有时候在windows可以安装不成功,这时候要先安装win32API,python如何安装win32api不知道,百度一下就可以了。
Ubuntu 需要9.10或以上版本安装方式
- Python 2 / 3
- 安装非Python的依赖
sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev - 通过pip 安装 Scrapy 框架
sudo pip install scrapy
新建项目
在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目录中,运行下列命令:
scrapy startproject mySpider
比如在windows下用cmd创建如下图,当然linux也是一样

此上图中,我在D盘根目录下直接创建了一名为mySpider的Scrapy项目
创建完Scrapy项目后,我们直接找到项目创建的目录,直接用Pycharm打开就就行,如下图:

此图就是Scrapy项目的目录,此目录我一一来说明
下面来简单介绍一下各个主要文件的作用:
scrapy.cfg :项目的配置文件
mySpider/ :项目的Python模块,将会从这里引用代码
mySpider/items.py :项目的目标文件
mySpider/pipelines.py :项目的管道文件
mySpider/settings.py :项目的设置文件
mySpider/spiders/ :存储爬虫代码目录
此图中还有一个tencent.json文件并不项目本身文件,是我自已后创建的,在此说明下。
我们打算抓取:tencent.com 网站里的所有的招聘信息如下:

上面这些数据如何抓取呢,首先,我们在项目下spiders文件下新建一个名为:TencenSpider.py的文件,此文件中写我们的代码,如下图:

下一步,才到了我们开始写代码的时候了,TencenSpider.py代码如下:
1 import scrapy 2 from myScrapy.items import ItcastItem 3 4 # 创建一个爬虫类 5 class TencenSpider(scrapy.Spider): 6 7 # 爬虫名 8 name = "tencent" 9 10 # 允许爬虫作用的范围 11 allowed_domains = ["tencent.com"] 12 13 14 # 爬虫其实的url 15 url = "http://hr.tencent.com/position.php?&start=" 16 offset = 0 17 18 #因为数据是多页,所以要动态爬取 19 start_urls=[url + str(offset)] 20 21 #此方法不能随便创建,名称一定要是parse 22 def parse(self, response): 23 24 # 通过scrapy自带的xpath匹配出所有老师的根节点列表集合 25 for each in response.xpath("//tr[@class='even'] | //tr[@class='odd']"): 26 27 # Item对象用来保存数据的 28 item = ItcastItem() 29 30 item['positionname'] = each.xpath("./td[1]/a/text()").extract()[0] 31 # 详情连接 32 item['positionlink'] = each.xpath("./td[1]/a/@href").extract()[0] 33 # 职位类别 34 item['positionType'] = each.xpath("./td[2]/text()").extract()[0] 35 # 招聘人数 36 item['peopleNum'] = each.xpath("./td[3]/text()").extract()[0] 37 # 工作地点 38 item['workLocation'] = each.xpath("./td[4]/text()").extract()[0] 39 # 发布时间 40 item['publishTime'] = each.xpath("./td[5]/text()").extract()[0] 41 42 yield item 43 44 #当爬到数据少于2438条时,每爬一次加10条 45 if self.offset< 2438: 46 self.offset +=10 47 48 #加完10条后,重新爬取数据 49 yield scrapy.Request(self.url+str(self.offset),callback=self.parse)
上面代码中用到了from myScrapy.items import ItcastItem那这是什么呢,其实ItcastItem是我们在项目根目录下items中定义的,如下:
1 import scrapy 2 3 class ItcastItem(scrapy.Item): 4 # 姓名 5 positionname = scrapy.Field() 6 # 详情连接 7 positionlink = scrapy.Field() 8 # 职位类别 9 positionType = scrapy.Field() 10 # 招聘人数 11 peopleNum = scrapy.Field() 12 # 工作地点 13 workLocation = scrapy.Field() 14 # 发布时间 15 publishTime = scrapy.Field()
此文件就是定义爬虫要返回的哪些数据类,可以看作C#或者java中一个实体类,用来接受数据的。
写完这此后,在PyCharm的Terminal中输入命令:scrapy crawl tencent -o tencent.json -s FEED_EXPORT_ENCODING=utf-8
scrapy crawl tencent 这是运行爬虫项目,tencent是爬虫名称,这个名称就是我们在代码中定义的名称。
-o tencent.json -o 是保存的意思,tencent.json是保存的文件名称。
-s FEED_EXPORT_ENCODING=utf-8 就保存文件用utf-8格式保存
这样就整个个爬虫项目就完成了,这时我们就会看到输出内容了,同时项目也会出动创建一个tencent.json文件来保存你从tencent爬下来的数据,如下图:

人生苦短,我用python,对于爬虫用python就是这么简单。

浙公网安备 33010602011771号