阅读 506

全网最全python爬虫精进(风变编程)

全网最全python爬虫精进(风变编程)

4.25(第一天)


**


第0关 认识爬虫

**

1、初始爬虫

爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。

2、明晰路径

2-1、浏览器工作原理


(1)解析数据:当服务器把数据响应给浏览器之后,浏览器并不会直接把数据丢给我们。因为这些数据是用计算机的语言写的,浏览器还要把这些数据翻译成我们能看得懂的内容;

(2)提取数据:我们就可以在拿到的数据中,挑选出对我们有用的数据;

(3)存储数据:将挑选出来的有用数据保存在某一文件/数据库中。

2-2、爬虫工作原理


(1)获取数据:爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据;

(2)解析数据:爬虫程序会把服务器返回的数据解析成我们能读懂的格式;

(3)提取数据:爬虫程序再从中提取出我们需要的数据;

(4)储存数据:爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。

3、体验爬虫

3-1、requests.get()

①、安装 requests 库

Mac电脑里打开终端软件(terminal),输入pip3 install requests,然后点击 enter;

Windows电脑里叫命令提示符(cmd),输入pip install requests 。

提示:往后安装其他库时与上方类似,pip install 模块名


②、requests 库作用

requests 库可以帮我们下载网页源代码、文本、图片,甚至是音频。其实,“下载”本质上是向服务器发送请求并得到响应。


③、requests 库使用

选择语言

res = requests.get(‘URL’)

requests.get 是在调用requests库中的get()方法,它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后服务器对请求作出了响应。我们把这个响应返回的结果赋值在变量res上。



3-2、Response对象的常用属性


①、response.status_code

打印 response 的响应状态码,以检查请求是否成功。


②、response.content

把 Response 对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载。


③、response.text

把 Response 对象的内容以字符串的形式返回,适用于文字、网页源代码的下载。


④、response.encoding

能帮我们定义Response对象的编码。(遇上文本的乱码问题,才考虑用res.encoding)

3-3、汇总图解



4、爬虫伦理

4-1、Robots 协议

Robots 协议是互联网爬虫的一项公认的道德规范,它的全称是“网络爬虫排除标准”(Robots exclusion protocol),这个协议用来告诉爬虫,哪些页面是可以抓取的,哪些不可以。

4-2、协议查看

(1)在网站的域名后加上/robots.txt就可以了。如淘宝的robots协议 ( http://www.taobao.com/robots.txt);

(2)协议里最常出现的英文是Allow和Disallow,Allow代表可以被访问,Disallow代表禁止被访问。

目录

1、初始爬虫

2、明晰路径

2-1、浏览器工作原理

2-2、爬虫工作原理

3、体验爬虫

3-1、requests.get()

3-2、Response对象的常用属性

3-3、汇总图解

4、爬虫伦理

4-1、Robots 协议

4-2、协议查看


程中我们的示范,会用谷歌浏览器(Chrome)进行演示,强烈推荐你也使用它。

如果你还没有谷歌浏览器(Chrome),打开下面的链接,就可以下载Chrome的安装包了,Windows和Mac都有:谷歌浏览器(Chrome)安装教程(https://www.google.cn/intl/zh-CN/chrome/)


初识爬虫

什么是爬虫?

到底什么是爬虫呢?


爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。


爬虫能做很多事,能做商业分析,也能做生活助手,比如:分析北京近两年二手房成交均价是多少?深圳的Python工程师平均薪资是多少?北京哪家餐厅粤菜最好吃?等等。


这是个人利用爬虫所做到的事情,而公司,同样可以利用爬虫来实现巨大的商业价值。比如你所熟悉的搜索引擎——百度和谷歌,它们的核心技术之一也是爬虫,而且是超级爬虫。


以百度为例,你在搜索的时候仔细看,会发现每个搜索结果下面都有一个百度快照。

1

2

3

4

5

6

7

8

9

10

11



点击百度快照,你会发现网址的开头有baidu这个词,也就是说这个网页属于百度。



这是因为,百度这家公司会源源不断地把千千万万个网站爬取下来,存储在自己的服务器上。你在百度搜索的本质就是在它的服务器上搜索信息,你搜索到的结果是一些超链接,在超链接跳转之后你就可以访问其它网站了。


爬虫还让这些搜索巨头有机会朝着人工智能的未来迈进,因为人工智能的发展离不开海量的数据。而每天使用这些搜索网站的用户都是数以亿计的,产生的数据自然也是难以计量的。


从搜索巨头到人工智能巨头,这是一条波澜壮阔的路。而我们应该看到,事情的源头,却是我们今日所书写的“爬虫”。


我们会通过一个网站:人人都是蜘蛛侠 来学习浏览器的工作原理。(这是我们自己搭建的网站,方便教学和实操)




首先,我们在浏览器的地址栏输入网址(也可以叫URL)。然后,浏览器向服务器传达了我们想访问某个网页的需求,这个过程就叫做【请求】。


紧接着,服务器把你想要的网站数据发送给浏览器,这个过程叫做【响应】。


所以浏览器和服务器之间,先请求,后响应,有这么一层关系。


爬虫的工作原理


爬虫学习大纲



第0关,初识爬虫,你会了解爬虫的工作原理,写出一个简单的爬虫程序,学会爬虫的第0步:获取数据。


icon

第1关,你将会快速入门HTML基础知识,达到读懂和修改HTML文档的水平。有了这些基础,你才能去学习如何解析数据和提取数据。


icon

第2、3、4、5关,我会教你爬虫的第1和第2步:解析数据和提取数据。同时,你还会学到两种不同的发起请求的方式。


icon

在第6关,你将学会存储数据,即把目标数据写入到本地的Excel表格中。到此,你就学会了爬虫完整的四个步骤,掌握了最基本的爬虫技能啦。


icon

第7关,我们一起做一个项目,爬取一个知乎大v的所有文章,并且存到Excel中。以此,我们巩固和复习了0-6关的所有知识。第7关会是一个分水岭,后面关卡的进阶知识都建立在前7关的基础上。


icon

第8关,学会cookies,就可以让浏览器记住你,你们可以更方便地长期保持联系,而不是在一次见面之后就相忘于江湖。


icon

第9关,学习控制浏览器,来应对爬虫中一些更复杂的情况。第10关,你的爬虫会变得更自动化,爬虫程序不但可以定时工作,还可以把爬取结果传递给你。


icon

接下来的4关,你将学会更高效更强大的爬虫方法,让爬虫技能升级。


icon

第15关毕业总结,就到了告别的时刻了。这时你也学成出师,可以用爬虫知识去做自己想做的事情了,让爬虫为你消灭重复劳动,高效获取信息,创造出更多价值。


icon

以上,就是爬虫学习大纲。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

# 引入requests库

import requests


# requests.get是在调用requests库中的get()方法,它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后服务器对请求作出了响应。

# 我们把这个响应返回的结果赋值给变量res

res = requests.get('URL')

1

2

3

4

5

6


现在,我们试着用requests.get()来下载一个小说——《三国演义》:



# 来吧,写代码吧    

import requests

url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md'

response = requests.get(url)

1

2

3

4



import requests 


res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png') 

# 打印变量res的响应状态码,以检查请求是否成功

print(res.status_code)

1

2

3

4

5

icon

第5行代码是在打印res的响应状态码,它可以用来检查我们的requests请求是否得到了成功的响应。我们看到终端结果显示了200,这个数字代表服务器同意了请求,并返回了数据给我们。


icon

除了200,我们还可能收到其他的状态码。下面有一个表格,供你参考不同的状态码代表什么,但不需要记住它们,在遇到问题的时候查询就好。



icon

response.status_code是一个很常用的属性,在我们之后的爬虫代码中也将多次出现。


icon

接着的属性是response.content,它能把Response对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载,看个例子你就懂了。


icon

假如我们想下载这张图片,它的URL是:https://res.pandateacher.com/2018-12-18-10-43-07.png




# 引入requests库

import requests


# 发出请求,并把返回的结果放在变量res中

res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')

# 把Reponse对象的内容以二进制数据的形式返回

pic = res.content

# 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。

# 图片内容需要以二进制wb读写。你在学习open()函数时接触过它。

photo = open('ppt.jpg','wb')

# 获取pic的二进制内容

photo.write(pic) 

# 关闭文件

photo.close()


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

icon

这样,我们的图片就下载成功啦~你也可以在本地运行这个程序。


icon

讲完了response.content,继续看response.text,这个属性可以把Response对象的内容以字符串的形式返回,适用于文字、网页源代码的下载。


icon

举个例子,我们还是来下载小说《三国演义》的第一回。


# 引用requests库

import requests


# 下载《三国演义》第一回,我们得到一个对象,它被命名为res

res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')

# 把Response对象的内容以字符串的形式返回

novel=res.text

# 现在,可以打印小说了,但考虑到整章太长,只输出800字看看就好。在关于列表的知识那里,你学过[:800]的用法。

print(novel[:800])

1

2

3

4

5

6

7

8

9

icon

之后,我们就可以用通过读写文件把小说保存到本地了。这是Python基础语法知识,你应该已经学会了。下面直接给出做法,你也可以在自己的本地电脑上做尝试练习。


# 引入requests库

import requests

#下载《三国演义》第一回,我们得到一个对象,它被命名为res

res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')

# 把Response对象的内容以字符串的形式返回

novel = res.text

# 创建一个名为《三国演义》的txt文档,指针放在文件末尾,追加内容

k = open('《三国演义》.txt','a+')

# 写进文件中 

k.write(novel)

# 关闭文档    

k.close()


1

2

3

4

5

6

7

8

9

10

11

12

13



爬虫伦理

icon

就像是两个人在来来往往的相处中,会考虑对方的感受;在互联网的世界中,我们也要考虑一下服务器对爬虫的感受是怎样的。


icon

我们说过,服务器其实就是一个超级电脑,拥有这个服务器的公司,对爬虫其实也有明确的态度。


icon

通常情况下,服务器不太会在意小爬虫,但是,服务器会拒绝频率很高的大型爬虫和恶意爬虫,因为这会给服务器带来极大的压力或伤害。


icon

不过,服务器在通常情况下,对搜索引擎是欢迎的态度(刚刚讲过,谷歌和百度的核心技术之一就是爬虫)。当然,这是有条件的,通常这些条件会写在robots协议里。


icon

robots协议是互联网爬虫的一项公认的道德规范,它的全称是“网络爬虫排除标准”(robots exclusion protocol),这个协议用来告诉爬虫,哪些页面是可以抓取的,哪些不可以。


icon

我们使用robots协议的场景通常是:看到想获取的内容后,检查一下网站是否允许爬取。因此我们只需要能找到、简单读懂robots协议就足够了。


icon

我们截取了一部分淘宝的robots协议,可以看到淘宝对百度和谷歌这两个爬虫的访问规定,以及对其它爬虫的规定。


icon

有的同学可能就要问了:“域名是什么?域名和URL(网址)有什么关系?”很敏锐哟!


icon

我们前面说过,如果把一个网页类比为一幢房子,URL指示了网页的地址,就像房子在地球上的详细到某某街道某某号的具体地址,那么域名就像房子所在的国家,指示了网站的地址。


icon

如果我们看到一个网页,想爬上面的内容,怎么找到它的URL我们刚刚学过了,如果网页的URL是https://pypi.org/project/requests/,那么,此网站的域名是pypi.org;如果网页的URL是http://cn.python-requests.org/zh_CN/latest/,那么网站的域名是cn.python-requests.org。


icon

我们再来看一个,如果网页的URL是https://www.taobao.com/markets/3c/tbdc?spm=a21bo.2017.201867-main.11.5af911d9VV8EyS,那么网站的域名是www.taobao.com。



单选题

看懂了么?我们来试一次,某网页的网址是https://www.bilibili.com/v/douga/?spm_id_from=333.851.b_7072696d6172794368616e6e656c4d656e75.1,那么网站的域名是?

1

2

3

答对了!


icon

没错,你已经找到了规律!


icon

有个课后思考交给你:域名中会藏着网站的国籍或功能领域等信息,那么.cn,.com,.gov结尾的域名分别代表了什么?

icon

来看一个实例:我们截取了一部分淘宝的robots协议 (


http://www.taobao.com/robots.txt)。在截取的部分,可以看到淘宝对百度和谷歌这两个爬虫的访问规定,以及对其它爬虫的规定。


User-agent:  Baiduspider # 百度爬虫

Allow:  /article # 允许访问 article 

Allow:  /oshtml # 允许访问 oshtml 

Allow:  /ershou # 允许访问 ershou 

Allow: /$ # 允许访问根目录,即淘宝主页

Disallow:  /product/ # 禁止访问product文件夹下面的所有文件,但是product文件夹本身允许被访问

Disallow:  / # 禁止访问除 Allow 规定页面之外的其他所有页面

User-Agent:  Googlebot # 谷歌爬虫

Allow:  /article

Allow:  /oshtml

Allow:  /product # 允许访问product文件夹及product文件夹下面的所有文件

Allow:  /spu

Allow:  /dianpu

Allow:  /oversea

Allow:  /list

Allow:  /ershou

Allow: /$

Disallow:  / # 禁止访问除 Allow 规定页面之外的其他所有页面

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

…… # 文件太长,省略了对其它爬虫的规定,想看全文的话,点击上面的链接

User-Agent: * # 其他爬虫

Disallow: / # 禁止访问所有页面

icon

可以看出robots协议是“分段”的吗?每个段落都含有以下两种字段:一种是User-agent:,另一种是Allow:或Disallow:。


icon

User-agent表示的是爬虫类型,上面的示例代码注释了“百度爬虫”和“谷歌爬虫”,我们自己写的爬虫一般要看User-Agent: *,*指向所有未被明确提及的爬虫。


icon

Allow代表允许被访问,Disallow代表禁止被访问。字段对应的值都含有路径分隔符/,限制了哪些或哪一层目录的内容是允许或者禁止被访问的。可以对比上述百度爬虫Disallow: /product/和谷歌爬虫Allow: /product的注释行理解一下。


练习介绍

要求:

获取文章《HTTP状态响应码》全部内容,并且打印出全文内容。


目的:

练习获取网上的文本文件。

题目要求:获取文章《HTTP状态响应码》全部内容,并且打印出全文内容。


获取数据:


文本URL:

https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/HTTP%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.md


首先调用requests库,使用requests.get(‘URL’)获取文件,返回的是Response对象。


然后需要把Response对象用合适的数据形式返回。


存储数据:


存储文件的三个步骤:打开文件,存储文件,关闭文件。


import requests


destnation_url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/HTTP%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.md'

res = requests.get (destnation_url) 

print(res.status_code) # 查看响应码

article=res.text # 把Response对象的内容以字符串的形式返回

print(article)

1

2

3

4

5

6

7

返回结果如下


# HTTP响应状态码



## 1xx:临时响应

#### 表示临时响应并需要请求者继续执行操作的状态代码。


100   **继续**请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。 

101   **切换协议**请求者已要求服务器切换协议,服务器已确认并准备切换。


---


## 2xx : 成功

#### 表示成功处理了请求的状态代码。


200   **成功**  服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。

201   **已创建**  请求成功并且服务器创建了新的资源。

202   **已接受**  服务器已接受请求,但尚未处理。

203   **非授权信息**  服务器已成功处理了请求,但返回的信息可能来自另一来源。

204   **无内容**  服务器成功处理了请求,但没有返回任何内容。

205   **重置内容**服务器成功处理了请求,但没有返回 任何内容。

206   **部分内容**  服å¡器成功处理了部分 GET 请求。


---


## 3xx : 重定向

#### 表示要完成请求,需要进一步操作。通常,以下状态代码用来重定向。


300   **多种选择**  针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。

301   **永久移动**  请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。

302   **临时移动**  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

303   **查看其他位置**请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。


304   **未修改**自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。

305   **使用代理**请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。

307   **临时重定向**  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。


---


## 4xx:请求错误

### 以下状态代码表示请求可能出错,妨碍了服务器的处理。

 

400   **错误请求**服务器不理解请求的语法。

401   **未授权**请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。

403   **禁止**服务器拒绝请求。

404   **未找到**服务器找不到请求的网页。

405   **方法禁用**禁用请求中指定的方法。

406   **不接受**无法使用请求的内容特性响应请求的网页。

407   **需要代理授权**此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。

408   **请求超时**  服务器等候请求时发生超时。

409   **冲突**  服务器在完成请求时发生冲突。服务器必须在响应中包含有关å²突的信息。

410   **已删除**  如果请求的资源已永久删除,服务器就会返回此响应。

411   **需要有效长度**服务器不接受不含有效内容长度标头字段的请求。

412   **未满足前提条件**服务器未满足请求者在请求中设置的其中一个前提条件。

413   **请求实体过大**服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。

414   **请求的 URI 过长**请求的 URI(通常为网址)过长,服务器无法处理。

415   **不支持的媒体类型**请求的格式不受请求页面的支持。

416   **请求范围不符合要求**如果页面无法提供请求的范围,则服务器会返回此状态代码。

417   **未满足期望值**服务器未满足"期望"请求标头字段的要求。


---


## 5xx:服务器错误

### 以下状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。


500   **服务器内部错误**  服务器遇到错误,无法完成请求。

501   **尚未实施**服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。

502   **错误网关**服务器作为网关或代理,从上游服务器收到无效响应。

503   **服务不可用**服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。

504   **网关超时**  服务器作为网关或代理,但是没有及时从上游服务器收到请求。

505   **HTTP 版本不受支持**服务器不支持请求中所用的 HTTP 协议版本。




1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

练习介绍

要求:

获取下面的图片,并且储存图片。




目的:

练习获取网上的图片文件。


import requests


# 发出请求,并把返回的结果放在变量res中

res = requests.get('https://res.pandateacher.com/2019-01-12-15-29-33.png')

# 把Reponse对象的内容以二进制数据的形式返回

pic=res.content

# 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。

# 图片内容需要以二进制wb读写。你在学习open()函数时接触过它。

photo = open('spider.jpg','wb')

# 获取pic的二进制内容

photo.write(pic) 

# 关闭文件

photo.close()

1

2

3

4

5

6

7

8

9

10

11

12

13

练习介绍

题目要求:


获取下面的音乐,并且储存它,然后请刷新页面,这样你就可以在【文件】内看到它。音乐URL:


https://static.pandateacher.com/Over%20The%20Rainbow.mp3


获取数据

音乐URL:https://static.pandateacher.com/Over%20The%20Rainbow.mp3


首先调用requests库,使用requests.get(‘URL’)获取文件,返回的是Response对象。


然后需要把Response对象用合适的数据形式返回。


存储文件

存储文件的三个步骤:打开文件,存储文件,关闭文件。


import requests


# 发出请求,并把返回的结果放在变量res中

res = requests.get('https://static.pandateacher.com/Over%20The%20Rainbow.mp3')

# 把Reponse对象的内容以二进制数据的形式返回

mp3 = res.content

# 新建了一个文件rainbow.mp3,这里的文件没加路径,它会被保存在程序运行的当前目录下。

# 音频内容需要以二进制wb读写。你在学习open()函数时接触过它。

music = open('rainbow.mp3','wb')

# 写入mp3的二进制内容

music.write(mp3) 

# 关闭文件

music.close()

————————————————

版权声明:本文为CSDN博主「yk 坤帝」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_45803923/article/details/116133325


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐