python爬虫之scrapy框架
一、scrapy框架简介
scpay框架官方文档中文版本:https://scrapy-chs.readthedocs.io/zh_CN/latest/index.html
1.1 简介
Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。 Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
1.2 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中间通信的功能组件。
二、scrapy框架的安装
2.1 使用anaconda进行安装scrapy
2.2.1 使用命令安装
pip install scrapy
2.2.2 使用anaconda进行安装
使用anaconda进行安装scrapy,找到对应的scrapy库进行安装即可。
2.2 创建scrapy项目
scrapy startproject spider
项目创建成功。
2.3 创建爬虫程序
创建项目后进入项目文件夹,执行该命令快速创建爬虫程序,后接爬虫名、爬去站点的域名,将在spiders文件夹下生成一个基本框架的爬虫程序。
scrapy genspider [name] [domain]
2.4 保存文件
scrapy crawl [name] -o [file]
该条命令是运行name名字的爬虫,并将数据保存为file,注意file是带格式的文件名,目前支持json、json lines、csv、xml、pickle、marshal。
2.5 scrapy常用的命令
三、scrapy爬虫案例
3.1 创建爬虫项目
scrapy startproject spider
3.2 创建爬虫程序
scrapy genspider job 51job.com
3.3 编写核心爬虫代码
这里采用的是xpath的方式
3.3.1 源代码
import scrapy
class JobSpider(scrapy.Spider):
name = 'job' # 爬虫名字
allowed_domains = ['51job.com'] # 域名
start_urls = ['https://search.51job.com/list/020000,000000,0000,00,9,99,python,2,1.html'] # 爬虫开始采集的网站
def parse(self, response):
'''
解析数据的的,response就是start_url网址返回的数据
:param response:
:return:
'''
# print(response.text)
# 选择出网址
selectors = response.xpath('//div[@class="e"]')
for selector in selectors:
url = selector.xpath('./a/@href').get() # 接着上一步的xpath继续选择要加个.
# print(url)
if url:
yield scrapy.Request(url, callback=self.parseDetail)
def parseDetail(self, response):
salary = response.xpath('//div[@class="cn"]/strong/text()').get(default='')
title = response.xpath('//div[@class="cn"]/h1/text()').get(default='')
# com = response.xpath('//div[@class="er"]/a/text()').get(default='')
items={
'薪资':salary,
'职位':title
}
yield items
# return items
3.3.2 设置请求头
3.4 保存到csv文件当中
scrapy crawl job -o job.csv