Python爬虫拉勾网

思路梳理


张开中华英才网输入职位音讯,可以看看咱们想要的数据,当大家翻页的时候能够窥见地址是尚未别的变动的,因而可以规定大家一切输入查询的经过是因此post伏乞和异步加载成功的 ;

展开调节台再一次加载页面看看大家赢得了怎么,我们想要的岗位音讯都能够的躺在那处的,新闻都以以json格式传输的,我们只须求调用json的包读取那些数量然后保留下来就ok了 ;

我们和雅观其实在json的url里面是含有了城市的那几个变量的,因而大家想要查看差别城市的职分只必要在url里面改造城市就好;

但当大家直接待上访谈那个地址的时候咱们是看不到职位音讯的,看来服务器对headers是有检查的,因而大家在发送诉求的时候还非得抬高headers;

下边是咱们的headers和必要post的多寡,个中须要当心的是headers中Referer是叁个变量,依照职责的新闻分裂改换的,Referer是服务器供给规定你是从哪个页面访谈过来的,后边的调节和测量检验中也规定了拉勾网是对Referer举行了自己商讨的,倘若Referer不对,服务器会拒绝央浼然后现身上航海用教室的页面;

作者们需求post的数额又三个,多切换四遍页面也会意识,first是表示’是不是为率先页’,pn是象征’页码’,kd是代表’职位关键字’,因而大家只供给整合json的地方中的city变量+post的任务和页码就能够收获到大家想要的数码了!

代码部分

率先是将字符串转成UWranglerL编码,要是是utf-8编码直接传入到地点里面,是不恐怕访问到,这几个在背后的城阙和职分都供给用于改换;

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

我们获取到全方位json数据中是会蕴藏职位数的,每页是显示16个地方,职位数除以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

本文由银河网址发布于银河网址,转载请注明出处:Python爬虫拉勾网

您可能还会对下面的文章感兴趣: