python爬虫-爬取拉勾网职位英文关键词

关于
一直埋头学习,不知当前趋势,这是学习一门技术过程中最大的忌讳。刚好利用python爬虫,抓取一下拉勾网关于python职位的一些基本要求,不仅能知道岗位的基本技能要求,还能锻炼一下代码能力,学以致用,一举两得。

准备
工具 :python 2.7,PyCharm
类库:urllib2、BeautifulSoup、time、re、sys、json、collections、xlsxwriter

分析及代码实现
   进入拉勾网进行分析,要想获取每个岗位的关键词,首先要知道每个岗位详情页面的url,通过对比我们发现,https://www.lagou.com/jobs/4289433.html中,只有4289433这一串数字是不同的,那么就可以知道我们只要获取到每个岗位的这一串数字,我们就可以爬取每个岗位详情页面。
   通过F12查看,我们可以看到xhr请求中https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false的响应消息里的参数positionId的值为详情页面url的那串数字,如下图

image.png
,那么接下来我们就爬取这个请求来获取所有的positionId。
   首先我们通过分析可以看到这是个post请求且form的参数为first、pn、kd,通过不同岗位列表页面的请求,我们可以看到first的取值逻辑是pn为1的时候,first为true,当pn不为1的时候,first的取值为false(其中pn为岗位列表的页数),还有kd为一个固定值(这里是python)
image.png

到这里,具体的逻辑已经很清楚了,具体的代码实现如下:

def get_positionId(pn):
    positionId_list = []
    url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
        'Referer': 'https://www.lagou.com/jobs/list_Python?px=default&city=%E5%8C%97%E4%BA%AC'
    }
    if pn == 1:
        first = 'true'
    else:
        first = 'false'
    data = {
        'first': first,
        'pn': pn,
        'kd':kd  #这里取变量值,可以获取不同岗位的关键词
    }
    page = get_page(url, headers, data)
    if page == None:
        return None
    max_pageNum = get_pageSize(page)
    result = page['content']['positionResult']['result']
    for num in range(0, max_pageNum):
        positionId = result[num]['positionId']
        positionId_list.append(positionId)
    return positionId_list  #该函数返回一个列表页的所有岗位的positionId

   在获取到每个岗位的positionId后,我们就可以根据获取到的positionId进行拼接得到每个岗位详情页面的url,然后爬取这些url,来获取每个岗位的关键词(这里还有一个比较坑人的地方就是通过爬取来的网页内容和通过定位得到的内容竟然是不一样的,害的我纠结了好久),分析该网页如下图:
image.png

具体的实现如下:

#获取每个岗位的职位要求
def get_content(positionId):
    url = 'https://www.lagou.com/jobs/%s.html' %(positionId)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
        'Referer': 'https://www.lagou.com/jobs/list_Python?px=default&city=%E5%8C%97%E4%BA%AC'
    }
    page = get_page(url,headers,data=0)
    soup = Bs(page, 'html.parser')
    content = soup.find('dd', class_='job_bt').get_text()
    return content

接下来就是对获取到的岗位描述进行过滤处理,来获取英文关键词,实现如下:

#对获取的关键词列表进行过滤去重,获取top50的关键词
#处理岗位描述,获取英文关键词
def get_keyword(content):
    pattern = re.compile('[a-zA-Z]+')
    keyword = pattern.findall(content)
    return keyword

然后,在通过collections中的Counter模块获取到这些英文关键词中的top50,实现如下:

#对获取的关键词列表进行过滤去重,获取top50的关键词
def parser_keyword(keyword_list):
    for i in range(len(keyword_list)):
        keyword_list[i] = keyword_list[i].lower()
    keyword_top = Counter(keyword_list).most_common(50)
    return keyword_top

最后把top50的关键词保存到Excel中,并且生成分析图,实现如下:

#数据保存到Excel中,并且生成报表。
def save_excel(keyword_top):
    row = 1
    col = 0
    workbook = xlsxwriter.Workbook('lagou.xlsx')
    worksheet = workbook.add_worksheet('lagou')
    worksheet.write(0, col, u'关键词')
    worksheet.write(0, col+1, u'频次')
    for name, num in keyword_top:
        worksheet.write(row, col, name)
        worksheet.write(row, col+1, num)
        row += 1
    chart = workbook.add_chart({'type': 'area'})
    chart.add_series({
        'categories': 'lagou!$A$2:$A$51',
        'values': 'lagou!$B$2:$B$51'
    })
    chart.set_title({'name': u'关键词排名'})
    chart.set_x_axis({'name': u'关键词'})
    chart.set_y_axis({'name': u'频次(/次)'})
    worksheet.insert_chart('C2', chart, {'x_offset':15, 'y_offset':10})
    workbook.close()

结果
   具体生成的分析图如下:

image.png

如果对您有点帮助的话,麻烦您给点个赞,谢谢。

最后附上全部的代码:

# -*-coding: utf-8 -*-
import urllib2
import urllib
import re
from bs4 import BeautifulSoup as Bs
import json
import time
import sys
from collections import Counter
import xlsxwriter


kd = raw_input('请输入关键字:')

#获取页面内容
def get_page(url,headers,data):
    if data == 0:
        try:
            request = urllib2.Request(url, headers=headers)
            resp =  urllib2.urlopen(request)
            page = resp.read()
            return page
        except urllib2.URLError,e:
            if hasattr('reason'):
                print("爬取失败", e.reason)
                sys.exit(1)
    else:
        try:
            data = urllib.urlencode(data).encode('utf-8')
            request = urllib2.Request(url, data=data, headers=headers)
            resp = urllib2.urlopen(request)
            page = json.loads(resp.read())
            if page['success'] == True:
                return page
            else:
                print(page['msg'])
                return None
        except urllib2.URLError,e:
            print("爬取失败", e.reason)

#获取每一页最大的pageSize
def get_pageSize(page):
    max_pageNum = page['content']['pageSize']
    return max_pageNum


#获取每个岗位的职位要求
def get_content(positionId):
    url = 'https://www.lagou.com/jobs/%s.html' %(positionId)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
        'Referer': 'https://www.lagou.com/jobs/list_Python?px=default&city=%E5%8C%97%E4%BA%AC'
    }
    page = get_page(url,headers,data=0)
    soup = Bs(page, 'html.parser')
    content = soup.find('dd', class_='job_bt').get_text()
    return content

#处理岗位描述,获取英文关键词
def get_keyword(content):
    pattern = re.compile('[a-zA-Z]+')
    keyword = pattern.findall(content)
    return keyword

#获取每一页的岗位ID
def get_positionId(pn):
    positionId_list = []
    url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
        'Referer': 'https://www.lagou.com/jobs/list_Python?px=default&city=%E5%8C%97%E4%BA%AC'
    }
    if pn == 1:
        first = 'true'
    else:
        first = 'false'
    data = {
        'first': first,
        'pn': pn,
        'kd':kd
    }
    page = get_page(url, headers, data)
    if page == None:
        return None
    max_pageNum = get_pageSize(page)
    result = page['content']['positionResult']['result']
    for num in range(0, max_pageNum):
        positionId = result[num]['positionId']
        positionId_list.append(positionId)
    return positionId_list

#对获取的关键词列表进行过滤去重,获取top50的关键词
def parser_keyword(keyword_list):
    for i in range(len(keyword_list)):
        keyword_list[i] = keyword_list[i].lower()
    keyword_top = Counter(keyword_list).most_common(50)
    return keyword_top

#数据保存到Excel中,并且生成报表。
def save_excel(keyword_top):
    row = 1
    col = 0
    workbook = xlsxwriter.Workbook('lagou.xlsx')
    worksheet = workbook.add_worksheet('lagou')
    worksheet.write(0, col, u'关键词')
    worksheet.write(0, col+1, u'频次')
    for name, num in keyword_top:
        worksheet.write(row, col, name)
        worksheet.write(row, col+1, num)
        row += 1
    chart = workbook.add_chart({'type': 'area'})
    chart.add_series({
        'categories': 'lagou!$A$2:$A$51',
        'values': 'lagou!$B$2:$B$51'
    })
    chart.set_title({'name': u'关键词排名'})
    chart.set_x_axis({'name': u'关键词'})
    chart.set_y_axis({'name': u'频次(/次)'})
    worksheet.insert_chart('C2', chart, {'x_offset':15, 'y_offset':10})
    workbook.close()

#执行程序
def run():
    #获取30页的数据
    keyword_list = []
    for pn in range(1, 2):
        positionId_list= get_positionId(pn)
        if positionId_list == None:
            break
        for positionId in positionId_list:
            content = get_content(positionId)
            keyword = get_keyword(content)
            keyword_list += keyword
            time.sleep(60)
    keyword_top = parser_keyword(keyword_list)
    save_excel(keyword_top)

if __name__ == '__main__':
    run()
    # save_excel()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 之前就爬过拉勾网,但是遇到一些错误一直没有办法解决,果断放弃了,今天又重新试着写写看,对于一个菜鸟来说,真的都是处...
    小小佐阅读 1,357评论 0 0
  • 感觉好久没写python了哈哈,最近都在忙工作,所以也是没有学习python。刚好凑巧朋友正在找工作,也是java...
    Fitz916阅读 6,144评论 11 10
  • 知己知彼,方可百战不殆。在学习技术的时候我们往往面临太多选择而不知所措,可能是各个方面都有涉猎,对某个领域没有深入...
    SplendorZhang阅读 7,322评论 18 125
  • 简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京、上海、广州、深圳、杭州、西安...
    陌路黄昏后阅读 611评论 1 12
  • 我期待着逃跑的气球降落 我期待着吸烟的路灯亮起 我期待着深色的风衣穿过街道 我期待着暗淡的橱窗独立模特 我期待着嘈...
    心种阅读 170评论 0 3