Day 19:专案03 - PTT 八卦版爬虫04 | 留言、换页、json

各位早阿,今天就接续昨天的部分,继续抓取留言和汇出成json档吧!

留言区

观察一下PTT的留言区,可以看到留言分成三种,分别是"推"、"嘘"和"→",每则留言都有标签、作者、内容和时间这些资讯,接下来就是要取得这些资讯并依照标签分类。

随便对一则留言右键>>检查,发现留言是在class="push"<div>内,资讯则分别在class="push-tag"、"push-userid"、"push-content"、"push-ipdatetime"中。

因此程序码就很单纯:

# 抓出所有留言
comments = main_content.find_all("div", class_="push")
for comment in comments:
    push_tag = comment.find(
        "span", class_="push-tag").string   # 分类标签
    push_userid = comment.find(
        "span", class_="push-userid").string  # 使用者ID
    push_content = comment.find(
        "span", class_="push-content").string   # 留言内容
    push_time = comment.find(
        "span", class_="push-ipdatetime").string   # 留言时间

为了分类,我建立三个list,分别存放"推"、"→"、"嘘"三种标签。

push_dic = []
arrow_dic = []
shu_dic = []

再来就用字典型式将所有资料塞好塞满,然後再依照标签分类就好罗~

dict1 = {"push_userid": push_userid, "push_content": push_content, "push_time": push_time}
if push_tag == "推 ":
    push_dic.append(dict1)
if push_tag == "→ ":
    arrow_dic.append(dict1)
if push_tag == "嘘 ":
    shu_dic.append(dict1)

自动换页

现在虽然可以抓下文章清单中的资料了,但只有第一页的文章而已,要怎麽样才能抓其他页的文章呢??

想一下,我们想要看上一页时,会做什麽事?
废话! 当然就是按 "上页" 按钮阿!

对上方导览列的 "上页" 按钮右键>>检查,上一页的连结就在string="‹ 上页"<a>中。

更新url变数,然後用for回圈想抓几页就抓几页!

url = "https://www.ptt.cc/"+soup.find("a", string="‹ 上页")["href"]

json

目前都只是将抓到的资料印在terminal上,如果之後要用到这些资料做後续分析的话,就很不方便了,所以我们要将资料转成json格式并存在电脑中。

json毕竟是第一次提到,还是来介绍一下什麽是json。

JSON(JavaScript Object Notation)是由道格拉斯·克罗克福特构想和设计的一种轻量级资料交换格式。其内容由属性和值所组成,因此也有易於阅读和处理的优势。
JSON是独立於程序语言的资料格式,其不仅是JavaScript的子集,也采用了C语言家族的习惯用法,目前也有许多程序语言都能够将其解析和字串化,其广泛使用的程度也使其成为通用的资料格式。

-- 维基百科

另外,python和json格式上有很高的对应关系。底下是两者各自对应到的物件。

所以,我们要做的前置作业就是把资料整理好,以利将其转成json档。刚才也看到了python和json格式上的对应关系,这里只要将资料整理成由list和dictionary所组成的复合型态就好了。

json资料的架构:

程序码:

data = []   # 全部文章的资料
article_data = {}   # 单篇文章的资料
comment_dic = {}   # 所有留言

article_data["author"] = author
article_data["title"] = title
article_data["time"] = time
article_data["content"] = content
comment_dic["推"] = push_dic
comment_dic["→"] = arrow_dic
comment_dic["嘘"] = shu_dic
article_data["comment"] = comment_dic

data.append(article_data)

更佛心的是,Python内建有json套件,利用dump()这个函数就能将其转成json格式并汇出罗!

# 输出JSON档案
with open('data.json', 'w', encoding='utf-8') as file:
    json.dump(data, file)

执行後,在同个目录下就会出现data.json这个档案,用记事本打开後如果有东西那就是成功了。

不过看到的应该是一大串编码,没办法知道资料是不是对的,这边偷偷告诉你一个好康的,到 json editor 这个网站,帮你将json资料转为树状显示,就可以很方便的确认资料是否正确~

点 "Open from disk" 就可以汇入刚才的json档罗。

完整程序码请到GitHub上面看~ (不想贴出来占空间了)

小结

PTT八卦板爬虫就教到这边,希望大家看完後对爬虫都已经有一些基础的认知了,明天起就会搭配专题介绍比较进阶的爬虫技巧,让你体会到爬虫真正的强大之处,我认为应该是比较有趣的部分,大家敬请期待~


如果喜欢这系列文章麻烦帮我按Like加订阅,你的支持是我创作最大的动力~

本系列文章以及范例程序码都同步更新在GitHub上,後续会持续的更新,如果喜欢也麻烦帮我按个星星吧~


<<:  Day16 Grafana (Match Making)

>>:  Day 12 - 三朵云的入门(云端基础证照)

强型闯入DenoLand[29] - 去标签密技

强型闯入DenoLand[29] - 去标签密技 笔者在昨天非常粗略地介绍了 Oak 的概念。此外...

前端工程学习日记24天 codpen 一秒使用css rest <设定完一劳永逸.

附上作业 https://codepen.io/pwbzvqja/pen/XWMdvqz 如图 ...

[第十八只羊] 迷雾森林舞会XII Hotwire 101

天亮了 昨晚是平安夜 关於迷雾森林故事 大风大浪 画面恢复正常後 大家打理着全身湿透的毛 甩了甩头 ...

Day 21 : 模型优化 - 剪枝 Pruning

如果说可以让模型缩小10倍,精度还维持水准,这是什麽巫术? 延续 Day 20 的模型优化作法,本...

Day 11 - Confusion Matrix 混淆矩阵-模型的好坏 (1)

如何验证正确率, 或如何辨别机器学习模型的好坏? 我们常使用Confusion Matrix[混淆矩...