思路梳理


开拓拉勾网输入职位消息,能够看看我们想要的多寡,当我们翻页的时候可以窥见地址是没有其余变动的,由此能够规定我们一切输入查询的进度是经过post请求和异步加载成功的
;

打开控制台再度加载页面看看大家取得了怎么,我们想要的职位新闻都得天独厚的躺在此处的,新闻都以以json格式传输的,大家只必要调用json的包读取这一个数量然后保留下来就ok了

咱俩友赏心悦目其实在json的url里面是包罗了都市的那一个变量的,因而我们想要查看不相同城市的岗位只要求在url里面改变城市就好;

但当大家直接访问这么些地方的时候大家是看不到职位消息的,看来服务器对headers是有检查的,因而我们在发送请求的时候还非得抬高headers;

上面是大家的headers和内需post的数额,在那之中须要注意的是headers中Referer是一个变量,依据职务的音信差别改变的,Referer是服务器要求规定你是从哪个页面访问过来的,前面包车型地铁调剂中也显明了赶集网是对Referer进行了检讨的,假如Referer不对,服务器会拒绝请求然后边世上海教室的页面;

笔者们须求post的数目又八个,多切换几回页面也会发觉,first是意味着’是不是为率先页’,pn是意味’页码’,kd是意味’职位关键字’,由此我们只必要结合json的地点中的city变量+post的任务和页码就能取获得我们想要的数据了!

代码部分

率先是将字符串转成U安德拉L编码,如若是utf-8编码直接传入到地方里面,是不可能访问到,这么些在前边的城池和任务都亟待用于更换;

#字符串转URL编码
def StringToUrl(string):
    urlcode = urllib.quote(string)
    return urlcode

咱俩赢获得任何json数据中是会含有职位数的,每页是显得1四个职位,职位数除以15向上取整,正是我们须要循环的次数

#获取职位数与页码
def GetPagnum(url,keyword,headers):
    values = {'first': 'true','pn': '1', 'kd': keyword} 
    data = urllib.urlencode(values) 
    req = urllib2.Request(url,data,headers)
    jsondata = urllib2.urlopen(req).read()
    totalCount = int(json.loads(str(jsondata))["content"]["positionResult"]["totalCount"])
    print('***本次搜索到%d个职位***'%totalCount)
    pagenum =  int (math.ceil(totalCount/15) )
    return pagenum

下边是完好代码,全部思路是先依照岗位+城市获得到总页数,然后经过循环post页码获取到岗位音讯,通过pandas保存数据为DataFrame,最终保存为excel

# -*- coding:utf-8 -*-
import re,json
import urllib2 
import urllib
import pandas as pd
import math

#字符串转URL编码
def StringToUrl(string):
    urlcode = urllib.quote(string)
    return urlcode

#获取职位数与页码
def GetPagnum(url,keyword,headers):
    values = {'first': 'true','pn': '1', 'kd': keyword} 
    data = urllib.urlencode(values) 
    req = urllib2.Request(url,data,headers)
    jsondata = urllib2.urlopen(req).read()
    totalCount = int(json.loads(str(jsondata))["content"]["positionResult"]["totalCount"])
    print('***本次搜索到%d个职位***'%totalCount)
    pagenum =  int (math.ceil(totalCount/15) )
    return pagenum


def LagouSpider(keyword):
    keyword_url = StringToUrl(keyword)
    city_list = ['北京','上海','深圳','广州','杭州','成都','南京','武汉','西安','厦门','长沙','苏州','天津'] 
    for n in list(range(len(city_list))): 
        city = city_list[n]
        print('***正在保存'+city+'的职位***')  
        city_url = StringToUrl(city)
        url = 'https://www.lagou.com/jobs/positionAjax.json?city='+city_url+'&needAddtionalResult=false&isSchoolJob=0' 
        Referer = 'https://www.lagou.com/jobs/list_'+keyword_url+'?city='+city_url+'=false&fromSearch=true&labelWords=&suginput='
        headers = {
                'Accept':'application/json, text/javascript, */*; q=0.01',
                'Accept-Encoding':'gzip, deflate, br',
                'Accept-Language':'zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4',
                'Connection':'keep-alive',
                'Content-Length':'55',
                'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
                'Cookie':'user_trace_token=20170912104426-9ba6e9c6-3053-45fd-9025-681bef8b0c8f; LGUID=20170916191219-e783b163-9acf-11e7-952a-525400f775ce; index_location_city=%E6%B7%B1%E5%9C%B3; TG-TRACK-CODE=index_search; _gid=GA1.2.1386711592.1505703954; _ga=GA1.2.351899359.1505560343; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1505560343,1505703955; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1505703988; LGRID=20170918110627-5c595dd3-9c1e-11e7-9196-5254005c3644; JSESSIONID=ABAAABAAAIAACBIF3290756E031DCE7CCEA3986CB372F49; SEARCH_ID=d30eb13562344eb9b5f6b8f05eb2cefc',
                'Host':'www.lagou.com',
                'Origin':'https://www.lagou.com',
                'Referer':Referer,
                'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36',
                'X-Anit-Forge-Code':'0',
                'X-Anit-Forge-Token':'None',
                'X-Requested-With':'XMLHttpRequest'
                }
        Pagenum = GetPagnum(url,keyword,headers)
        for i in range(0,Pagenum):
            if i == 0:
                values = {'first': 'true','pn': '1', 'kd': keyword} 
                data = urllib.urlencode(values) 
            else:
                values = {'first': 'false','pn': (i+1), 'kd': keyword} 
                data = urllib.urlencode(values) 
            req = urllib2.Request(url,data,headers)
            data = urllib2.urlopen(req).read()
            jsondata = json.loads(str(data))['content']['positionResult']['result']
            for t in list(range(len(jsondata))):
                jsondata[t].pop('companyLogo')
                jsondata[t].pop('businessZones')
                jsondata[t].pop('explain')
                jsondata[t].pop('plus')
                jsondata[t].pop('gradeDescription')
                jsondata[t].pop('promotionScoreExplain')
                jsondata[t].pop('positionLables')
                jsondata[t].pop('district')
                jsondata[t].pop('adWord')
                jsondata[t].pop('appShow')
                jsondata[t].pop('approve')
                jsondata[t].pop('companyId')
                jsondata[t].pop('companyLabelList')
                jsondata[t].pop('deliver')
                jsondata[t].pop('imState')
                jsondata[t].pop('industryLables')
                jsondata[t].pop('pcShow')
                jsondata[t].pop('positionId')
                jsondata[t].pop('score')
                jsondata[t].pop('publisherId')
                if t == 0:
                    rdata=pd.DataFrame(pd.Series(data=jsondata[t])).T
                else:
                    rdata=pd.concat([rdata,pd.DataFrame(pd.Series(data=jsondata[t])).T])
            if i == 0:
                citydata=rdata
            else:
                citydata=pd.concat([citydata,rdata])
            print('***正在保存第%d页***'%(i+1))
        if n == 0:
            totaldata = citydata
        else:
            totaldata=pd.concat([totaldata,citydata])
    totaldata.to_excel('LagouSpider.xls',sheet_name='sheet1')


if __name__ == "__main__": 
    keyword = raw_input('请输入要爬取的关键词:')
    LagouSpider(keyword)
    print '***LagouSpider@Awesome_Tang***'

运作结果

image.png

相关文章

网站地图xml地图