https://www.jobui.com/rank/company/
我们先对这个网站做初步的观察,这样我们才能明确项目的爬取目标。
在这里插入图片描述
打开网址后,你会发现:这是职友集网站的地区企业排行榜,里面含有本月人气企业榜、最佳口碑雇主、最多粉丝企业榜和最多评论企业榜四个榜单。
点击【北京字节跳动科技有限公司】,会跳转到这家公司的详情页面,再点击【招聘】,就能看到这家公司正在招聘的所有岗位信息。
初步观察后,我们可以把爬取目标定为:先爬取企业排行榜四个榜单里的公司,再接着爬取这些公司的招聘信息。
每个榜单有10家公司,四个榜单一共就是40家公司。也就是说,我们要先从企业排行榜爬取到这40家公司,再跳转到这40家公司的招聘信息页面,爬取到公司名称、职位、工作地点和招聘要求。
创建项目
创建Scrapy项目的命令:scrapy startproject douban
创建好项目后,你在本地电脑的编译器打开这个Scrapy项目,会看到如下的结构:
定义item
import scrapy
class JobuiItem(scrapy.Item):
#定义了一个继承自scrapy.Item的JobuiItem类
company = scrapy.Field()
#定义公司名称的数据属性
position = scrapy.Field()
#定义职位名称的数据属性
address = scrapy.Field()
#定义工作地点的数据属性
detail = scrapy.Field()
#定义招聘要求的数据属性
创建和编写爬虫文件
定义好item,我们接着要做的是在spiders里创建爬虫文件,命名为jobui_ jobs。
import scrapy
import bs4
from ..items import JobuiItem
class JobuiSpider(scrapy.Spider):
name = 'jobs'
allowed_domains = ['www.jobui.com']
start_urls = ['https://www.jobui.com/rank/company/']
#提取公司id标识和构造公司招聘信息的网址:
def parse(self, response):
#parse是默认处理response的方法
bs = bs4.BeautifulSoup(response.text, 'html.parser')
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)
#用yield语句把构造好的request对象传递给引擎。用scrapy.Request构造request对象。callback参数设置调用parsejob方法。
def parse_job(self, response):
#定义新的处理response的方法parse_job(方法的名字可以自己起)
bs = bs4.BeautifulSoup(response.text, 'html.parser')
#用BeautifulSoup解析response(公司招聘信息的网页源代码)
company = bs.find(id="companyH1").text
#用fin方法提取出公司名称
datas = bs.find_all('li',class_="company-job-list")
#用find_all提取<li class_="company-job-list">标签,里面含有招聘信息的数据
for data in datas:
#遍历datas
item = JobuiItem()
#实例化JobuiItem这个类
item['company'] = company
#把公司名称放回JobuiItem类的company属性里
item['position']=data.find('h3').find('a').text
#提取出职位名称,并把这个数据放回JobuiItem类的position属性里
item['address'] = data.find('span',class_="col80").text
#提取出工作地点,并把这个数据放回JobuiItem类的address属性里
item['detail'] = data.find('span',class_="col150").text
#提取出招聘要求,并把这个数据放回JobuiItem类的detail属性里
yield item
#用yield语句把item传递给引擎
存储文件
存储成csv文件的方法比较简单,只需在settings.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电脑上。