scrapy 爬蟲生成行業技術趨勢詞雲圖

scrapy python爬蟲框架抓取BOSS直聘招聘信息生成詞雲

最近對Python 方面的新技術非常感興趣,想知道那些大公司都在使用了哪些python技術及相關技術。在BOSS直聘上搜索“python” 關鍵字可以看到使用Python的公司的招聘信息,通過分析他們的招聘信息來進行python技術的針對性學習。

BOSS直聘:

在這裏插入圖片描述

效果圖:

在這裏插入圖片描述

下面是爬蟲的具體步驟:
  1. 安裝scrapy

    具體的使用可以看作者的另一篇博文: Scrapy安裝與使用

  2. 分析網站

    BOSS 的搜索結果頁的url是:

     	https://www.zhipin.com/c101020100/?query=python&page=3
    

    不難知道,其中 query是查詢參數,page是當前頁面,根據這兩個我們就很好寫爬蟲了。

  3. 開始編寫崗位列表頁爬蟲

    生成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直聘列表頁的抓取了,最終結果爲:

    在這裏插入圖片描述

  4. 下面開始抓取崗位詳情頁面

    分析頁面

    在這裏插入圖片描述

    在這裏插入圖片描述

    我們要抓取的就是這些 職位描述崗位職責等信息。

    使用命令生成爬蟲:

     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()
    
  5. 最終的效果圖

    執行第二個爬蟲就可以看到下圖:在這裏插入圖片描述

本爬蟲所有的代碼都在 作者 Gitbub上,歡迎大家訪問:

https://github.com/starryrbs/awesome-scrapy

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章