Python 爬虫的原理


Posted in Python onJuly 30, 2020

爬虫就是请求网站并提取数据的自动化程序。其中请求,提取,自动化是爬虫的关键!下面我们分析爬虫的基本流程

爬虫的基本流程

发起请求

通过HTTP库向目标站点发起请求,也就是发送一个Request,请求可以包含额外的header等信息,等待服务器响应

获取响应内容

如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能是HTML,Json字符串,二进制数据(图片或者视频)等类型

解析内容

得到的内容可能是HTML,可以用正则表达式,页面解析库进行解析,可能是Json,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理

保存数据

保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件

什么是Request,Response

浏览器发送消息给网址所在的服务器,这个过程就叫做HTPP Request

服务器收到浏览器发送的消息后,能够根据浏览器发送消息的内容,做相应的处理,然后把消息回传给浏览器,这个过程就是HTTP Response

浏览器收到服务器的Response信息后,会对信息进行相应的处理,然后展示

Request中包含什么?
请求方式

主要有:GET/POST两种类型常用,另外还有HEAD/PUT/DELETE/OPTIONS
GET和POST的区别就是:请求的数据GET是在url中,POST则是存放在头部

GET:向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问

POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。

HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

PUT:向指定资源位置上传其最新内容。

OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

DELETE:请求服务器删除Request-URI所标识的资源。

请求URL

URL,即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

URL的格式由三个部分组成:

  • 第一部分是协议(或称为服务方式)。
  • 第二部分是存有该资源的主机IP地址(有时也包括端口号)。
  • 第三部分是主机资源的具体地址,如目录和文件名等。

爬虫爬取数据时必须要有一个目标的URL才可以获取数据,因此,它是爬虫获取数据的基本依据。

请求头

包含请求时的头部信息,如User-Agent,Host,Cookies等信息,下图是请求请求百度时,所有的请求头部信息参数

Python 爬虫的原理

请求体

请求是携带的数据,如提交表单数据时候的表单数据(POST)

Response中包含了什么

所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

响应状态

有多种响应状态,如:200代表成功,301跳转,404找不到页面,502服务器错误

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误 常见代码: 200 OK 请求成功 400 Bad Request 客户端请求有语法错误,不能被服务器所理解 401 Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden 服务器收到请求,但是拒绝提供服务 404 Not Found 请求资源不存在,eg:输入了错误的URL 500 Internal Server Error 服务器发生不可预期的错误 503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常 301 目标永久性转移 302 目标暂时性转移

响应头

如内容类型,类型的长度,服务器信息,设置Cookie,如下图

Python 爬虫的原理

响应体

最主要的部分,包含请求资源的内容,如网页HTMl,图片,二进制数据等

能爬取什么样的数据

网页文本:如HTML文档,Json格式化文本等
图片:获取到的是二进制文件,保存为图片格式
视频:同样是二进制文件
其他:只要请求到的,都可以获取

如何解析数据

  1. 直接处理
  2. Json解析
  3. 正则表达式处理
  4. BeautifulSoup解析处理
  5. PyQuery解析处理
  6. XPath解析处理

关于抓取的页面数据和浏览器里看到的不一样的问题

出现这种情况是因为,很多网站中的数据都是通过js,ajax动态加载的,所以直接通过get请求获取的页面和浏览器显示的不同。

如何解决js渲染的问题?

  • 分析ajax
  • Selenium/webdriver
  • Splash
  • PyV8,Ghost.py

怎样保存数据

文本:纯文本,Json,Xml等

关系型数据库:如mysql,oracle,sql server等结构化数据库

非关系型数据库:MongoDB,Redis等key-value形式存储

以上就是Python 爬虫的原理的详细内容,更多关于Python爬虫的原理的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现对比不同字体中的同一字符的显示效果
Apr 23 Python
python实现微信远程控制电脑
Feb 22 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
使用python将大量数据导出到Excel中的小技巧分享
Jun 14 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
处理python中多线程与多进程中的数据共享问题
Jul 28 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
Jul 03 Python
Selenium之模拟登录铁路12306的示例代码
Jul 31 Python
Python Numpy之linspace用法说明
Apr 17 Python
Python爬虫与反爬虫大战
Jul 30 #Python
Python如何将装饰器定义为类
Jul 30 #Python
python实现mask矩阵示例(根据列表所给元素)
Jul 30 #Python
Python3爬虫发送请求的知识点实例
Jul 30 #Python
详解Python 最短匹配模式
Jul 29 #Python
Python如何给你的程序做性能测试
Jul 29 #Python
Python3爬虫中关于中文分词的详解
Jul 29 #Python
You might like
PHP写杨辉三角实例代码
2011/07/17 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
php将金额数字转化为中文大写
2015/07/09 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
2017/08/18 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
loading动画特效小结
2017/01/22 Javascript
js实现网页定位导航功能
2017/03/07 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
一文了解Vue中的nextTick
2019/05/06 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
[54:25]Ti4 循环赛第三日LGD vs MOUZ
2014/07/12 DOTA
python数据结构之链表详解
2017/09/12 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
浅谈pycharm下找不到sqlalchemy的问题
2018/12/03 Python
python读取几个G的csv文件方法
2019/01/07 Python
正确理解Python中if __name__ == '__main__'
2019/01/24 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
十八届三中全会报告学习材料
2014/02/17 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
公司总经理任命书
2014/06/05 职场文书
安全承诺书
2015/01/19 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书
nginx rewrite功能使用场景分析
2022/05/30 Servers
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
2022/06/14 MySQL