<input id="0qass"><u id="0qass"></u></input>
  • <input id="0qass"><u id="0qass"></u></input>
  • <menu id="0qass"><u id="0qass"></u></menu>

    使用scrapy框架爬取騰訊招聘的崗位

    爬蟲 專欄收錄該內容
    19 篇文章 9 訂閱

    本篇將介紹使用scrapy爬取動態加載網站的方法,這樣的網站我們很常見,我們這次就是爬取騰訊招聘的崗位數據

    我們爬取的是這個頁面里的崗位數據
    在這里插入圖片描述
    點進去后是顯示的是所有的崗位,我們想要什么崗位就直接搜就可以

    在這里插入圖片描述
    比如我們搜一個python方面的崗位吧,(此時出現的頁面就是一級頁面),但是呢,這些崗位的數據都是不全的,有工作職責,但是沒有具體的工作要求,比如要求幾年以上的工作經驗,要什么學歷等等

    在這里插入圖片描述
    所以我們一級頁面也不知要抓什么,但是我要抓取每個職位的信息,我們要到詳情頁里面去找,隨便點擊進一個職位看一下
    在這里插入圖片描述
    我們找到了有效的數據了,這個里面的數據就全了

    第一個就是崗位名字,第二個是地點,第三個崗位的類型,是技術,是銷售等等,第四個發布時間,第五個工作職責,第六個工作要求
    因為 這樣的網站是動態加載的,所以我們在一級頁面直接F12抓包,刷新一下,順帶手的點擊下一頁,我們直接進入到XHR
    先點擊一個數據包看一下

    在這里插入圖片描述
    這個應該不是,它應該是上面的那些個過濾條件
    我們接著看下面這個
    在這里插入圖片描述
    這個應該是了,雖然也沒有具體的工作要求,但是大體的數據還是我們需要的,那我們到headers里面看看

    這個是一個GET請求,查詢的參數略微的有點多

    在這里插入圖片描述
    在來看一下查詢參數,大概有這些
    在這里插入圖片描述
    第一個就是一個13位的時間戳,下面空的沒參數的就是篩選條件,再下面keyword就是輸入的關鍵字,是什么崗位,pageIndex這個是變得,就是頁數,pageSize是一頁有10個職位,這樣還好,里面的問題也不是太大,唯一一個有問題的就是那個時間戳

    上面Headers里面的URL地址就是json地址,我們復制放到瀏覽器地址欄里面看看是什么樣子的

    在這里插入圖片描述
    這些就是json數據,這就是一級頁面,但是到現在一級頁面到底抓什么我們還是不太清楚,那我們接下來看一下二級頁面

    同樣我們也是抓包

    在這里插入圖片描述

    第一個數據包就是職位信息,這里面就有我們要抓的那六個信息,接著到Headers里面分析一下,同樣是GET請求,我們還是看查詢參數

    在這里插入圖片描述

    這個里面第一個還是個時間戳,第二個是職位id,這個每個職位和每個職位是不一樣的,第三個就是語言,現在的問題是職位id沒有搞定,時間戳還是挺好搞定的

    那我們看這個二級頁面網絡數據包中也找不到其他的數據包的職位ID了,我們想要所有職位的id,我們只能從一級頁面中找所有的postId只要一級頁面中提取一頁10個postId,那我們就可以拼接10個二級頁面詳情頁的json地址了

    那我們就去一級頁面中找看有沒有postId

    在這里插入圖片描述
    一級頁面顯示他是有的,且每個都不一樣,好了,現在我們只需要做的就是想辦法拼接postId和二級頁面的URL地址了

    我先把二級頁面的URL地址用瀏覽器打開放著
    在這里插入圖片描述

    在這里插入圖片描述

    好接下來我們就正式去寫代碼了
    首先還是創建爬蟲項目以及爬蟲文件,這里我就不啰嗦了,直接寫代碼了

    items.py文件

    # -*- coding: utf-8 -*-
    
    # Define here the models for your scraped items
    #
    # See documentation in:
    # https://docs.scrapy.org/en/latest/topics/items.html
    
    import scrapy
    
    
    class TencentItem(scrapy.Item):
        # define the fields for your item here like:
        # 定義爬取字段
        job_id = scrapy.Field()
        job_name = scrapy.Field()
        job_type = scrapy.Field()
        job_city = scrapy.Field()
        job_time = scrapy.Field()
        job_require = scrapy.Field()
        job_duty = scrapy.Field()
    

    tencent.py爬蟲文件

    # -*- coding: utf-8 -*-
    import scrapy
    # 分析時間戳用
    import time
    # 編碼
    from urllib import parse
    import json
    
    from ..items import TencentItem
    
    
    class TencentSpider(scrapy.Spider):
        name = 'tencent'
        allowed_domains = ['careers.tencent.com']
        # 一級頁面url地址
        one_url = 'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp={}&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword={}&pageIndex={}&pageSize=10&language=zh-cn&area=cn'
        # 二級頁面url地址
        two_url = 'https://careers.tencent.com/tencentcareer/api/post/ByPostId?timestamp={}&postId={}&language=zh-cn'
    
        # 拼接第一頁的url地址,首先要搞定一級頁面的三個變量,即 timestamp keyword pageIndex
        keyword = input('請輸入職位類別:')
        keyword = parse.quote(keyword)
        # start_urls: 一級頁面第1頁的URL地址
        start_urls = [one_url.format(int(time.time() * 1000), keyword, 1)]
    
        def parse(self, response):
            """生成所有一級頁面的url地址,交給調度器入隊列"""
            # 獲取總頁數
            html = json.loads(response.text)
            count = html['Data']['Count']
            total = count // 10 if count % 10 == 0 else count // 10 + 1
            # 生成所有頁的url地址
            for index in range(1, total + 1):
                page_url = self.one_url.format(int(time.time() * 1000),
                                               self.keyword,
                                               index)
                # 調度器入隊列
                yield scrapy.Request(url=page_url, callback=self.detail_page)
    
        def detail_page(self, response):
            """一級頁面:提取每個職位的postId的值"""
            html = json.loads(response.text)
            for one_job_dict in html['Data']['Posts']:
                item = TencentItem()
                item['job_id'] = one_job_dict['PostId']
                # 生成詳情頁的URL地址,交給調度器入隊列
                url = self.two_url.format(int(time.time() * 1000), item['job_id'])
                # meta參數:在不同解析函數之間傳遞數據
                # meta字典先到調度器,再到下載器,meta會作為response的一個屬性,傳遞個下一個解析函數
                #
                yield scrapy.Request(url=url, meta={'item': item}, callback=self.get_job_info)
    
        def get_job_info(self, response):
            """二級頁面:提取每個職位的信息"""
            html = json.loads(response.text)
            item = response.meta['item']
            item['job_name'] = html['Data']['RecruitPostName']
            item['job_type'] = html['Data']['CategoryName']
            item['job_city'] = html['Data']['LocationName']
            item['job_time'] = html['Data']['LastUpdateTime']
            item['job_require'] = html['Data']['Requirement']
            item['job_duty'] = html['Data']['Responsibility']
            # 數據提取完成,現在交給管道文件
            yield item
    

    寫管道文件之前呢,要先把數據庫整理好,我這里給出一份樣本,可供參考,進入數據庫后,直接復制粘題即可

    create database tencentdb charset utf8;
    use tencentdb;
    create table tencenttab(
    job_id varchar(100),
    job_name varchar(500),
    job_type varchar(500),
    job_city varchar(200),
    job_time varchar(200),
    job_require varchar(5000),
    job_duty varchar(5000)
    )charset=utf8;
    

    pipelines.py管道文件

    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
    
    
    class TencentPipeline(object):
        def process_item(self, item, spider):
            print(dict(item))
            return item
    
    
    import pymysql
    
    
    class TencentMysqlPipeline(object):
        def open_spider(self, spider):
            self.db = pymysql.connect('localhost', 'root', '123456', 'tencentdb', charset='utf8')
            self.cur = self.db.cursor()
            self.ins = 'insert into tencenttab values(%s,%s,%s,%s,%s,%s,%s)'
    
        def process_item(self, item, spider):
            li = [
                item['job_id'],
                item['job_name'],
                item['job_type'],
                item['job_city'],
                item['job_time'],
                item['job_require'],
                item['job_duty'],
            ]
            self.cur.execute(self.ins, li)
            self.db.commit()
            return item
    
        def close_spider(self, spider):
            self.cur.close()
            self.db.close()
    
    

    setting.py全劇配置文件

    ROBOTSTXT_OBEY = False
    DOWNLOAD_DELAY = 1
    DEFAULT_REQUEST_HEADERS = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'en',
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36',
    }
    ITEM_PIPELINES = {
        'Tencent.pipelines.TencentPipeline': 300,
        'Tencent.pipelines.TencentMysqlPipeline': 200,
    }
    

    run.py文件

    from scrapy import cmdline
    
    cmdline.execute('scrapy crawl tencent'.split())
    
    ??2022 CSDN 皮膚主題:點我我會動 設計師:我叫白小胖 返回首頁

    打賞作者

    楊旭華啊

    你的鼓勵將是我創作的最大動力

    ¥2 ¥4 ¥6 ¥10 ¥20
    輸入1-500的整數
    余額支付 (余額:-- )
    掃碼支付
    掃碼支付:¥2
    獲取中
    掃碼支付

    您的余額不足,請更換掃碼支付或充值

    打賞作者

    實付
    使用余額支付
    點擊重新獲取
    掃碼支付
    錢包余額 0

    抵扣說明:

    1.余額是錢包充值的虛擬貨幣,按照1:1的比例進行支付金額的抵扣。
    2.余額無法直接購買下載,可以購買VIP、C幣套餐、付費專欄及課程。

    余額充值
    多乐彩