之前一直想通过技能交换,学个像吉他之类的技能。正好中秋节一个人比较无聊,百度发现一个网站很好爬。用户数据都是公开的,说不定爬完了数据就能找到自己感兴趣的人和技能。【文章末尾有jupyter notebook教程】 一、网站分析1.1 网站技能交换网 http://www./ 1.2 抓包分析
从下图中,我们发现 加载更多 这四个字,往往表示该网页是 动态网页 。 我们打开 开发者工具 (按F12键打开) 的 Network面板 ,并且选中 XHR 。
现在我们点击 加载更多 按钮,发现 Network面板 中出现了 json格式数据 。 1.3 网址规律
点击 加载更多 得到的网址为
http://www./api/recent-skills?page=1&_=1537805020106
其中 &_=1537805020106 应该是时间戳,对结果无影响。最终的网址是 http://www./api/recent-skills?page=1
我们只需要改动page参数就可以一直抓取该网站的 技能交换公告信息 。 二、发起请求现在知道了网址规律,我们只需要使用requests库就能立即的得到我们想要的 技能交换信息 ,现在我们先只访问 第一页信息 : import requests
#第一页url url = 'http://www./api/recent-skills?page=1'
resp = requests.get(url)
resp.json()
技能交换公告信息 {'returnCode': 0, 'returnMessage': '请求成功', 'result': {'rows': 6, 'list': [{'id': 82880, 'createTime': 1537231608000, 'modifyTime': 1537273748000, 'age': '30岁', 'nickname': 'blues', 'can': '税法 会计 透视表', 'want': '驾驶', 'remark': None, 'city': '深圳', 'view': 0, 'sex': '男', 'qq': None, 'status': 1, 'wechat': None, 'mobile': None, 'email': None, 'weibo': None, 'shortUrl': None, 'phoneImageUrl': None, 'headimgUrl': None}, 。。。。 。。。。 {'id': 82849, 'createTime': 1536122378000, 'modifyTime': 1537160999000, 'age': '23岁', 'nickname': '友文', 'can': '程式設計 網頁設計', 'want': '英文會話', 'remark': '哈囉~\n想用程式設計交換英文會話\n如果你的英文會話能和外國人流利對談\n又想學程式的歡迎聯絡~', 'city': '台灣', 'view': 3, 'sex': '男', 'qq': None, 'status': 1, 'wechat': None, 'mobile': None, 'email': None, 'weibo': None, 'shortUrl': None, 'phoneImageUrl': None, 'headimgUrl': None}]}}
三、存储数据完美!现在我们可以直接获取我们想要的数据。由于现在得到的数据是json格式,几乎不需要进行定位。现在我们直接以csv方式存储。 import csv import requests
#新建csv文件,用于存储数据 csvf = open('data.csv', 'a+', encoding='gbk', newline='') writer = csv.writer(csvf) writer.writerow(('昵称', '年龄', '会', '想学', '留言', '城市', '性别', 'qq', 'weixin', 'mobile', 'weibo'))
#第一页url url = 'http://www./api/recent-skills?page=1' resp = requests.get(url) data = resp.json()
#获得技能公告信息 exchangers = data['result']['list'] for exchanger in exchangers: nickname = exchanger.get('nickname') age = exchanger.get('age') can = exchanger.get('can') want = exchanger.get('want') remark = exchanger.get('remark') city = exchanger.get('city') gender = exchanger.get('sex') qq = exchanger.get('qq') weixin = exchanger.get('weixin') mobile = exchanger.get('mobile') weibo = exchanger.get('weibo') #存储数据 writer.writerow((nickname, age, can, want, remark, city, gender, qq, weixin, mobile, weibo)) #打印,看看是否抓到 print(can, want, remark, city, gender)
#关闭csv文件 csvf.close()
运行结果 税法 会计 透视表 驾驶 None 深圳 男 钢琴 大提琴 日语 None 天津 女 庆典策划 平面设计 驾驶 体育运动 手绘 摄影 运动 旅游 等 我觉得吧学习技能分三个阶段,首选是找到合适的换客,然后呢就是线上交流,然后就是开始学习。 黄冈 男 销售技巧 团队管理 好书分享 吉他 口琴 羽毛球 希望能交到更多的朋友 福州 男 计算机软件编程 曳舞 吉他 金融知识 None 上海 男 程式設計 網頁設計 英文會話 哈囉~ 想用程式設計交換英文會話 如果你的英文會話能和外國人流利對談 又想學程式的歡迎聯絡~ 台灣 男
四、批量爬取刚刚我们只是对 第一页 http://www./api/recent-skills?page=1 进行的采集。当改变page参数,url也会发生变化。 我们使用for循环即可实现自动更改url中的page参数,今天演示,我就只获取100页的数据 import csv import requests
#新建csv文件,用于存储数据 csvf = open('data.csv', 'a+', encoding='gbk', newline='') writer = csv.writer(csvf) writer.writerow(('昵称', '年龄', '会', '想学', '留言', '城市', '性别', 'qq', 'weixin', 'mobile', 'weibo'))
#网页模板 base = 'http://www./api/recent-skills?page={page}' #for循环批量构建url for page in range(1, 10): url = base.format(page=page) resp = requests.get(url) data = resp.json()
#获得技能公告信息 exchangers = data['result']['list'] for exchanger in exchangers: nickname = exchanger.get('nickname') age = exchanger.get('age') can = exchanger.get('can') want = exchanger.get('want') remark = exchanger.get('remark') city = exchanger.get('city') gender = exchanger.get('sex') qq = exchanger.get('qq') weixin = exchanger.get('weixin') mobile = exchanger.get('mobile') weibo = exchanger.get('weibo') #存储数据 writer.writerow((nickname, age, can, want, remark, city, gender, qq, weixin, mobile, weibo)) #打印,看看是否抓到 print(can, want, remark, city, gender)
#关闭csv文件 csvf.close()
运行结果 税法 会计 透视表 驾驶 None 深圳 男 钢琴 大提琴 日语 None 天津 女 庆典策划 平面设计 驾驶 体育运动 手绘 摄影 运动 旅游 等 我觉得吧学习技能分三个阶段,首选是找到合适的换客,然后呢就是线上交流,然后就是开始学习。 黄冈 男 销售技巧 团队管理 好书分享 吉他 口琴 羽毛球 希望能交到更多的朋友 福州 男 计算机软件编程 曳舞 吉他 金融知识 None 上海 男 程式設計 網頁設計 英文會話 哈囉~ 想用程式設計交換英文會話 如果你的英文會話能和外國人流利對談 又想學程式的歡迎聯絡~ 台灣 男 PS framemaker indesign Oxygen Ditatoo Abortext Illustrator Catia composer Alladdin office 软件 英语 对技术写作感兴趣的,可以联系我。 北京 男 PS设计 闽南话 新媒体推广 陪聊 韩语 日语 书法 绘画 摄影 None 泉州 女 Ps cad su 等相关设计软件 基础绘画 英语 数据挖掘分析 等感兴趣的 None 上海 男 二胡 新颖的或者通用类技能 None 大同 男 简单粤语 精通PS AI CDR 吉他 音频剪辑 想学粤语 英语 None 浙江台州 男
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
<ipython-input-9-05d04f0ea39a> in <module>() 31 weibo = exchanger.get('weibo') 32 #存储数据 ---> 33 writer.writerow((nickname, age, can, want, remark, city, gender, qq, weixin, mobile, weibo)) 34 #打印,看看是否抓到 35 print(can, want, remark, city, gender)
UnicodeEncodeError: 'gbk' codec can't encode character '\u2006' in position 1: illegal multibyte sequence
五、让爬虫更强壮只是采集了两三页就听下来了,原因是Unicode编码问题。这里我们将 try-except 语句放在 writer.writerow((nickname, age, can, want, remark, city, gender, qq, weixin, mobile, weibo))
处,以增强程序的编码问题的容错能力。 import csv import requests
#新建csv文件,用于存储数据 csvf = open('data.csv', 'a+', encoding='gbk', newline='') writer = csv.writer(csvf) writer.writerow(('昵称', '年龄', '会', '想学', '留言', '城市', '性别', 'qq', 'weixin', 'mobile', 'weibo'))
#网页模板 base = 'http://www./api/recent-skills?page={page}' #for循环批量构建url for page in range(1, 10): url = base.format(page=page) resp = requests.get(url) data = resp.json()
#获得技能公告信息 exchangers = data['result']['list'] for exchanger in exchangers: nickname = exchanger.get('nickname') age = exchanger.get('age') can = exchanger.get('can') want = exchanger.get('want') remark = exchanger.get('remark') city = exchanger.get('city') gender = exchanger.get('sex') qq = exchanger.get('qq') weixin = exchanger.get('weixin') mobile = exchanger.get('mobile') weibo = exchanger.get('weibo') #存储数据 try: writer.writerow((nickname, age, can, want, remark, city, gender, qq, weixin, mobile, weibo)) #打印,看看是否抓到 print(can, want, remark, city, gender) except: pass
#关闭csv文件 csvf.close()
程序完美运行 税法 会计 透视表 驾驶 None 深圳 男 钢琴 大提琴 日语 None 天津 女 庆典策划 平面设计 驾驶 体育运动 手绘 摄影 运动 旅游 等 我觉得吧学习技能分三个阶段,首选是找到合适的换客,然后呢就是线上交流,然后就是开始学习。 黄冈 男 PS设计 闽南话 新媒体推广 陪聊 韩语 日语 书法 绘画 摄影 None 泉州 女 Ps cad su 等相关设计软件 基础绘画 英语 数据挖掘分析 等感兴趣的 None 上海 男 二胡 新颖的或者通用类技能 None 大同 男 想象力 作文 小说 假声 没必要非得假声,唱歌技巧也可以 阳泉 保密 开车 做饭 cad ps 中国话 吉他 英语 看清楚了联系 中国 男 普通话 粤语 唱歌 PS PR AU 英语口语 俄语 钢琴 电子琴 声乐 可能不会是个很好的老师(应该是严厉的那种),但会是个好学生! 广州 女 英语 法语 日语 西班牙语 哇 来交换技能鸭 adelaide 保密 针灸 艾灸等治病技能 做家务 我给你免费治病,交换做家务. 南京 女 日语 乒乓球 None 北京 男 互联网电商 运营 数据分析 None 上海 女 python编程 英语花体字 日语 None 上海 保密 开车 上海话 基础会计 只要你会的都可以 希望能学到各种技能,能交到好朋友 上海 男 古筝 中医药 视频剪辑 皮具制作 绘画 期待认识不一样的你 广州 保密 摄影 后期编辑 视频拍摄 视频剪辑 粤语 日语 因为打算去日本,所以需要学好日语。作为回报,可以教你摄影摄像及后期制作,我是职业的影像制作人。 上海 男 基础ps cdr 英语 None 株洲 女 硬笔书法(楷书 行楷) 英文书法(foundation hand old English)PS PPT python 数据分析 PR AE 会写代码分析数据的人真的好厉害呀…所以我想先学点皮毛嗯,拜托啦各位! 让我们一起成为更优秀的人吧!(*^▽^*) 南京 女 粤语 旅游 音乐 声乐 很想学好唱歌 广州 女 餐饮供应链管理 英语 None 北京 男 设计思维 数字媒体相关 绘画 化妆品护肤品安利 cpy文学 问题分析 日语 泡好看的男孩子 兴趣爱好广杂,具体可私,跪求老师教学QAQ 北京 保密 药品 陶笛 不会的东西太多,想找个老师 双鸭山 保密 日语 暴富 和男孩子不尬聊 板绘 聊聊天说不定有新发现哇 重庆 女 做饭算吗 入门视频音频处理 化妆新手 英语 数学还不错 唱歌 画画 钢琴 爵士 建筑设计 None 北京 保密 视频剪辑 儿童插画 英语 健身 None 上海‘ 女
打开csv文件,如下图 实际上我们会发现qq、微信、mobile都是空的。如果你们自己回去抓包分析下,就会发现这几个信息也是可以采集到的。这里就不教了,免得我犯错误。 希望各位都能回去学学这个爬虫,通过爬虫技术,找到你所感兴趣的技能交换者。
|