拉勾网数据两种爬取

写在前面:

拉勾网数据爬取是一个蛮经典的爬虫案例 ,由于被频繁被爬取的原因 ,网站经过不断更新 ,加入了一些反爬技术 。例如:参数的加密 、AJAX异步加载JSON数据 。对于入门爬虫的新手来说 ,还是有一些困难 。这里用到selenium和post请求两种方式解析网页 ,希望可以帮到你们 。

分析网页:

这里我们以 数据分析 该职位为例 : 链接
数据在网页一般会分为两种加载方式 : 在原网页内与不在原网页内 。判断的方法可以复制网页内要爬取的一些数据 ,然后右击网页 ——查看源代码 , 看一看是否可以找到 。:

picture_1

按ctrl + f 输入复制的的数据发现并没有存在原网页内 。
那么可以推断出 , 我们要爬取的数据是通过AJAX异步加载JSON数据到网页的 。
那我们需要在网页后台找到那个json数据 ,我用的是chrom浏览器 ,右击 ——检查 :
picture_2

在picture_1中 选择 network --- XHR (如果没有数据的话,重新加载一下网页) ,可以在左边看到四个json链接 。因为我们要爬取的是职位 ,很快我们就可以确定目标url ,picture_3验证了准确性 :
picture_3

在picture_3中我们可以很清楚的看见这是一个json格式的数据 ,通过分析 ,可以找到数据在result下面 :
picture_4

通过对比picture_5发现就是我们要爬取的数据 。
picture_5

编写爬虫:

https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E8%8B%8F%E5%B7%9E&needAddtionalResult=false
我们要解析的url在Headers中可以看出是post请求 。

picture_6

下面我们构造headers :

my_headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
            'Host':'www.lagou.com',
            'Referer':'https://www.lagou.com/jobs/list_{}?labelWords=sug&fromSearch=true&suginput='.format(position_id),
            'X-Anit-Forge-Code':'0',
            'X-Anit-Forge-Token': 'None',
            'X-Requested-With':'XMLHttpRequest'
            }

其中的referer可以看到 ,我用format函数加入了一个参数 ,便于爬取不同城市的数据 , 如果你只打算爬取一个城市这里可以不加 ,只使用浏览器上带的参数 。
提交的 data:

my_data = {
            'first': 'true',
            'pn':num,
            'kd':position
}
picture_7

从picture中可以看出需要post数据主要有三个 ,其中 pn:为页码数 ,kd:为职位名称 。因此 ,我将这两个参数的值设置为变量 num和position ,便于接下来的post页码和不同职位的实现 。

def get_json(url,num,position,position_id):
    #print(position)
    
    '''''从网页获取JSON,使用POST请求,加上头部信息'''
    my_headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
            'Host':'www.lagou.com',
            'Referer':'https://www.lagou.com/jobs/list_{}?labelWords=sug&fromSearch=true&suginput='.format(position_id),
            'X-Anit-Forge-Code':'0',
            'X-Anit-Forge-Token': 'None',
            'X-Requested-With':'XMLHttpRequest'
            }

    my_data = {
            'first': 'true',
            'pn':num,
            'kd':position}

    res = requests.post(url, headers = my_headers, data = my_data)
    res.raise_for_status()
    res.encoding = 'utf-8'
    # 得到包含职位信息的字典
    page = res.json()
    return page

这是带headers和data完整的post请求 , 其中函数由四个参数 ,url为刚刚我们找出的那个链接 。num是页码 ,这里我们先设置为起始页码1 。position为职位名称 ,position_id为职位代号 。我们可以从headers的referen中看出 :https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=sug&fromSearch=true&suginput=shujufenxi 在list_到?中的职位名称被加密出现, 所以我构造了一个字典 :

def getCity():
        return [
            
            {"苏州":"%E8%8B%8F%E5%B7%9E"},
            {"深圳":"%E6%B7%B1%E5%9C%B3"},
            {"上海":"%E4%B8%8A%E6%B5%B7"},
            {"杭州":"%E6%9D%AD%E5%B7%9E"},
            {"南京":"%E5%8D%97%E4%BA%AC"},
        ]

def getLanguage():
        return [
            #"python",
            {"数据分析":"%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90"},
            {"图像处理":"%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86"},
            {"":""},
            {"":""},
            {"":""},


        ]

将需要爬取的城市 、职位所对应的加密码一一对应 。
get_json函数返回了json数据 ,包括了职位总数 ,这样我们就可以构造一个函数 ,而且拉勾网 一页最多显示15个职位 ,计算出我们爬取职位的总页数了 。


def get_page_num(count):
    '''''计算要抓取的页数'''
    # 每页15个职位,向上取整
    res = math.ceil(count/15)
    # 拉勾网最多显示30页结果
    if res > 30:
        return 30
    else:
        return res

计算出页数之后 , 我们就可以通过一个循环 ,带着可变参数反复post数据:

for n in range(1,num+1):

        # 对每个网页读取JSON, 获取每页数据
        page = get_json(url,n,position,position_id)
        try:
            jobs_list = page['content']['positionResult']['result']
        except:
            continue
            
        page_info = get_info_to_mongodb(jobs_list)
        res_list.extend(page_info)

查看返回的结果 ,这里我通过构造一个含有dict的list便于存入mongodb ,看个人需求 :

picture_8.png
picture_9.png

通过看原网页的数据 , 我们发现数据已经被爬取先来了 一共19个职位 ,共分两页

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

推荐阅读更多精彩内容