前言
为啥会写这篇文章
最近有些无聊,于是学习了点python爬虫的相关的知识
爬虫是什么
用python的某些库来模仿人类上网,批量获取想要的数据
比如,我每天想看某个小说网站上自己想看的小说(这本小说每天更新),为了看这本小说我每天都得打开该网站进行阅读,可能还得忍受侧边栏的广告.有没有一种方式,能让我每天获取更新的小说文本呢?答案就是使用python写一个爬虫程序,每天定时(可以在小说更新后的一段时间后)从这网站获取更新小说的最新章节.
很容易发现,我们想要的程序有以下几个需求
- 每天定时从网站获取小说的最新内容
- 把获取的内容经过加工处理存放成为我们想要的文件格式(比如txt文本类型)
第一点又可以分为两部分
- 定时执行
- 向小说网站发送请求,得到网站的回应内容
带着这样的需求写一个python程序可能会比较快地上手爬虫
waite a minutes 为啥非得用python写呢,其他语言不行吗
首先可以肯定的是其他语言是可以写爬虫程序的,比如jaba cpp rust等 其次,不优先使用他们的原因是1.可能没有py的库丰富2.语法不大简洁,可能py一句要在其他语言里使用好几句 最后,请大家记住爬虫就是用程序代理人类向服务器发送请求,然后处理服务器响应给我们的数据
了解http的一些基础知识
请求
需要了解的一点
我门平时上网的时候,比如使用谷歌浏览器,想要访问bilibili,在搜索框里输入哔哩哔哩的域名(bilibili.com)之后,一般情况下,我们客户端会先向dns服务器发送一个请求,请求bilibili.com的服务器的ip地址是啥,dns服务器找到后返回给客户端一个ip(这就是批站服务器的ip了),然后我们就会向这ip发送个get请求,批站服务器响应我们请求,发送给我们一大段内容(这段内容经过浏览器渲染后就是我们所看到的批站首页了)
上述的过程基本是我们用浏览器上网的大多数情况,我们所做的第一步就是用程序来模仿这个过程
在正式开始前,我们需要了解一点基本的http知识方便我们在后边抓包
以请求批站为例子 F12打开开发者工具,我们能看到:
Elements里的内容是我们当前界面经过渲染后的所有html内容 我们主要关注的是Network这一列
随便打开一个链接我们观察下: 
请求头
点开request header,我们可以发现有这么一堆 
主要关注UA 这项表明我们是在用什么操作系统的什么浏览器去访问这个网站,相当于我们的一个身份信息了
一个官方点的描述:请求头是 HTTP 头的一种,它可在 HTTP 请求中使用,并且和请求主体无关 。某些请求头如 Accept、Accept-、 If- 允许执行条件请求。某些请求头如:Cookie, User-Agent 和 Referer 描述了请求本身以确保服务端能返回正确的响应。
响应
状态码
状态码是描述请求一个网站后所处状态的数字
这里显示的是200,表示我们请求已成功,请求所希望的响应头或数据体将随此响应返回。实际的响应将取决于所使用的请求方法。在GET请求中,响应将包含与请求的资源相对应的实体。在POST请求中,响应将包含描述或操作结果的实体。
其他状态码请查阅维基百科
响应体
响应体就是服务器发送给我们的数据了,这里显示的一个json 
后续
关于http的相关知识还有很多,读者有兴趣可以自行查阅相关文档
开始编码
robots.txt
“爬虫爬的好,牢饭吃得饱”,爬虫是有法律风险的,有些网站并不想让你爬取一些数据,如果你不幸爬了可能要吃律师函
一般网站有个君子协定,robots.txt,规定了哪些东西可以爬,哪些东西不可以爬,当然如果你遵守这约定也可能吃牢饭,这尺度大家自行把握
这是批站的一个例子: 