scrapy python爬虫框架抓取BOSS直聘招聘信息生成词云
最近对Python 方面的新技术非常感兴趣,想知道那些大公司都在使用了哪些python技术及相关技术。在BOSS直聘上搜索“python” 关键字可以看到使用Python的公司的招聘信息,通过分析他们的招聘信息来进行python技术的针对性学习。
BOSS直聘:
效果图:
下面是爬虫的具体步骤:
-
安装scrapy
具体的使用可以看作者的另一篇博文: Scrapy安装与使用
-
分析网站
BOSS 的搜索结果页的url是:
https://www.zhipin.com/c101020100/?query=python&page=3
不难知道,其中 query是查询参数,page是当前页面,根据这两个我们就很好写爬虫了。
-
开始编写岗位列表页爬虫
生成scrapy项目:
scrapy startproject boss_job
进入项目目录下:
cd boss_job
生成spider
scrapy genspider job_info zhipin.com
在 job_info 爬虫中, start_requests控制起始url:
def start_requests(self): keyword = 'python' query_job_url = "https://www.zhipin.com/c101020100/?query={keyword}&page={page}&ka=page-{page}" for i in range(1, 10): url = query_job_url.format(keyword=keyword, page=i) yield Request(url=url)
启动爬虫,进行测试:
import scrapy from scrapy.crawler import CrawlerProcess from boss_job.boss_job.spiders.job_info import JobInfoSpider process = CrawlerProcess() # 括号中可以添加参数 process.crawl(JobInfoSpider) process.start()
发现全部返回403:
分析可能是user-agent(浏览器头),在setting.py中进行配置:
DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 'boss_job.downloadermiddlewares.user_agent.RandomUserAgentMiddleware': 100, }
记住,scrapy默认遵守Robots协议,需要关掉此项配置
ROBOTSTXT_OBEY = False
RandomUserAgentMiddleware随机浏览器头设置:
from fake_useragent import UserAgent class RandomUserAgentMiddleware(object): def __init__(self): self.agent = UserAgent() @classmethod def from_crawler(cls, crawler): return cls() def process_request(self, request, spider): request.headers.setdefault('User-Agent', self.agent.random)
再次抓取就可以正常访问了:
下面使用xpath解析网页,在parse函数中:
def parse(self, response): jobs = response.xpath('//div[@class="job-list"]/ul/li') for job in jobs: item = BossJobItem() company_name = job.xpath('div/div[@class="info-company"]/div/h3/a/text()').get() job_detail_detail_url = job.xpath('div/div[@class="info-primary"]/h3/a/@href').get() item['company_name'] = company_name item['job_detail_detail_url'] = self.zhilian_link + job_detail_detail_url yield item
设置pipeline管道和优先级
custom_settings = { 'ITEM_PIPELINES': { 'boss_job.pipelines.BossJobPipeline': 300, } }
在pipeline中:
class BossJobPipeline(object): def __init__(self): self.job_items = [] def process_item(self, item, spider): self.job_items.append(copy.deepcopy(dict(item))) return item def close_spider(self, spider): with open('job.json', 'w', encoding='utf-8') as file_pipeline: json.dump(self.job_items, file_pipeline, ensure_ascii=False)
到此为止已经完成了BOSS直聘列表页的抓取了,最终结果为:
-
下面开始抓取岗位详情页面
分析页面
我们要抓取的就是这些 职位描述,岗位职责等信息。
使用命令生成爬虫:
scrapy genspider job_detail zhipin.com
在spider中,首先读取json文件获取刚才爬虫抓取到的job详情url:
def get_job_url(self): with open('job.json', 'r', encoding='utf-8') as file_pipeline: return json.load(file_pipeline)
使用xpath进行解析:
def parse(self, response): item = BossJobDetailItem() job_detail = response.xpath('string(//div[@class="detail-content"]//div[@class="text"])').get( default='').replace('\n', '').replace(' ', '') company_name = response.xpath('//div[@class="job-sec"]/div[@class="name"]/text()').get(default='') item['job_detail'] = job_detail item['company_name'] = company_name yield item
在pipeline中:
class BossJobDetailPipeline: def __init__(self): self.job_items = [] def process_item(self, item, spider): self.job_items.append(copy.deepcopy(item['job_detail'])) return item def close_spider(self, spider): job_details = ''.join(self.job_items) self.generate_word_count(job_details) def generate_word_count(self, job_details: str): # job_details = jieba.cut(job_details) self.generate_image(job_details) @staticmethod def generate_image(job_details): d = path.dirname(__file__) backgroud_Image = np.array(Image.open("111.jpg")) # 绘制词云图 # mask=backgroud_Image, # 设置背景图片 wc = WordCloud( font_path='font.ttf', # 显示中文,可以更换字体 background_color='white', # 背景色 width=1200, height=800 # max_words=30, # 最大显示单词数 # max_font_size=60 # 频率最大单词字体大小 ).generate(job_details) # 传入需画词云图的文本 image = wc.to_image() image.show()
-
最终的效果图
执行第二个爬虫就可以看到下图:
本爬虫所有的代码都在 作者 Gitbub上,欢迎大家访问: