博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用python爬取知识星球
阅读量:7210 次
发布时间:2019-06-29

本文共 2222 字,大约阅读时间需要 7 分钟。

去年我们做过一个叫「学长问答」的社群活动,里面沉淀了大量有价值的互动信息,后来因为各种原因终止了。今天和涂腾聊起来,觉得这些信息就这么沉寂了太浪费。所以就试着用python爬取了知识星球的内容。

这个过程又学习了一些新的知识,已经在代码中以批注的形式写出。但还有一个没有解决的问题,就是一个提问底下可以跟好几个评论,我暂时还不能在输出结果里将「一个提问+n个评论」以整体的形式给出,而只能把评论的信息以一个字典的形式展现,这算是没有爬取的太彻底。将来再看看有没有新的解决方法。

import requestsimport jsonimport urllibimport csv#头信息。网站只提供扫码登陆的方式,没有账号密码。我以为应该比较麻烦,但在header信息里找到了Authorization信息之后,直接可以保持登陆状态了。# 令一个标志是直接在浏览器里访问内页网址的话,浏览器的报错是“{"succeeded":false,"code":401,"info":"","resp_data":{}}”,这个很像原来node.js的数据中心没有登陆的报错,而数据中心的模拟登陆也是通过在header中添加Authorization来实现的。headers = {    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',    'Referer': 'https://wx.zsxq.com/dweb/',    'Authorization': '51EC09CA-6BCC-8847-4419-FA04A2FC9E00'}#打开并写入csv文件f = open('/Users/damo/Desktop/wendatuan.csv', 'w+')writer = csv.writer(f)writer.writerow(['created_time','ask_name','ask_content','comment'])#定义爬取信息的函数主体def get_info(url):    res = requests.get(url,headers = headers)    json_data = json.loads(res.text)    datas = json_data['resp_data']['topics']    for data in datas:        if 'talk' in data.keys(): # 判断json中是否包含 talk 这个键            ask_name = data['talk']['owner']['name']            ask_content = data['talk']['text']        else:            ask_name = ''            ask_content = ''        if 'show_comments' in data.keys():            comment = data['show_comments']        else:            comment = ''        created_time = data['create_time']        writer.writerow([created_time,ask_name,ask_content,comment])    # 截止到前面的代码,已经可以实现一个页面的爬取。下面的代码内容主要任务是实现“如何自动实现多页面爬取”    # 多页面的爬取是通过Network中Query String Parameters来实现的:这里提供两个参数,观察之后发现count是固定值,而end_time和网址最后的时间是一样的。    # 只不过在网页中用到了 urlencode的转化,这部分是新学习的知识。    # 在这个爬虫案例中,网页构造的核心逻辑是“上一组最后一个数据的创建时间刚好是下一组数据访问网址中的一个参数”,以此来构造循环抓取的网址    end_time = datas[19]['create_time']    url_encode = urllib.parse.quote(end_time) # urlencode,将网址中的文本转化    next_url = 'https://api.zsxq.com/v1.10/groups/518282858584/topics?count=20&end_time='+url_encode # 通过观察构造下一组数据的网址    get_info(next_url) # 这里比较巧,直接在函数内部再次调用函数,从而实现不断的自循环if __name__ == '__main__':    url = 'https://api.zsxq.com/v1.10/groups/518282858584/topics?count=20'    get_info(url)

转载地址:http://ougum.baihongyu.com/

你可能感兴趣的文章
你对C++语言的理解到了哪一步呢
查看>>
JEECMS中FreeMarker的Macro
查看>>
高性能JavaScript(您值得一看)
查看>>
工作记录
查看>>
MySQL修改默认字符集
查看>>
HTTP Keep-Alive是什么?如何工作?
查看>>
maven 异常解决
查看>>
实现林间的选择性身份验证
查看>>
进程的调度算法
查看>>
使用elasticsearch1.5.2实现查找附近的人
查看>>
SQL SERVER 批量将修改字段名为大、小写
查看>>
#ifdef __cplusplus extern C{}与C和C++间的关系
查看>>
lvs的nat模式实验
查看>>
利用ftp服务器实现无人值守的安装
查看>>
Vbs脚本编程简明教程之六
查看>>
德国罗森伯格荣获2013年度中国综合布线十大品牌以及数据中心标准化产品应用奖...
查看>>
使用vue开发项目需要注意的问题和可能踩到的坑
查看>>
webpack 模块标识符(Module Identifiers)
查看>>
PHP有前途吗?
查看>>
sm1、sm2、sm3、sm4简单介绍
查看>>