我预期的专案想要完成这几件事:
既然昨天已经成功抓到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())
结果果然是抓到这页了!
现在我们知道问题出在哪了,但重点是,我们要怎麽解决这个问题呢? 难道就束手无策了吗?
先别急着放弃,我们再进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 Http的全名是 HyperText Transfer P...
有鉴於我的Macbook pro开unreal engine时,实在是真的卡,所以只好先放着。 ...
今日要介绍Node事件循环的概念,前面文章一直提到Node和JavaScipt虽然拖不了太大的关系,...
双胞胎有同卵双生或异卵双生,孪生网路当然也要有 今天开始我们将谈谈如何让网路去学习辨识不同的人脸,...
前言:介绍完了二元树的建立和走访方式,紧接着要来介绍其他基本应用,一样用上一篇的程序码进行修改 可以...