Day 16:专案03 - PTT 八卦版爬虫01 | cookie

偷看一下专案长怎样

我预期的专案想要完成这几件事:

  1. 取得八卦版每篇文章的标题、作者和发文时间
  2. 取得文章内容
  3. 取得底下的留言,并依照标签分类。
  4. 整理资料并汇出成json档案。

既然昨天已经成功抓到C_Chat板的文章标题了,那八卦板应该依样画葫芦就好了吧?

import requests
from bs4 import BeautifulSoup

response = requests.get(
    "https://www.ptt.cc/bbs/Gossiping/index.html")  # 改成八卦板的网址
root = BeautifulSoup(response.text, "html.parser")  # 解析原始码

links = root.find_all("div", class_="title")    # 文章标题
for link in links:
    print(link.text.strip())  # strip()用来删除文字前面和後面多余的空白

结果... 什麽事都没有发生??

怎麽会这样呢? 我们进八卦板找一下原因到底出在哪里。

第一次进八卦板时,首先是看到这个画面,询问你是否满18岁,相信大家对这个都不陌生,小时候看到这个一定都是点 "我同意" 对吧?,点下去後才会到文章列表。

所以我猜测之所以会失败,大概就是因为抓到的是这个画面而不是文章列表。我们把抓到的原始码印出来,验证看看我的猜测是不是对的。

response = requests.get(
    "https://www.ptt.cc/bbs/Gossiping/index.html")  # 改成八卦板的网址
root = BeautifulSoup(response.text, "html.parser")  # 解析原始码
print(root.prettify())

结果果然是抓到这页了!

Cookie

现在我们知道问题出在哪了,但重点是,我们要怎麽解决这个问题呢? 难道就束手无策了吗?

先别急着放弃,我们再进PTT八卦板一次,这时你可能会发现,第二次进八卦板时,就不会再问你是否满18岁了,这是为什麽呢??

我们打开 F12>>Application>>Cookies,仔细观察进PTT八卦板的过程中发生了什麽事。

如果不是第一次进八卦板,请先点右上角的这个图示清除cookie。清除後再重整一次。

第一次进八卦板时,看到的应该就是询问是否满18岁的画面。然後当我按下 "我同意" 时,cookie会多出一个 over18=1,这就是PTT存在浏览器中,记录我是否点过满18的cookie。

再来观察 Network>>index.html>>Headers>>cookie,会发现PTT就是把cookie包装在Headers中发送出去的。

所以我们可以推测,PTT的服务器应该是在我们点"我同意"时,在我们的浏览器中存下了over18=1的cookie,并在请求文章列表的同时,将这个cookie一同送给服务器做验证,服务器验证OK後就会回传正确的文章列表回来了。

现在,解决方法就非常清楚,我们只要让程序模拟使用者,发送一个一样的cookie,就能顺利让服务器回传文章列表了!

程序码不用改太多,只要多加上cookie和headers。

import requests
from bs4 import BeautifulSoup

my_headers = {"cookie": "over18=1"}  # cookie设定

response = requests.get(
    "https://www.ptt.cc/bbs/Gossiping/index.html", headers=my_headers)  # 放在headers栏位中传送
root = BeautifulSoup(response.text, "html.parser")  # 解析原始码

links = root.find_all("div", class_="title")    # 文章标题
for link in links:
    print(link.text.strip())  # strip()用来删除文字前面和後面多余的空白

执行结果:

果然就成功了!!!

最後来简单介绍一下cookie:

Cookie(复数形态:Cookies),又称「小甜饼」。类型为「小型文字档案」,指某些网站为了辨别使用者身分而储存在用户端(Client Side)上的资料(通常经过加密)。

-- 维基百科

简单来说,cookie就是服务器暂存在用户端(client)这边的便利贴,上面记录了你之前的所做过的事情,之後在发相同的请求时,就会连同cookie带给服务器,好让服务器知道你做过什麽事。

现在看起来不错,但好像少了些什麽?

一段时间後你可能会发现,当每次向服务器送出请求(Request)时,都必须补上cookie,服务器才会正确的传回网页,这是一件很麻烦的事啊,有没有更好的做法呢?

会这麽问当然就是有啦,想知道吗? 嘿嘿...明天就会告诉你了~?

小结

今天介绍了PTT八卦板怎麽使用cookie记录你是否曾经点过 "我同意",并让程序模仿使用者做一模一样的事情。

明天的内容相当精采(会有很多梗图哦),千万别错过~~


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

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

有任何问题或建议,都欢迎在底下留言区提出,还请大家多多指教。


<<:  Kotlin Android 第16天,从 0 到 ML - MVVM架构 - ViewModel

>>:  .NET Core第21天_FormTagHelper的使用_防止跨站请求设置方式

http 与 https

HTTP 和 HTTPS 简介 HTTP Http的全名是 HyperText Transfer P...

Day 22. Unreal 再见

有鉴於我的Macbook pro开unreal engine时,实在是真的卡,所以只好先放着。   ...

DAY7: Node 的事件循环 (Event loop)

今日要介绍Node事件循环的概念,前面文章一直提到Node和JavaScipt虽然拖不了太大的关系,...

[Day 17] Facial Recognition - siamese networks: 只是一个开始

双胞胎有同卵双生或异卵双生,孪生网路当然也要有 今天开始我们将谈谈如何让网路去学习辨识不同的人脸,...

[Day15]程序菜鸟自学C++资料结构演算法 – 二元树的基本应用

前言:介绍完了二元树的建立和走访方式,紧接着要来介绍其他基本应用,一样用上一篇的程序码进行修改 可以...