初识爬虫——爬虫与HTML介绍

目录

一. 爬虫是什么?

二. Python爬虫的优势

三. 体验爬虫

四. 爬虫伦理

五. Python爬虫需要掌握什么  

六. HTML基础

七. HTTP协议之请求 

总结

爬虫系列文章目录


一. 爬虫是什么?

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

1.1 浏览器工作原理

        浏览器工作原理总的来说,可以用下面这张图来表示给大家看:

初识爬虫——爬虫与HTML介绍_第1张图片

  • 解析数据:当服务器把数据响应给浏览器之后,浏览器并不会直接把数据丢给我们。因 为这些数据是用计算机的语言写的,浏览器还要把这些数据翻译成我们能看得懂的内容;
  • 提取数据:我们就可以在拿到的数据中,挑选出对我们有用的数据;
  • 存储数据:将挑选出来的有⽤数据保存在某一文件/数据库中。

 1.2 爬虫工作原理

        爬虫工作原理也可如下图所示给大家表现出来:

初识爬虫——爬虫与HTML介绍_第2张图片

  • 获取数据:爬⾍程序会根据我们提供的⽹址,向服务器发起请求,然后返回数据;
  • 解析数据:爬⾍程序会把服务器返回的数据解析成我们能读懂的格式;
  • 提取数据:爬⾍程序再从中提取出我们需要的数据;
  • 储存数据:爬⾍程序把这些有用的数据保存起来,便于你日后的使用和分析。

二. Python爬虫的优势

  • PHP: 虽然是世界上最好的语言,但是天生不是干爬虫的命,php对多线程,异步支持不足,发不足,爬虫是工具性程序,对速度和效率要求较高;
  • Java: 生态圈完善,PYthon最大的对手,但是java本身很笨重,代码量大,重构成本比较 ,任何修改都会导致大量的代码的变动.最要命的是爬虫需要经常修改部分代码;
  • C/C++: 运行效率和性能几乎最强,但是学习成本非常高,代码成型较慢,能用C/C++写爬虫, 说明能力很强,但不是最正确的选择;
  • Python: 语法优美,代码简洁,开发效率高,三方模块多,调用其他接口也方便, 有强大的爬 Scrapy,以及成熟高效的scrapyredis分布策略

三. 体验爬虫

3.1 requests.get() 

1)安装requests 库:

Mac电脑⾥打开终端软件(terminal),输⼊ pip3 install requests ,然后点击 enter;
Windows电脑⾥叫命令提示符(cmd),输⼊ pip install requests

2)requests 库作用:

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

3)requests 库使用:

 res = requests.get('URL')

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

初识爬虫——爬虫与HTML介绍_第3张图片

 3.2 Response对象的常用属性

        Response对象的常用属性有以下几种:

初识爬虫——爬虫与HTML介绍_第4张图片

 1)response.status_code

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

        常见的响应状态码如下:

初识爬虫——爬虫与HTML介绍_第5张图片

 2)response.content:

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

3)response.text

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

4)response.encoding:

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

3.3 汇总图解 

初识爬虫——爬虫与HTML介绍_第6张图片


四. 爬虫伦理

4.1 Robots 协议

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

 4.2 协议查看

  • 在网站的域名后加上/robots.txt就可以了。如淘宝的robots协议( http://www.taobao.com/robots.txt);
  • 协议里最常出现的英文是Allow和Disallow,Allow代表可以被访问,Disallow代表禁止被访问。

五. Python爬虫需要掌握什么  

  • Python基础语法
  • HTML基础
  • 如何抓取页面: HTTP请求处理,urllib处理后的请求可以模拟浏览器发送请求,获取服务器响应文件 解析服务器响应的内容
  • 各种库:re,xpath,BeautifulSoup4,jsonpath,pyquery 目的是使用某种描述性语法来提取匹配规则的数据;
  • 如何采取动态html,验证码处理通用的动态页面采集, Selenium+PhantomJs(无界面浏览器),模拟真实浏览器加载js,ajax等非静态页面数据;
  • Scrapy框架 国内常见的框架Scrapy,Pyspider 高定制性高性能(异步网络框架twisted),所以数据下载速度非常快,提供了数据存储,据下载,提取规则等组件(异步网络框架twisted类似tornado)DjangoFlask相比的优势是高并发,性能较强 的服务器框架;

六. HTML基础

        HTML(Hyper Text Markup Language)是用来描述网页的⼀种语言,也叫超文本标记语言。

6.1 查看网页的 HTML 代码

  • 显示网页源代码
在网页任意地⽅点击⿏标右键,然后点击“显示网页源代码”。(Windows系统的电
脑还可以使⽤快捷键ctrl+u来查看网页源代码)
  • 检查
windows:在网页的空白处点击右键,然后选择“检查”(快捷方式是ctrl+shift+i);
mac: 在网页的空白处点击右键,然后选择“检查”(快捷键 command + option + I(大写 I ))

6.2 HTML 的组成  

1)标签和元素

  • 标签:夹在尖括号<>中间的字母,标签通常是成对出现的:前⾯的是【开始标签】,比如;后⾯的是【结束标签】,如;
  • 元素:开始标签+结束标签+中间的所有内容组成。

        以下是常见的HTML元素:

初识爬虫——爬虫与HTML介绍_第7张图片

注意:HTML标签是可以嵌套标签的,而且可以多层嵌套;这就像是在电脑中,⼀个硬盘可以包含数个文件夹,文件夹中还可以嵌套文件夹。

6.3 网页头和网页体

        HTML文档的最外层标签⼀定是,里面嵌套着元素与元素。

元素代表了【网页头】,元素代表了【网页体】,这是最基本的网页结构。
  • 【网页头】的内容不会被直接呈现在浏览器里的网页正文中;
  • 【网页体】的内容是会直接显示在网页正文中的。

         HTML的基本结构如下所示:

初识爬虫——爬虫与HTML介绍_第8张图片

 6.4 属性

注意:HTML的属性和Python中的属性不是⼀个东西

        常见HTML的属性及用法:

初识爬虫——爬虫与HTML介绍_第9张图片


七. HTTP协议之请求 

        我们向一个网址(也就是URL,之后采取的都会是URL的称呼)发起请求,这个URL所在的服务器会相应地返回我们一个结果,这个结果就是响应。
        看起来似乎是一个很简单的流程,其实不然。无论是请求还是响应,都会隐形地携带很多和请求、响应有关的内容,接下来,我们就来看看都会携带哪些参数(参数有很多,我们挑下重要的讲讲)

7.1 请求报文重要片段信息:

我们来看看请求报文中我们需要了解哪些与爬虫有关的信息:

初识爬虫——爬虫与HTML介绍_第10张图片

1)method:

这个字段是用来指明请求的方法是哪一种的,常用的请求方法有GET、POST,这两种请求有什么区别、以及分别适用什么场景,后面我们会详细讲解。如果method是GET的时候,在使用requests的时候,就只能用requests.get(),比如这样:

import requests
response = requests.get('https://www.zhihu.com')

如果method是POST的时候,在使用requests的时候,就只能用requests.post(),而post是请求是需要传递数据的,这个之后会详细介绍。比如这样:

import requests
data = {
'username': 'kuuud',
'password': 'kuuud'
 }
response = requests.post('https://www.wzhihu.com', data=data)

 2)Accept:

这个字段是用来通知服务器,用户代理(浏览器等客户端)能够处理的媒体类型及媒体类型的相对优先级。可以使用type/subtype这种形式,一次可指定多种媒体类型。常用的媒体类型有以下几类:

文本文件:text/html,text/plain,text/css,application/xhtml+xml, application/xml...

图片文件:image/jpeg,image/gif,image/png...

视频文件:video/mpeg,vedio/quicktime...

应用程序使用的二进制文件:application/octer-stream,application/zip...
附:比如说浏览器不支持图片PNG的显示,那么accept就不指定image/png,因为浏览器处
理不了。(这个字段需要了解,尤其是如果后期想从事网站开发的童鞋)
3)Cookie: ​​​​​​​
  • 客户端发起请求时,服务器会返回一个键值对形式的数据给浏览器,下一次浏览器再访问这个域名下的网页时,就需要携带这些键值对 数据在 Cookie中,用来记录用户在当前域名下的历史行为的。
  • ​​​​​​​提到Cookie就不得不提,HTTP本身是一种无状态的协议,它是不会保存每次请求和响应的
  • 相关信息的,就比如我们登录淘宝,如果没有Cookie技术,那么我们每进入一个淘宝的页面都需要重新登录一次,这样是不是会特别麻烦?
  • 就是因为这个原因,才引入了Cookie技术,使得用户在一个域名下的历史行为能够得以保 存,只要登录一次淘宝就可以了,不需要频繁地登录,而且能够看到历史记录。
  • 这个字段很重要,在爬虫中经常会用到,因为有的数据只有携带了Cookie才能够爬取到,所以经常会根据前次访问得到 cookie数据,然后添加到下一次的访问请求头中
import requests
url = 'https://www.baidu.com'
headers = {
     'cookie': 'PSTM=1496322685; BIDUPSID=BC36002F7DA142E6674AE290CD5A38DB; _ _cfduid=ddf4836dd1f1ac99eeea8ef0f140493301522406372; BAIDUID=5FA7A2B4FDDA3C ECC6BE9B74FDCD00B8:FG=1; sugstore=1; BDUSS=1hvT3VoQmc5TDl5bFE1c2NjcGpOenByc nJTOEstZ0ZKcGs5UnB1dzVyU1hpYXRiQVFBQUFBJCQAAAAAAAAAAAEAAABCcYSYAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJf 8g1uX~INbR; BD_UPN=12314753; MCITY=‐340%3A; delPer=0; BD_CK_SAM=1; PSINO=7; BDRCVFR[Dq4jqEr7erC]=mk3SLVN4HKm; H_PS_PSSID=; BDORZ=FFFB88E999055A3F8A630C 64834BD6D0; H_PS_645EC=216feJgh%2BnAm%2BJD6G3sw10RBbYN1O%2FeCJqUhgtRyZ3OuJO 0EOqbXUwL8Kgf8zhqXH7RWxBnn; BDSVRTM=0; ispeed_lsm=6'
     }
response = requests.get(url, headers=headers)

 4)Refer:

这个字段用来记录浏览器上次访问的URL,有的网站会通过请求中有没有携带这个参数来判断是不是爬虫,从而确定是否限制访问。所以有时候也需要在headers中添加上这个参数。

5)User-Agent: 

是用来标识请求的浏览器身份的,大部分网站都会通过请求中有没有携带这个参数来判断是不是爬虫,从而确定是否限制访问。所以有时候也需要在headers中添加上这个参数;

代码如下:

import requests
url = 'https://www.baidu.com'
headers = {
    'user‐agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
    }
response = requests.get(url, headers=headers)

但当我们要爬取的数据量比较大的时候,仅仅用一个user-agent是不够的,因为服务器又不傻,你一个浏览器不停地在访问我的URL,而且频率那么快,肯定不是人在后面操作,然后就会限制你的访问了,所以我们经常会用一个user-agent列表,来回地切换。这样服务器就会以为是多个浏览器(也就是多个用户)在访问URL,会判断这是正常的;

代码如下:

import requests,random
url = 'https://www.baidu.com'
agent_list = [
    'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (K HTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
    'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en‐us) AppleWebKit/53 4.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
    'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'
    ]
# 这是一个User‐Agent列表,在使用的时候随机从中选取一个作为请求头的参数传递进去
headers = {
    'user‐agent': random.choice(agent_list)
    }
response = requests.get(url, headers=headers)

7.2 HTTP请求报文

组成:
请求行 + 请求头 + 请求体
请求行:请求方法,请求地址(URL),HTTp版本
请求头(报文头):以key-value方式存储,存储是客户端信息
请求体(报文体):需要传递的一些参数信息
7.3 HTTP响应报文
组成:
响应行 + 响应头 + 响应体
响应行:HTTp版本,状态码
响应头(报文头):服务端信息
响应体(报文体):需要传递的数据
7.4 状态码:
2开头
2xx:成功类
3xx:重定向
4xx:客户端错误
5xx:服务端错误

总结

        程序员写代码并不是从0开始的,我们也是需要借助多个模板拼接,使得代码能够实现我们的想法,而且也并非默写出来,毕竟学习编程是开卷学习,开卷使用,加油,希望你我一同走进爬虫的世界~~

        欢迎大家留言一起讨论问题~~~


爬虫系列文章目录

一:初识爬虫——爬虫与HTML介绍

二:初始爬虫——BeautifulSoup分析及实践​​​​​​​

扩展知识一:爬虫scrapy框架不理解?通俗⼀点告诉你

扩展知识二:爬虫多协程该咋说呢?其实不难

你可能感兴趣的:(爬虫,python,python,学习,经验分享,爬虫)