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上,歡迎大家訪問: