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