python爬虫Scrapy介绍和 Tencent网站招聘数据抓取事例

  • Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。

  • 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。

  • Scrapy 使用了 Twisted['twɪstɪd](其主要对手是Tornado)异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。

 

  • Scrapy Engine(引擎): 负责SpiderItemPipelineDownloaderScheduler中间的通讯,信号、数据传递等。
  • 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的运作流程

代码写好,程序开始运行...

  1. 引擎:Hi!Spider, 你要处理哪一个网站?

  2. Spider:老大要我处理xxxx.com。

  3. 引擎:你把第一个需要处理的URL给我吧。

  4. Spider:给你,第一个URL是xxxxxxx.com。

  5. 引擎:Hi!调度器,我这有request请求你帮我排序入队一下。

  6. 调度器:好的,正在处理你等一下。

  7. 引擎:Hi!调度器,把你处理好的request请求给我。

  8. 调度器:给你,这是我处理好的request

  9. 引擎:Hi!下载器,你按照老大的下载中间件的设置帮我下载一下这个request请求

  10. 下载器:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载)

  11. 引擎:Hi!Spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()这个函数处理的)

  12. Spider:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。

  13. 引擎:Hi !管道 我这儿有个item你帮我处理一下!调度器!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。

  14. 管道``调度器:好的,现在就做!

       以上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就是这么简单。

 



 

 

posted @ 2017-10-31 17:22  apecoder  阅读(186)  评论(0)    收藏  举报