Python-爬取拉勾網(wǎng)招聘信息

啊哈,自己太懶了,招聘信息什么的懶的看了寨躁,索性抓取下來(lái)慢慢看。

1. 我為什么要爬取招聘信息

其實(shí)我就是太懶了牙勘,雖然我是個(gè)做Android的职恳,但是擋不住我使用Python的熱情。

2. 如何實(shí)現(xiàn)

懶得說(shuō)了方面,你自己看代碼吧放钦。

2.0 一些說(shuō)明

1. 為什么需要Cookie

按照現(xiàn)在網(wǎng)站的尿性,沒(méi)有Cookie恭金,你什么信息也拿不到最筒。
所以老實(shí)的登錄吧,然后使用自己的Cookie蔚叨,反正我的Cookie是不會(huì)給你用的床蜘。

2. 如何獲取網(wǎng)頁(yè)URL

我覺(jué)得這個(gè)問(wèn)題太簡(jiǎn)單了,我拒絕回答蔑水!
哈哈邢锯,Chrome啊等瀏覽器自帶的開(kāi)發(fā)工具,足夠分析使用了搀别。

3. 嚴(yán)重警告

代碼寫(xiě)的一般丹擎,大家隨便看看就好,想用的自己去改造歇父。

2.1 LagouSpider

 #!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Date: 2018-12-04 09:56:28

from bs4 import BeautifulSoup
from urllib import request, parse
import os
import json
from Utils import CsvWriter


class LagouSpider:
    '''
    抓取拉勾上的招聘信息蒂培。
    因?yàn)橄拗频脑颍仨氁竽愕卿涀约旱馁~號(hào)后榜苫,截取所需的Cookie护戳。
    '''

    def __init__(self, url):
        self.page_header = {
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Host': 'www.lagou.com',
            'Origin': 'https://www.lagou.com',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
            'Connection': 'keep-alive',
            'Referer': 'https://www.lagou.com/jobs/list_Android?labelWords=&fromSearch=true&suginput=',
            'X-Anit-Forge-Token': 'None',
            'X-Requested-With': 'XMLHttpRequest',
            'Cookie': '填寫(xiě)你登錄拉勾網(wǎng)后的Cookie信息'
        }
        self.url = url
        self.tags = [('positionId', '職位ID'), ('positionName', '職位名稱(chēng)'), ('salary', '薪資'), ('createTime', '發(fā)布時(shí)間'), ('workYear', '工作經(jīng)驗(yàn)'), ('education', '學(xué)歷'), ('positionLables', '職位標(biāo)簽'), ('jobNature', '職位類(lèi)型'), ('firstType', '職位大類(lèi)'), ('secondType', '職位細(xì)類(lèi)'), ('positionAdvantage', '職位優(yōu)勢(shì)'), ('city', '城市'),
                     ('district', '行政區(qū)'), ('businessZones', '商圈'), ('publisherId', '發(fā)布人ID'), ('companyId', '公司ID'), ('companyFullName', '公司名'), ('companyShortName', '公司簡(jiǎn)稱(chēng)'), ('companyLabelList', '公司標(biāo)簽'), ('companySize', '公司規(guī)模'), ('financeStage', '融資階段'), ('industryField', '企業(yè)領(lǐng)域'), ('industryLables', '企業(yè)標(biāo)簽')]

    def fetch_page_info(self, page_num, keyword, file_path):
        '''
        根據(jù)url來(lái)獲取網(wǎng)頁(yè)內(nèi)容。
        page_num:頁(yè)數(shù)垂睬。
        keyword:關(guān)鍵字
        file_path:寫(xiě)入文件的路徑媳荒,要求必須為csv文件。
        '''
        if self.url is None:
            print('Url為空驹饺,無(wú)法獲取信息钳枕。')
            return

        file_name = os.path.basename(file_path)
        if not file_name.endswith('csv'):
            print("請(qǐng)使用csv文件來(lái)記錄信息。")
            return

        if not keyword.strip():
            print("關(guān)鍵字不能為空赏壹。")
            return

        page_data = parse.urlencode(
            [('pn', page_num), ('kd', keyword)])

        req = request.Request(self.url, headers=self.page_header)
        page = request.urlopen(req, data=page_data.encode('utf-8')).read()
        page = page.decode('utf-8')
        print('Get content is:{}'.format(page))
        if page is None:
            print('Text is Null.')
            return
        data = json.loads(page)
        postionResult = data.get('content').get('positionResult').get('result')

        # 將數(shù)據(jù)記錄至CSV中
        # 首先寫(xiě)入頭
        headers = []
        for tag in self.tags:
            headers.append(tag[1])
        rows = []
        rows.append(headers)
        for position in postionResult:
            row = []
            for tag in self.tags:
                row.append(position.get(tag[0]))
            rows.append(row)
        CsvWriter.writeRows(filePath=file_path, rows=rows)

        # # 將數(shù)據(jù)寫(xiě)入文件中
        # with open('Position.txt', 'w+') as f:
        #     for position in postionResult:
        #         f.write("---------------------------\n")
        #         for tag in tags:
        #             f.write(str(tag[1])+":"+str(position.get(tag[0]))+"\n")
        # print("解析完畢鱼炒。")


if __name__ == '__main__':
    url = r'https://www.lagou.com/jobs/positionAjax.json?city=%E4%B8%8A%E6%B5%B7'
    spider = LagouSpider(url)
    filePath = os.path.dirname(__file__)+os.sep+'Position_Patch.csv'
    for index in range(1,9):
        spider.fetch_page_info(
            page_num=index, keyword='Android', file_path=filePath)
    print("解析完成,請(qǐng)查看文件蝌借。")


2.2 Utils

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Date: 2018-12-04 14:21:39

import csv


class CsvWriter:
    @staticmethod
    def writeRow(filePath, row):
        with open(filePath, newline='', mode='a') as f:
            csv_writer = csv.writer(f)
            csv_writer.writerow(row)

    @staticmethod
    def writeRows(filePath, rows):
        print(len(rows))
        with open(filePath, newline='', mode='a') as f:
            csv_writer = csv.writer(f)
            csv_writer.writerows(rows)


class CsvReader:
    @staticmethod
    def printRows(filePath):
        with open(filePath, 'r+') as f:
            reader = csv.reader(f)
            for row in reader:
                print(row)

3. 總結(jié)

我注釋寫(xiě)的那么詳細(xì)昔瞧,如果存在疑問(wèn)俐巴,歡迎留言。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末硬爆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子擎鸠,更是在濱河造成了極大的恐慌缀磕,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劣光,死亡現(xiàn)場(chǎng)離奇詭異袜蚕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)绢涡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)牲剃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人雄可,你說(shuō)我怎么就攤上這事凿傅。” “怎么了数苫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵聪舒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我虐急,道長(zhǎng)箱残,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任止吁,我火速辦了婚禮被辑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敬惦。我一直安慰自己盼理,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布俄删。 她就那樣靜靜地躺著榜揖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抗蠢。 梳的紋絲不亂的頭發(fā)上举哟,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音迅矛,去河邊找鬼妨猩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秽褒,可吹牛的內(nèi)容都是我干的壶硅。 我是一名探鬼主播威兜,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼庐椒!你這毒婦竟也來(lái)了椒舵?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤约谈,失蹤者是張志新(化名)和其女友劉穎笔宿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體棱诱,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泼橘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了迈勋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炬灭。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖靡菇,靈堂內(nèi)的尸體忽然破棺而出重归,到底是詐尸還是另有隱情,我是刑警寧澤厦凤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布提前,位于F島的核電站,受9級(jí)特大地震影響泳唠,放射性物質(zhì)發(fā)生泄漏狈网。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一笨腥、第九天 我趴在偏房一處隱蔽的房頂上張望拓哺。 院中可真熱鬧,春花似錦脖母、人聲如沸士鸥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烤礁。三九已至,卻和暖如春肥照,著一層夾襖步出監(jiān)牢的瞬間脚仔,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工舆绎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鲤脏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像猎醇,于是被迫代替她去往敵國(guó)和親窥突。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你硫嘶,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料阻问? 從這篇文章中你...
    hw1212閱讀 12,723評(píng)論 2 59
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)沦疾,斷路器称近,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 練習(xí)材料:lesson 25 Do the English speak English ? 時(shí)長(zhǎng):90s I ar...
    Zi青_6709閱讀 99評(píng)論 0 0
  • 由于本人是在win10環(huán)境上安裝的,win10的快速開(kāi)機(jī)原理其實(shí)就是休眠(hibernate)曹鸠,所以在安裝的過(guò)程中...
    aurogon閱讀 813評(píng)論 1 0
  • 每一天都更喜歡你 越來(lái)越喜歡你
    Leslier閱讀 174評(píng)論 0 0