Scrapy 是用 Python 实现的一个爬虫应用框架。
Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
-
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
pip install scrapy
创建一个项目
scrapy startproject 项目名
scrapy startproject my_spider
项目目录
在settings里将ROBOTSTXT_OBEY设置为false
ROBOTSTXT_OBEY 是设置是否遵循网站的robots协议,robots协议是网站设置允许或禁止哪些爬虫,所以一般都设置为false
ROBOTSTXT_OBEY = False
创建爬虫
以智通人才招聘为例
新建的爬虫文件
# -*- coding: utf-8 -*- import scrapy class JobspiderSpider(scrapy.Spider): name = 'jobspider' allowed_domains = ['www.job5156.com/s/result/kt0_kw-python/'] start_urls = ['http://www.job5156.com/s/result/kt0_kw-python//'] def parse(self, response): # 处理request请求url之后的响应对象 pass
写parse函数
parse是用来处理请求之后的响应对象(即response)的
先测试一下,获取第一个职位的名称
def parse(self, response): """ 解析url返回的响应对象 匹配下一次要访问的路径 提取item :param response: :return: """ print("#####################") # print(response) ret = response.selector.xpath('//ul[@class="position_content"]/li[1]/div/div[2]/div/p/a/@title').extract() print(ret) print("#####################")
使用命令行启动
输出的内容比较多,所以使用###############提示
scrapy crawl 爬虫名称
成功获取,现在来获取详细的信息并写入到csv文件
先在items里定义要抓取的数据字段
class MySpiderItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() # 岗位名称 position = scrapy.Field() # 职位网址 position_url = scrapy.Field() # 薪水 salary = scrapy.Field() # 公司名称 company = scrapy.Field() # 公司主营业务 professional_work = scrapy.Field() # 更新时间 update_time = scrapy.Field() # 公司福利 welfare = scrapy.Field() # 招聘要求 require = scrapy.Field()
parse抓取数据
def parse(self, response): """ 解析url返回的响应对象 匹配下一次要访问的路径 提取item :param response: :return: """ print("#####################") # print(response) position_node_list = response.xpath('//ul[@class="position_content"]/li') items = [] for position_node in position_node_list: # 获取详细信息 position = position_node.xpath('./div/div[2]/div/p/a/@title').extract() position_url = position_node.xpath('./div/div[2]/div/p/a/@href').extract() salary = position_node.xpath('./div/div[2]/div/span/text()').extract() company = position_node.xpath('./div/div[2]/a[@class="com_name"]/@title').extract() require = position_node.xpath('./div/div[3]/div/text()').extract() # 主要业务 professional_work = position_node.xpath('./div/div[3]/p/span/text()').extract() update_time = position_node.xpath('./div/div[4]/p/span/text()').extract() welfare_node = position_node.xpath('./div/div[4]/div') welfare = welfare_node[0].xpath('./span/text()').extract() # 实例化MySpiderItem()对象 item = MySpiderItem() item['position'] = position[0] item['position_url'] = position_url[0] item['salary'] = salary[0] item['company'] = company[0] item['require'] = require[0].strip().replace(' ', '').replace('\r\n', '') item['professional_work'] = professional_work[0] item['update_time'] = update_time[0] item['welfare'] = welfare items.append(item) # 抛出items,保存到csv return items
运行程序并保存到csv文件
scrapy crawl jobspider -o 文件路径
出现如下界面就爬取成功
出现job.csv文件
csv数据