查看原文
其他

爬虫实战:如何找到感兴趣的技能交换者

大邓 大邓和他的Python 2019-04-26

之前一直想通过技能交换,学个像吉他之类的技能。正好中秋节一个人比较无聊,百度发现一个网站很好爬。用户数据都是公开的,说不定爬完了数据就能找到自己感兴趣的人和技能。【文章末尾有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(110):
    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((nicknameagecanwantremarkcitygenderqqweixinmobileweibo))

处,以增强程序的编码问题的容错能力。

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(110):
    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都是空的。如果你们自己回去抓包分析下,就会发现这几个信息也是可以采集到的。这里就不教了,免得我犯错误。


希望各位都能回去学学这个爬虫,通过爬虫技术,找到你所感兴趣的技能交换者。


往期文章

《用Python做文本分析》视频教程   

大邓强力推荐-jupyter notebook使用小技巧  

10分钟理解深度学习中的~卷积~  

深度学习之 图解LSTM  

PyTorch实战: 使用卷积神经网络对照片进行分类

Pytorch实战:使用RNN网络对姓名进行分类   

100G Python学习资料(免费下载) 

100G 文本分析语料资源(免费下载)    

typing库:让你的代码阅读者再也不用猜猜猜  

Seaborn官方教程中文教程(一)

数据清洗 常用正则表达式大全

PySimpleGUI: 开发自己第一个软件

深度特征合成:自动生成机器学习中的特征

Python 3.7中dataclass的终极指南(一) 

Python 3.7中dataclass的终极指南(二) 

15个最好的数据科学领域Python库    

使用Pandas更好的做数据科学

[计算消费者的偏好]推荐系统与协同过滤、奇异值分解

机器学习: 识别图片中的数字

应用PCA降维加速模型训练

如何从文本中提取特征信息?

使用sklearn做自然语言处理-1 

使用sklearn做自然语言处理-2

机器学习|八大步骤解决90%的NLP问题    

Python圈中的符号计算库-Sympy

Python中处理日期时间库的使用方法 

【视频讲解】Scrapy递归抓取简书用户信息

美团商家信息采集神器 

用chardect库解决网页乱码问题 




    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存