python3 爬虫与反爬虫的斗智斗勇——2018年拉勾网的职位信息爬取

1.项目概述:
从开始的想法到今天爬取并永久化存储的数据,从一开始爬网页html的文本信息到今天爬取Ajax(网络异步信息),参考了许多前辈的经验,网站是不断变化的,可能你昨天的方法今天已经不适用了,爬虫最讲究分析,只有透彻的分析,才能顺利的抓取到想要的数据。先看当作果吧(本地化csv文件):
在这里插入图片描述
2.项目分析:
Ajax传输的数据并不像我以前写的爬取太原理工大学官网的新闻那样,官网新闻是html文本,网页生成时新闻已经同步显示了,而Ajax技术是网页显示后信息经过js添加到写好的前端界面上,因此,经过url抓取的方法是不可行的,利用chrome开发者工具分析,发现要爬取的真正网站是https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false问号前的一部分,经过分析网站信息传输方式是post,我以一个过来人的身份告诉你们:
headers必定要写 headers必定要写 headers必定要写要不就会出现下面状况(加代理好像没有,拉勾总能获取你的真实ip地址——你在爬拉勾,拉勾同时也在爬你):
在这里插入图片描述
另外,爬虫爬的信息条件能够是变化的,因此datas也是必要的,这些都想好后代码也就呼之欲出了
3.代码:javascript

import requests,pandas,time

headers={
'Accept': 'application/json, text/javascript, */*; q=0.01'
,'Accept-Encoding': 'gzip, deflate, br'
,'Accept-Language': 'zh-CN,zh;q=0.9'
,'Connection': 'keep-alive'
,'Content-Length': '25'
,'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
,'Cookie': '_ga=GA1.2.966198651.1537274364; user_trace_token=20180918203931-e3999a19-bb3f-11e8-baf2-5254005c3644; LGUID=20180918203931-e3999dac-bb3f-11e8-baf2-5254005c3644; index_location_city=%E5%85%A8%E5%9B%BD; _gid=GA1.2.68552529.1537863867; JSESSIONID=ABAAABAAAGFABEF2685860F8628301F30930DF9B316C113; _gat=1; LGSID=20180925183511-ae5de25a-c0ae-11e8-a686-525400f775ce; PRE_UTM=; PRE_HOST=www.baidu.com; PRE_SITE=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D0EGUwmKj-ag8x0EuJ4kjZKxUAdljFfciwHFZnrLlK0W%26wd%3D%26eqid%3Dfb76474a00027fa7000000025baa0f5a; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1537354744,1537357114,1537863867,1537871707; TG-TRACK-CODE=index_search; LGRID=20180925183518-b2692bd0-c0ae-11e8-a686-525400f775ce; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1537871714; SEARCH_ID=a1e16916149044e1881924229017ae35'
,'Host': 'www.lagou.com'
,'Origin': 'https://www.lagou.com'
,'Referer': 'https://www.lagou.com/jobs/list_python?px=default&city=%E5%8C%97%E4%BA%AC'
,'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
,'X-Anit-Forge-Code': '0'
,'X-Anit-Forge-Token': 'None'
,'X-Requested-With': 'XMLHttpRequest'
}

def getlagou(jobposition,jobaddress):
    jobinfo = []
    url = 'https://www.lagou.com/jobs/positionAjax.json?'
    for i in range(1,31):
        datas = {
            'px': 'default'
            , 'city': jobaddress
            , 'needAddtionalResult': 'false'
            , 'first': 'true'
            , 'pn': i           #   pagenumber  通过个人分析无论你输入什么条件,职位信息只有30页
            , 'kd': jobposition
        }
        res=requests.post(url,headers=headers,data=datas)   #   注意分析网页数据获取格式
        content=res.json()
        for i in range(15): #   每页数据只有1条
            jobinfo.append(content['content']['positionResult']['result'][i])   #  职位信息具体的json存放位置
    df=pandas.DataFrame(jobinfo)    #   利用pandas将列表表格化
    now=time.strftime('%Y-%m-%d %H-%M-%S',time.localtime()) # 以系统当前时间将爬取职位信息存放至本地csv文件
    df.to_csv(now+'.csv',encoding='gb18030')    #   将表格化数据永久化存储到本地csv文件

if __name__ == '__main__':
    address=input('请输入工做地点:>')
    jobposition=input('请输入职位:>')
    getlagou(jobposition,address)

4.爬虫后记:
在月底前,终于达成心愿,登上了爬虫界的珠穆朗玛——拉勾网,这是一个好网站,看得出来这个公司有点东西,以前也爬取过其余职位招聘网,都是html格式的,只要分析文本就能爬取,这个还要动点脑筋,以后我会写一篇将爬取的数据存储到数据库(mysql)的文章,求各位关注啊。
5.一些补充说明20190426
如今拉勾网必须登陆才能爬取数据了,换掉代码中的cookie就又能够愉快爬取了html