爬虫框架之Scrapy -- 爬取某招聘网站(一)

案例1:爬取内容存储为一个文件

  1. Scrapy框架的组织架构、运行原理介绍
    爬虫框架之Scrapy -- 爬取某招聘网站(一)_第1张图片
组件名称 组件作用
Scrapy Engine:Scrapy引擎 Scrapy引擎是整个框架的核心,其作用是控制调试器、下载器、爬虫。
Scheduler: 调度器 由它来决定下一个要抓取的网址是什么,同时去除重复的网址。
Downloader: 下载器 负责下载引擎的request请求,并将获取到的Responses馈送到引擎,然后引擎将其发送给spider。
Item Pipeline: 管道 负责处理被爬虫提取的item,典型的任务包括清理,验证和持久性(如将项目存储在数据库中)。
Spider: 爬虫 负责处理所有 Responses,从中分析提取数据,获取 Item 字段需要的数据,并将需要跟进的 URL 提交给引擎,再次进入调度器。
Downloader Middlewares: 下载中间件 Scrapy的下载中间件组件。
Spider Middlewares: Spider中间件 Scrapy的Spider中间件组件。
  1. 构建一个爬虫项目
    cmd执行命令:scrapy startproject 项目名
    爬虫框架之Scrapy -- 爬取某招聘网站(一)_第2张图片
    爬虫框架之Scrapy -- 爬取某招聘网站(一)_第3张图片
  2. 爬取页面分析
    https://www.zhipin.com/
    https://www.zhipin.com/c101210100-p100199/?ka=search_100199
    爬虫框架之Scrapy -- 爬取某招聘网站(一)_第4张图片
  3. 编写items文件
    items文件里面存放的东西是你需要的数据项,而且items的编写很简单,只需要继承scrapy.Item类,并将所有字段都定义为scrapy.Field类型就可以了,Field对象用来对每个字段指定元数据。
import scrapy

class ZhipinSpiderItem(scrapy.Item):
    # 职位名称
    job_name = scrapy.Field()
    # 职位薪酬
    job_money = scrapy.Field()
    # 公司名称
    job_company = scrapy.Field()
    # 联系人
    job_contacts = scrapy.Field()
    # 工作地点
    job_position = scrapy.Field()
    # 工作经验
    job_experience = scrapy.Field()
    # 学历要求
    job_education = scrapy.Field()
    # 公司类型
    job_type = scrapy.Field()
    # 公司规模
    job_scale = scrapy.Field()
    # 公司人数
    job_num = scrapy.Field()
  1. chrome插件xpath介绍
    使用chrome的xpath辅助插件,节省了我们在写爬虫或做网页分析的时候,定位以及获取xpath路径的时间。
    爬虫框架之Scrapy -- 爬取某招聘网站(一)_第5张图片
    爬虫框架之Scrapy -- 爬取某招聘网站(一)_第6张图片
  2. 编写settings文件
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False
  1. 编写spider文件
import scrapy
from scrapy import Request

from zhipin_spider.items import ZhipinSpiderItem

class ZhipinSpiderSpider(scrapy.Spider):
	name = 'zhipin_spider'
	allowed_domains = ['https://www.zhipin.com']
	start_urls = ['https://www.zhipin.com/c101210100-p100199/?ka=search_100199']

	def start_requests (self) :
		urls = ['https://www.zhipin.com/c101210100-p100199/?ka=search_100199']
		for url in urls :
			yield scrapy.Request (url=url, callback=self.parse)

	def parse(self, response):
		job_list = response.xpath ("//div[@class='job-list']//ul//li")
		for i_item in job_list:
			job_item = ZhipinSpiderItem()
			job_item ['job_name'] = i_item.xpath (".//div[@class='info-primary']//h3[@class='name']//div[@class='job-title']/text()").extract_first()
			job_item ['job_money'] = i_item.xpath (".//div[@class='info-primary']//h3[@class='name']//span[@class='red']/text()").extract_first()
			job_item ['job_company'] = i_item.xpath (".//div[@class='company-text']//h3[@class='name']/a/text()").extract_first()
			job_item ['job_contacts'] = i_item.xpath (".//div[@class='info-publis']//h3[@class='name']/text()[1]").extract_first()
			job_item ['job_position'] = i_item.xpath (".//div[@class='info-primary']//p/text()[1]").extract_first()
			job_item ['job_experience'] = i_item.xpath (".//div[@class='info-primary']//p/text()[2]").extract_first()
			job_item ['job_education'] = i_item.xpath (".//div[@class='info-primary']//p/text()[3]").extract_first()
			job_item ['job_type'] = i_item.xpath (".//div[@class='info-company']//p/text()[1]").extract_first ()
			job_item ['job_scale'] = i_item.xpath (".//div[@class='info-company']//p/text()[2]").extract_first ()
			job_item ['job_num'] = i_item.xpath (".//div[@class='info-company']//p/text()[3]").extract_first ()
			yield job_item
		next_link = response.xpath (".//div[@class='page']//a[@class='next']/@href").extract()
		if next_link:
			next_link = next_link[0]
			yield scrapy.Request("https://www.zhipin.com" + next_link,callback = self.parse,dont_filter=True)
  1. 执行爬虫
    首先编写一个启动文件(也可以直接命令行进入项目执行命令:scrapy crawl 爬虫名称)
    目类下新建一个py文件,这里我命名为start . py。
from scrapy import  cmdline
cmdline.execute("scrapy crawl zhipin_spider".split())

爬虫框架之Scrapy -- 爬取某招聘网站(一)_第7张图片
运行start . py
爬虫框架之Scrapy -- 爬取某招聘网站(一)_第8张图片
也可以保存为.json格式或者.csv格式
scrapy crawl zhipin_spider -o data.json
scrapy crawl zhipin_spider -o data.csv
注意:若保存为.csv格式可能会出现乱码问题,解决办法如下:
爬虫框架之Scrapy -- 爬取某招聘网站(一)_第9张图片
选择UTF-8-BOM,保存文件

保存后再次打开文件

你可能感兴趣的:(爬虫)