2020-07-26 Python学习笔记31 爬虫初体验

一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习。

声明:本人学习是在扇贝编程通过网络学习的,相关的知识、案例来源于扇贝编程。如果使用请说明来源。

第1关:爬虫初体验

什么是网络爬虫

网络爬虫,简称爬虫,是一种按照一定的规则,自动地抓取互联网信息的程序或者脚本。

爬虫做的事情其实和蜘蛛是类似的,所以网络爬虫也被称为网络蜘蛛(spider)。蜘蛛在蜘蛛网上爬来爬去,把触手伸到蜘蛛网获取食物,而网络爬虫则是在互联网上爬来爬去,爬取我们需要的数据。

搜索引擎本质上就是爬虫,搜索引擎将互联网上的网页都爬取并存储起来。当我们搜索的时候,搜索引擎就从自己存储的网页里找到我们需要的结果并展示出来。

而我们可以通过爬虫获取海量的数据,所以爬虫是这一切的源头。

浏览器的工作原理

浏览器是怎么知道网站内容的呢?难道浏览器将所有网站的内容保存下来了?

当然不是这样!其实,浏览器偷偷地和 服务器 进行了交流,服务器将博客网站的内容传输给浏览器,浏览器收到后解析成你最终看到的网页。

拓展:浏览器通过 DNS(Domain

Name System)将域名转换成对应的 IP 地址,从而找到对应网站的服务器。图1

首先,我们在浏览器输入网址(URL)。然后浏览器去访问该网址对应的服务器,这个过程叫请求(request)。接着服务器将网站内容发送给浏览器,这个过程叫 响应(response)。

浏览器拿到服务器返回的内容后,一般都是网页的源代码。还需要浏览器将内容解析成我们能看懂的样子,也就是我们最终在浏览器里看到的网页。

其实,爬虫就是模拟浏览器的行为,从而获取网站的数据。


爬虫的工作原理

爬虫可以像浏览器一样向服务器发起请求,拿到服务器返回的数据后,可以根据我们设定的规则去提取需要的数据,数据处理完成后再将数据存储起来。图2

爬虫工作的三个步骤:

第一步:获取数据,爬虫会根据我们提供的网址,向服务器发起请求获取数据;

第二步:处理数据,对获取的数据进行处理,得到我们需要的部分;

第三步:存储数据,将处理后的数据保存起来,便于后续的使用和分析等。

爬虫中最常用的发起请求的第三方库——requests。requests 的中文文档页面(https://requests.kennethreitz.org/zh_CN/latest/)。

Tips:如果你的电脑上没安装Python,或者不知道具体如何安装 requests 库。请查看该文章:https://wpblog.x0y1.com/?p=34。

requests.get() 方法

import requests #导入 requests 模块

res =requests.get('https://wpblog.x0y1.com')  # 发起请求

print(res)

# 输出:

使用 requests.get('网站地址') 方法向对应的网站发起了请求,然后我们将返回的结果存到了变量 res 中供后续使用。它的类型是 Response 对象,后面的 200 是状态码,表示请求成功。图3

Response 对象

通过 requests.get() 方法获取到了网页的数据,作为 Response 对象存到了变量 res,那么我们如何查看它的具体内容呢?

Response 对象的常用属性:

res.status_code      响应的HTTP状态码

res.text             相应内容的字符串形式

res.content          响应内容的二进制形式

res.encoding         响应内容的编码


res.status_code

 

import requests

res =requests.get('https://wpblog.x0y1.com')

print(res.status_code)

# 输出:200

这里的 200 就是响应的状态码,表示请求成功。当请求失败时会有不同的状态码,不同的状态码有不同的含义,常见的状态码如下:

1xx  消息       100   继续发出请求

2xx  请求成功   200   请求成功

3xx  重定向     301  永久重定向

4xx  客户端错误 404   找不到资源

5xx  服务端错误 503   服务不可用


练习:请求是否成功

通过 res.status_code 的值来判断请求是否成功,当其值为 200 时表示请求成功。

接下来请你补全下面的代码,当请求成功时打印出 请求成功,否则打印出 请求失败。

import requests

res =requests.get('https://wpblog.x0y1.com')

# 补全下行代码

if 200 <= res.status_code< 300:

# 答案直接用if res.status_code== 200:我理解2xx 是200到300之间的都可以,是否如此?

 print('请求成功')

else:

 print('请求失败')


res.text

res.text 返回的是服务器响应内容的字符串形式,也就是文本内容。


import requests

res = requests.get('https://wpblog.x0y1.com')

print(res.text)

练习:

试试用爬虫下载一个小说——孔乙己,它的网址是

https://apiv3.shanbay.com/codetime/articles/mnvdu。该网址返回的是小说的纯文本格式,源代码和内容是一样的。

import requests

# 获取孔乙己数据

res =requests.get('https://apiv3.shanbay.com/codetime/articles/mnvdu')

# 以写入的方式打开一个名为孔乙己的txt 文档

with open('孔乙己.txt', 'w') as file:

  #将数据的字符串形式写入文件中

  file.write(res.text)


open() 函数是 Python 中的内置函数,用于打开文件,返回值是一个 file 对象。

open() 函数接收的第一个参数为文件名,第二个参数为文件打开模式。打开模式默认为 r,是 read 的缩写,表示只读模式。即只能读取内容,不能修改内容。

常用的打开模式有 w(write,只写模式)、b(binary,二进制模式)和 a(append,追加模式,表示在文件末尾写入内容,不会从头开始覆盖原文件)。

Tips:在 w 和 a 模式下,如果你打开的文件不存在,那么 open() 函数会自动帮你创建一个。

这些打开模式还能两两组合,比如:rb 表示以二进制格式打开文件用于读取,wb 表示以二进制格式打开文件用于写入,ab 表示以二进制格式打开文件用于追加写入。

需要注意的是,使用 open() 函数打开文件,操作完毕后,最后一定要调用 file 对象的 close() 方法关闭该文件。所以一般我们像下面这样读写文件:

# 读取文件

file = open('文本.txt')  #打开模式默认为 r,可省略

print(file.read())  #调用 read() 方法读取文件内容

file.close()  #关闭文件


# 写入文件

file = open('文本.txt', 'w')  #写入模式

file.write('扇贝编程')  #调用 write() 方法写入内容

file.close()  #关闭文件


为了避免忘记调用 close() 方法关闭文件,导致资源占用、文件内容丢失等问题,推荐使用with ... as ...语法,它在最后会自动帮你关闭文件。

# 普通写法

file = open('文本.txt','w')  #写入模式

file.write('扇贝编程')  #调用 write() 方法写入内容

file.close()  #关闭文件


# 使用 with ... as

... 写法

with open('文本.txt','w') as file:

 file.write('扇贝编程')


使用 with ... as ... 语法后,关闭文件的操作就可以省略了。不仅代码简洁了,也避免了忘记关闭文件的问题。


了解了文件操作之后,我们重新


import requests

# 获取孔乙己数据

res =requests.get('https://apiv3.shanbay.com/codetime/articles/mnvdu')

# 以写入的方式打开一个名为孔乙己的txt 文档

with open('孔乙己.txt','w') as file:

  #将数据的字符串形式写入文件中

 file.write(res.text)


获取到网页的响应后,以写入模式打开一个名为 孔乙己.txt 的文件,然后调用 write() 方法将响应内容的字符串形式写入到文件中,实现了小说的下载。同理,所有文本内容都可以通过这种方式进行下载,只需将 res.text 写入到文件当中保存即可。


res.content

除了文本内容的下载,爬虫还能下载图片、音频、视频等。

import requests

# 获取图片数据

res =requests.get('https://assets.baydn.com/baydn/public/codetime/xiaobei/info.jpg')

# 以二进制写入的方式打开一个名为info.jpg 的文件

with open('info.jpg', 'wb') as file:

  #将数据的二进制形式写入文件中

 file.write(res.content)

下载小说的步骤几乎一样。区别在于图片是用二进制写入的方式,将数据的二进制形式写入文件当中,而不是字符串形式。

所以 res.text 和res.content 的区别是:res.text 用于文本内容的获取、下载,res.content 用于图片、音频、视频等二进制内容的获取、下载。

res.encoding

编码是信息从一种形式或格式转换为另一种形式的过程,常见的编码方式有 ASCII、GBK、UTF-8 等。如果用和文件编码不同的方式去解码,我们就会得到一些乱码。

res.encoding 就是爬虫获取到数据的编码格式,requests 库会根据内容推测编码格式是什么,然后将 res.encoding 设成推测的格式,在访问 res.text 时使用该格式解码。

当推测的格式错误时,即出现乱码时,就需要我们手动给 res.encoding 赋值成正确的编码。


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351