在Scrapy的整个架构中,引擎是可以说有着最高的权利,管理着调度器、下载器、爬虫和数据管道四个重要的组成部分。
这四个组成部分都听命于引擎,一丝不苟的执行引擎下发的命令。
本次,我们使用Scrapy爬取职友集的招聘信息,让我们更加熟练的掌握Scrapy的用法。
一、明确目标
职友集可以通过索引的方式,搜索到全国上百家招聘网站的最新职位:https://www.jobui.com/rank/company/
我们要获取排行榜中的公司名称、招聘职位名称、工作地点和招聘要求。
二、代码实现
(1)创建项目
在命令行或终端中,cd到想要保存爬虫的目录下,输入创建scrapy项目的命令:scrapy startproject class14(名称可自定义)。
然后在蹦迪电脑的编译器中打开这个scrapy项目,如下所示:
(2)定义items
在items.py文件中,定义Items:
import scrapy
# 定义一个继承自scrapy.Item的Class14Item类
class Class14Item(scrapy.Item):
# 定义公司名称的数据属性
company = scrapy.Field()
# 定义职位名称的数据属性
position = scrapy.Field()
# 定义工作地点的数据属性
address = scrapy.Field()
# 定义招聘要求的数据属性
info = scrapy.Field()
(3)创建和编写爬虫文件
在spiders文件夹下创建爬虫文件,我们将它命名为Jobhui_Info。
import scrapy
import bs4
from ..items import Class14Item
# 定义爬虫类Jobhui_Info
class Jobhui_Info(scrapy.Spider):
# 定义爬虫的名称
name = 'Jobhui_Info'
# 定义允许爬虫爬取网址的域名
allowed_domains = ['www.jobhui.com']
# 定义起始网址
start_urls = ['https://www.jobhui.com/rank/company']
def parse(self, response):
# 使用beautifulsoup解析response
bs = bs4.BeautifulSoup(response.text,'html.parser')
# 提取1-10的公司,用find_all提取<ul class_="textList flsty cfix">标签
ul_list = bs.find_all('div',class_='textlist flsty cfix')
for ul in ul_list:
a_list = ul.find_all('a')
for a in a_list:
# 提取出<a>标签的href属性的值,即公司id标识
company_id = a['href']
# 构造出包含公司名称和招聘信息的网址链接的list
url = 'https://www.jobhui.com{}jobs'.format(company_id)
接下来,我们要获取不同公司的招聘职位信息。
从这里开始,就需要重新构造新的requests对象和定义新的方法处理response。
import scrapy
import bs4
from ..items import Class14Item
# 定义爬虫类Jobhui_Info
class Jobhui_Info(scrapy.Spider):
# 定义爬虫的名称
name = 'Jobhui_Info'
# 定义允许爬虫爬取网址的域名
allowed_domains = ['www.jobhui.com']
# 定义起始网址
start_urls = ['https://www.jobhui.com/rank/company']
def parse(self, response):
# 使用beautifulsoup解析response
bs = bs4.BeautifulSoup(response.text,'html.parser')
# 提取1-10的公司,用find_all提取<ul class_="textList flsty cfix">标签
ul_list = bs.find_all('div',class_='textlist flsty cfix')
for ul in ul_list:
a_list = ul.find_all('a')
for a in a_list:
# 提取出<a>标签的href属性的值,即公司id标识
company_id = a['href']
# 构造出包含公司名称和招聘信息的网址链接的list
url = 'https://www.jobhui.com{}jobs'.format(company_id)
# 用yield语句把构造好的request对象传递给引擎。
# 用scrapy.Request构造request对象。callback参数设置调用parse_Jobhui_Info方法。
yield scrapy.Request(url, callback=self.parse_Jobhui_Info)
# 定义新的处理response的方法parse_Jobhui_Info
def parse_Jobhui_Info(self,response):
# 解析源码数据
bs = bs4.BeautifulSoup(response.text,'html.parser')
# 获取公司名称
comany =