Day 14:专案02 - PTT C_chat版爬虫01 | 爬虫简介、request和response、Requests

⚠行前通知

先前已经学过Python但想学爬虫的人可以回来罗~ 从今天起就开始大家最期待的网页爬虫的单元了! 虽然比原本预计的晚了2天,但该讲的依旧不会少,那麽就开始吧!

\( ^▽^ )/\( ^▽^ )/\( ^▽^ )/

What is 爬虫?

我们一直讲爬虫爬虫,但爬虫到底是什麽? 我们上Google搜寻一下"爬虫"...

恩...好像跟我想的不太一样对吧(´・ω・`)?

我们这边的爬虫不是指爬虫类,而是网页爬虫啦! 那什麽是网页爬虫呢?

网页爬虫(英语:web crawler),也叫网路蜘蛛(spider),是一种用来自动浏览全球资讯网的网路机器人。其目的一般为编纂网路索引。
网路搜寻引擎等站点通过爬虫软件更新自身的网站内容或其对其他网站的索引。网路爬虫可以将自己所存取的页面储存下来,以便搜寻引擎事後生成索引供使用者搜寻。
--维基百科

简单的来说,网页爬虫是一个机器人,可以自动化浏览网页并撷取我们想要的资料。

Why 爬虫?

可能有人会想:浏览网页我也会阿,抓资料不就复制贴上就好了吗? 干嘛需要爬虫呢?

少少的资料的确可以手动抓,但实务上的例子经常是非常大量的资料,我举之後要做的专案为例:爬取PTT八卦版前10页的作者、标题、时间、所有留言...,你想想如果要手动完成这件事是要花费多大的时间和力气。然而爬虫只要让程序开始执行,你就可以去喝杯下午茶等程序自动帮你完成了! 如此比较就可以知道爬虫真的很方便。

Who 爬虫?

其实只要你有想要从网路上取得大量资料的需求,就可以学习爬虫,举几个比较常用的领域为例:

  • 训练机器学习模型
  • 股票分析
  • 市场分析

说了这麽多,但你还没告诉我到底要怎麽爬虫阿?

先别急,我们先来了解网页到底是怎麽运作的。

网页的运作方式

不管你是用手机还是电脑,当我们在网路上浏览网站时,我们就是用户端(Client),当我们点一个网页时,就是向存放该网页的服务器(Server)送出请求(Request),当服务器接收到我们的请求後,就会回传网页的内容回来,这就是回应(Response)。

回应的内容就是前面学过的HTML原始码,浏览器(Chrome、Edge、Firefox、IE...)取得这些原始码後,依照HTML的标签和CSS的属性,渲染成我们眼前所看到的画面。

而网页的网址(URL)就像网路世界中的地址,告诉网路这个网页该找哪个服务器拿取。

所有的网页都是这样运作的,包括你现在正在看的IT铁人赛!

常见的浏览器们:

哦! 抱歉,我放错图了w

听完後还是觉得雾煞煞吗? 其实网路运作方式就跟去餐厅点餐的流程很相似,客人当作用户端(Client),餐厅老板当作服务器(Server)。

  • 当我们进到一间餐厅看着菜单,就像在浏览器上浏览众多的网页。
  • 接着,到柜台向老板点餐,就像是看到喜欢的网页,发出请求(Request)给伺服端(Server)想看的网页。
  • 最後,等待老板烹饪完成送到餐桌上,像是伺服端(Server)端将回应(Response)回传给用户端(Client)。

跟上面的图还满像的,对吧?

Requests套件

看懂上面网页request和response的流程之後,再来就要讲怎麽在程序上实作。

其实也满简单的,因为Python提供了很多好用的爬虫套件,这就是我们为什麽要学Python。今天用到的是Requests套件。

Anaconda预先就载好了Requests套件,可以到这里查询。但如果你不是用Anaconda环境的话,就要到你的cmd上,使用pip(Python套件管理工具)把套件安装下来。

// cmd
pip install requests

安装完後就可以在你的程序码中引用Requests套件了。

import requests

Requests使用get()函数取得网页的原始码,输入为网页的URL。

response = requests.get("https://www.ptt.cc/bbs/C_Chat/index.html")    # 以ptt C_Chat版为例
print(response.text)
print(response.status_code)

回传的是一个response的物件,物件中的text就是网页的原始码了!

撷取结果的一小部分:

另外,status_code表示网页的回应状态,几种常见的状态码:

  • 200:一切顺利,结果已经回传。
  • 301:服务器将使用者重新定向(re-direct)到另一个位址,当网站更换网域名称或更改 Routes 时可能会发生。
  • 400:错误的语法请求。
  • 401:未通过服务器的身份验证,当请求没有一并发送正确凭证时会发生。
  • 403:服务器已经理解请求,但是拒绝执行它,意即与请求一并发送的凭证无效。
  • 404:找不到目标。

更多状态码:MDN - HTTP 状态码

建议在爬虫时都把status_code印出来看一下,在出错时比较容易Debug。

小结

今天是爬虫单元的第一天,首先对爬虫有个基本的认识,然後厘清了网页request和response的运作方式,最後使用Python的Requests套件抓取网页的原始码下来。

听完後有没有对网路的世界大大改观了呢XD,我当初知道网路的运作方式後,也是非常的惊讶,原来我们平常在浏览网页时,电脑背後都在帮我们做这些事! 以後在逛网站的时候,不妨也观察一下电脑到底做了哪些事哦~

明天要来讲Python的网页解析套件 -- BeautifulSoup,敬请期待~


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

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

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


<<:  [Tableau Public] day 19:试着分析appstore资料集-4

>>:  Day4- 整数与变数 和 型态转换

LeetCode - 8 String to Integer (atoi)

本篇同步发布於Blog:[解题] LeetCode - 8 String to Integer (a...

[Day 09] 资料和资料之间的一对多关联

透过 DAO 方式存取资料,除了用传统的 join 方式处理资料表之间的关联外,也可以直接从物件之间...

LeetCode 387. First Unique Character in a String

题目 Given a string, find the first non-repeating ch...

第40天~

这个得上一篇:https://ithelp.ithome.com.tw/articles/10258...

Day15 Combine 02 - Publisher

Publisher 在Combine 中,Publisher 是观察者模式中的Observable,...