爬取招聘信息并保存到xlsx
爬虫实现
定义数据(第一步)先知道自己要什么数据再去爬取
import scrapy
class JobuiItem(scrapy.Item):
company=scrapy.Field()
#定义公司名称的数据属性
position = scrapy.Field()
#定义职位名称的数据属性
address = scrapy.Field()
#定义工作地点的数据属性
detail = scrapy.Field()
#定义招聘要求的数据属性
编辑爬虫(第二步)
新加爬虫文件
import scrapy
import bs4
from ..items import JobuiItem
class JobuiSpider(scrapy.Spider):
name='jobui'
#名字要对应setting文件里的BOT_NAME字段,不然编译报错
allowed_domins=["https://www.jobui.com"]
#定义允许爬虫爬取网址的域名——职友集网站的域名
start_urls=['https://www.jobui.com/rank/company/']
#定义起始网址——职友集企业排行榜的网址
def parse(self,response):
#parse是默认处理response的方法
bs=bs4.BeautifulSoup(response.text,'html.parser')
#用BeautifulSoup解析response(企业排行榜的网页源代码)
ul_list=bs.find_all('ul',class_='textList flsty cfix')
for ul in ul_list:
a_list=ul.find_all('a')
for a in a_list:
company_id=a['href']
url='https://www.jobui.com{id}jobs'
real_url=url.format(id=company_id)
yield scrapy.Request(real_url,callback=self.parse_job)
def parse_job(self,response):
bs=bs4.BeautifulSoup(response.text,'html.parser')
company=bs.find(id="companyH1").text
datas=bs.find_all("div",class_='c-job-list')
for data in datas:
item=JobuiItem()
item['company']=company
item['position']=data.find('h3').text
item['address']=data.find(class_='job-desc').find('span').text
item['detail']=data.find_all('span')[1].text
yield item
代码该位置需要根据实际网页情况获取数据
yield 的意思相当于return 返回的意思,每次有新的item对象生成,也就是每次循环,新的数据请求回来都会返回一个新的item到引擎,也是每一行的数据的意思,callback函数是说,执行完了这个请求再执行的函数,思想可以参考前端的ajax请求,都是等待请求完成之后做的动作
配置文件的设置setting.py
FEED_URI='./storage/data/%(name)s.csv'
FEED_FORMAT='CSV'
FEED_EXPORT_ENCODING='ansi'
FEED_URI是导出文件的路径。’./storage/data/%(name)s.csv’,就是把存储的文件放到与settings.py文件同级的storage文件夹的data子文件夹里。
FEED_FORMAT 是导出数据格式,写CSV就能得到CSV格式。
FEED_EXPORT_ENCODING 是导出文件编码,ansi是一种在windows上的编码格式,你也可以把它变成utf-8用在mac电脑上。
上面配置没有设置过,所以保存数据的xlsx表,保存在setting的同级文件
#取消`ITEM_PIPELINES`的注释后:
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'jobuitest.pipelines.JobuitestPipeline': 300,
}
文件存储编写
import openpyxl
class JobuiPipeline(object):
#定义一个JobuiPipeline类,负责处理item
def __init__(self):
#初始化函数 当类实例化时这个方法会自启动
self.wb=openpyxl.Workbook()
#创建工作薄
self.ws=self.wb.active
#定位活动表
self.ws.append(['公司','职位','地址','招聘信息'])
#用append函数往表格添加表头
def process_item(self,item,spider):
#process_item是默认的处理item的方法,就像parse是默认处理response的方法
line=[item['company'],item['position'],item['address'],item['detail']]
#把公司名称、职位名称、工作地点和招聘要求都写成列表的形式,赋值给line
self.ws.append(line)
#用append函数把公司名称、职位名称、工作地点和招聘要求的数据都添加进表格
return item
def close_spider(self,spider):
#close_spider是当爬虫结束运行时,这个方法就会执行
self.wb.save('./jobui.xlsx')
#保存文件
self.wb.close()
#关闭文件