目标:通过职友集,搜索全国上百家招聘网站的最新职位。并将【公司、职位、地址、招聘信息】存储成csv文件。
网址:https://www.jobui.com/rank/company/
1、输入创建Scrapy项目的命令:scrapy startproject jobui
在终端输入命令scrapy startproject jobui后会出现以下结果
终端:
文件夹:
2、在spiders文件夹下新建一个jobui_jobs.py文件
jobui_jobs.py程序
import scrapy
import bs4
from ..items import JobuiItem
class JobuiSpider(scrapy.Spider):
name = 'jobs'
allowed_domins = ['https://www.jobui.com']
start_urls = ['https://www.jobui.com/rank/company/']
def parse(self,response):
bs = bs4.BeautifulSoup(response.text,'html.parser')
data_list = bs.find_all('ul',class_="textList flsty cfix")
for data_1 in data_list:
a_list = data_1.find_all('a')
for a in a_list:
company_id = a['href']
real_url = 'https://www.jobui.com' + company_id + 'jobs'
yield scrapy.Request(real_url,callback = self.parse_job)
def parse_job(self,response):
bs = bs4.BeautifulSoup(response.text,'html.parser')
company = bs.find('h1',id='companyH1')['data-companyname']
datas = bs.find_all('div',class_="job-simple-content")
for data in datas:
item = JobuiItem()
item['company'] = company
item['position'] = data.find('h3').text
item['address'] = data.find_all('span')[0].text
item['detail'] = data.find_all('span')[1].text
yield item
3、items.py程序
import scrapy
class JobuiItem(scrapy.Item):
# define the fields for your item here like:
company = scrapy.Field()
position = scrapy.Field()
address = scrapy.Field()
detail = scrapy.Field()
4、pipelines.py程序
# 存储为Excel文件,我们依旧是用openpyxl模块来实现
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
import openpyxl
class JobuiPipeline(object):
def __init__(self):
#初始化函数 当类实例化时这个方法会自启动
self.wb = openpyxl.Workbook() # 创建工作簿
self.ws = self.wb.active # 定位活动表
self.ws.append(['公司','职位','地址','招聘信息',''])
def process_item(self, item, spider):
#process_item是默认的处理item的方法,就像parse是默认处理response的方法
company_datas = [item['company'],item['position'],item['address'],item['detail']]
self.ws.append(company_datas)
#把公司名称、职位名称、工作地点和招聘要求都写成列表的形式,赋值给line
return item
def close_spider(self,spider):
self.wb.save('./jobui.xlsx')
self.wb.close()
5、settings.py程序
BOT_NAME = 'jobui'
SPIDER_MODULES = ['jobui.spiders']
NEWSPIDER_MODULE = 'jobui.spiders'
# USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.3'
ROBOTSTXT_OBEY = False
# 下载延迟0.5秒
DOWNLOAD_DELAY = 0.5
# 存储成Excel文件的方法要稍微复杂一些,我们需要先在setting.py里设置启用ITEM_PIPELINES
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'jobui.pipelines.JobuiPipeline': 300,
}
FEED_URI = './storage/data/%(name)s.csv'
# FEED_URI是导出文件的路径。'./storage/data/%(name)s.csv',就是把存储的文件放到与settings.py文件同级的storage文件夹的data子文件夹里。
FEED_FORMAT = 'CSV'
# FEED_FORMAT 是导出数据格式,写CSV就能得到CSV格式。
FEED_EXPORT_ENCODING = 'ansi'
# FEED_EXPORT_ENCODING 是导出文件编码,ansi是一种在windows上的编码格式
6、在jobui文件夹下添加main.py文件
main.py程序
from scrapy import cmdline
cmdline.execute(['scrapy','crawl','jobs'])
7、运行main.py文件
得到以下表格:
个人说明:
我在学习这一关的过程中,由于进入链接后出现的界面以及Elements中各项信息的元素、属性都与教程中的有区别,因此我原来的程序一直出现各种错误,并且一直不能将我爬取的信息下载csv文件中。即使我直接copy教程中的所有程序并且载程序没报错的情况下,依然不能得到我所需要的信息,csv文件一直都是只有表头【公司、职位、地址、招聘信息】这几个。
我尝试了上网查找其他人的答案,但是他们的程序还是不能解决我的问题(其实我也就只看了两篇博客)。我花了一天时间去搞清楚整个项目,终于最后得到了我想要的以上那个表格。
以下是【教程中的操作】和【我的操作】的区别
原教程中,【公司、职位、地址、招聘信息】这几个信息的Elements元素、属性如下所示:
公司:
职位、地址、招聘信息:
以下是教程中【公司、职位、地址、招聘信息】这几个信息的Elements元素、属性的总结:
而我找到的【公司、职位、地址、招聘信息】几个信息的Elements元素、属性如下所示:
公司:
职位、地址、招聘信息:
以下是我找到的【公司、职位、地址、招聘信息】这几个信息的Elements元素、属性的总结:
数据 | 元素 | 属性 |
---|---|---|
公司名称 | h1 | id='companyH1' |
职位名称 | h3 | 纯文本 |
工作地点 | span(第0个元素) | 纯文本 |
招聘要求 | span(第1个元素) | 纯文本 |