爬虫日记-拉勾网信息收集

这次布置的作业是爬取拉勾网职位信息。之前有积极童鞋投稿了。正好供小白小鉴一下。

收获

一、第一次成功伪装浏览器
二、第一次接触异常处理(谢谢程老师点拨)
三、第一次拿到7000多条信息数据

思路:

先了解拉勾网的代码结构。
打开网页输入职位“数据分析师”,选择地址“上海”
可以看到相关招聘职位情况。翻页选择第二页,url地址仍然不变。可以看出他是动态加载的网页结构。


Paste_Image.png

打开抓包,选择第一页,观察XHR,如图一

图一.png

选择第二页,观察XHR,如图二

图二.png

可以看出加载项多了2个,打开其中一个positionAjax.json文件,且所有positionAjax.json文件URL都是一样都。如下:可以看网页地址是一个带Ajax的
Paste_Image.png

preview一下内容。

Paste_Image.png

我们网页上的职位相关信息都在这里全部有了。更可以肯定这个是一个动态加载网站。请求方式是POST,也就是我们需要浏览器提交表单给服务器请求,服务器才会反馈加载页面。

为啥不可以直接用https://www.lagou.com/jobs/list_数据分析师?city=上海&cl=false&fromSearch=true&labelWords=&suginput=直接 requests.get(url)得到网页信息?因为其中之一无法构造下一页url得到下一页的加载信息。

继续看一下其他信息,以下2张是我们提交网站的参数。其中pn:1代表第一页,pn:2代表第二页。kd:数据分析师 就是我们在输入栏上的关键词。


Paste_Image.png

Paste_Image.png

所以我们需要用这些信息来模拟游览器去抓去数据。
由于这次是post方式请求,所以需要datas,也就是上边提到的2个图的参数。
url=是固定不变的Ajax那个地址
**datas={'first':'true','pn':?,'kd':?} ** 可以参考上图
为了不被拉勾网站发现我们是爬虫,所以需要在加上一个cookie信息。user-agent信息,cookie和user-agent信息可以通过抓包获得。如下:

Paste_Image.png

所以我们先做一个简单的测试以下:是否可以抓取信息。

#-*-coding:utf-8-*-

import requests
import sys
import json
reload(sys)
sys.setdefaultencoding('utf8')


header={'Cookie': 'user_trace_token=20170409190556-fb6a80e8d2304d2ca6818849d3a1589a; LGUID=20170409190556-816c5024-1d14-11e7-9d7c-5254005c3644; index_location_city=%E4%B8%8A%E6%B5%B7; JSESSIONID=0894912C02FB7DFB8F48129EFCEC6FC4; PRE_UTM=; PRE_HOST=; PRE_SITE=https%3A%2F%2Fwww.lagou.com%2Fjobs%2Flist_%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588%3FlabelWords%3D%26fromSearch%3Dtrue%26suginput%3D; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2Fjobs%2FallCity.html%3Fkeyword%3D%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588%26px%3Ddefault%26city%3D%25E4%25B8%258A%25E6%25B5%25B7%26positionNum%3D500%2B%26companyNum%3D0%26isCompanySelected%3Dfalse%26labelWords%3D; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1493212645,1493213972,1493216685,1493216698; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1493309101; _ga=GA1.2.132571186.1491735956; LGSID=20170428000155-d640004d-2b62-11e7-b417-5254005c3644; LGRID=20170428000501-44ee1923-2b63-11e7-b417-5254005c3644; TG-TRACK-CODE=search_code; SEARCH_ID=a392542f875744dba6ba24201fa42eb6','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}

datas={'first':'true','pn':1,'kd':'数据分析师'}
url='https://www.lagou.com/jobs/positionAjax.json?px=default&city=%s&needAddtionalResult=false' %'上海'
html=requests.post(url,data=datas,headers=header).text
html=json.loads(html)
job=html['content']['positionResult']['result'][1]['companyFullName']
print job

反馈结果是:

Paste_Image.png

说明我们的爬虫伪装成功。可以获取信息。
下边就是完整的代码:

#-*-coding:utf-8-*-

import requests
import sys
import json
import csv
import time
reload(sys)
sys.setdefaultencoding('utf8')

header={'Cookie': 'user_trace_token=20170409190556-fb6a80e8d2304d2ca6818849d3a1589a; LGUID=20170409190556-816c5024-1d14-11e7-9d7c-5254005c3644; index_location_city=%E4%B8%8A%E6%B5%B7; JSESSIONID=0894912C02FB7DFB8F48129EFCEC6FC4; PRE_UTM=; PRE_HOST=; PRE_SITE=https%3A%2F%2Fwww.lagou.com%2Fjobs%2Flist_%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588%3FlabelWords%3D%26fromSearch%3Dtrue%26suginput%3D; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2Fjobs%2FallCity.html%3Fkeyword%3D%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588%26px%3Ddefault%26city%3D%25E4%25B8%258A%25E6%25B5%25B7%26positionNum%3D500%2B%26companyNum%3D0%26isCompanySelected%3Dfalse%26labelWords%3D; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1493212645,1493213972,1493216685,1493216698; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1493309101; _ga=GA1.2.132571186.1491735956; LGSID=20170428000155-d640004d-2b62-11e7-b417-5254005c3644; LGRID=20170428000501-44ee1923-2b63-11e7-b417-5254005c3644; TG-TRACK-CODE=search_code; SEARCH_ID=a392542f875744dba6ba24201fa42eb6','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}
def totalpage(url,datas,header):
    html = requests.post(url, data=datas, headers=header).text
    html = json.loads(html)
    totalpage=html['content']['positionResult']['totalCount']/15+1
    return totalpage

def info(url,datas,header):
    html = requests.post(url, data=datas, headers=header).text
    html = json.loads(html)
    results=html['content']['positionResult']['result']
    totaljob=[]
    for result in results:
        info=[]
        companyfullname=result['companyFullName']
        companysize=result['companySize']
        positionname=result['positionName']
        education=result['education']
        financestage=result['financeStage']
        salary=result['salary']
        city=result['city']
        positionadvantage=result['positionAdvantage']
        info.append(companyfullname)
        info.append(companysize)
        info.append(positionname)
        info.append(education)
        info.append(financestage)
        info.append(salary)
        info.append(city)
        info.append(positionadvantage)
        totaljob.append(info)

    return totaljob

if __name__=="__main__":
    csvfile = file('lago.csv', 'wb')
    writer = csv.writer(csvfile)
    positions=['数据分析师','python工程师','business analyst','数据挖掘','数据库']
    citys=['上海','杭州','北京','深圳','广州','西安','天津','南京']
    job=[]
    for position in positions:
        for city in citys:
            datas={'first':'true','pn':1,'kd':position}
            url='https://www.lagou.com/jobs/positionAjax.json?px=default&city=%s&needAddtionalResult=false' %city
            try:
                totalpages=totalpage(url,datas,header)
            except:
                pass
            time.sleep(5)
            for page in range(1,totalpages):
                detail=[]
                data1={'first':'true','pn':page,'kd':position}
                try:
                    details=info(url,data1,header)
                except:
                    pass
                for detail in details:
                    writer.writerow(detail)
    csvfile.close()

总结

1、在开始做一个小爬虫测试的时候,发现'result':=[],是空的。后来问了下彭老师可能是编码问题。经过检查,发现开头第一行#-*-coding:‘'utf-8'-*-不应该加引号。问题时我之前写七日热点的时候也木有出错啊。

Paste_Image.png

2、爬虫速度太快,被网站拒绝链接而导致数据中断。程老师说需要加time.sleep()。延迟请求响应
3、爬取的时候,数据会中断。提示:ValueError:NO JSON OBJECT could be decoded.部分网站的没有json对象可以decoded。我一时也不知道怎么处理。程老师说做异常处理。只是这样会有部分信息丢失。我也不知道怎么更好的处理这种情况。如有有人知道,可以指导我。谢谢

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

推荐阅读更多精彩内容