爬虫实战:如何找到感兴趣的技能交换者
之前一直想通过技能交换,学个像吉他之类的技能。正好中秋节一个人比较无聊,百度发现一个网站很好爬。用户数据都是公开的,说不定爬完了数据就能找到自己感兴趣的人和技能。【文章末尾有jupyter notebook教程】
一、网站分析
1.1 网站
技能交换网 http://www.591skill.com/
1.2 抓包分析
从下图中,我们发现 加载更多
这四个字,往往表示该网页是 动态网页
。
我们打开 开发者工具 (按F12键打开)
的 Network面板
,并且选中 XHR
。
现在我们点击 加载更多
按钮,发现 Network面板
中出现了 json格式数据
。
1.3 网址规律
点击 加载更多
得到的网址为
http://www.591skill.com/api/recent-skills?page=1&_=1537805020106
其中 &_=1537805020106
应该是时间戳,对结果无影响。最终的网址是
http://www.591skill.com/api/recent-skills?page=1
我们只需要改动page参数就可以一直抓取该网站的 技能交换公告信息
。
二、发起请求
现在知道了网址规律,我们只需要使用requests库就能立即的得到我们想要的 技能交换信息
,现在我们先只访问 第一页信息
:
import requests
#第一页url
url = 'http://www.591skill.com/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.591skill.com/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.591skill.com/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.591skill.com/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.591skill.com/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都是空的。如果你们自己回去抓包分析下,就会发现这几个信息也是可以采集到的。这里就不教了,免得我犯错误。
希望各位都能回去学学这个爬虫,通过爬虫技术,找到你所感兴趣的技能交换者。