爬虫的原理(基本流程,Request与Response,怎么解决JavaScript渲染的问题,怎么保存数据)

2023-10-27

什么是爬虫?
爬虫就是请求网站并提取数据的自动化程序。

爬虫基本流程

1.发起请求:通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等配置信息,等待服务器响应。
2.获取响应内容:如果服务器能正常响应,会得到一个Response,其中的内容便是所要获取的页面内容,类型可能有HTML,Json字符串,二进制数据(如图片视频)等类型。
3.解析内容:得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是Json,可以直接转为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理。
4.保存数据:保存形式多样,可以存为文本,也可以保存至数据库,或者保存特定格式的文件。

Request与Response

(1)浏览器发送消息给该网址所在的服务器,这个过程就叫做HTTP Request。
(2)服务器收到浏览器发送的消息后,能够根据浏览器发送消息的内容,做相应处理,然后把消息回传给浏览器。这个过程叫做HTTP Response。
(3)浏览器收到服务器的Response信息后,会对信息进行相应处理,然后展示。

Request

1.请求方式:主要有GET、POST两种类型,另外还有HEAD、PUT、DELETE、OPTIONS等。
2.请求URL:URL全称统一资源定位符,如一个网页文档、一张图片、一个视频等都可以用URL唯一来确定。
3.请求头:包含请求时的头部信息,如User-Agent、Host、Cookies等信息。
4.请求体:请求时额外携带的数据,如表单提交时的表单数据。

Response

1.相应状态:有多种响应状态,如200代表成功、301跳转、404找不到页面、502服务器错误。
2.响应头:如内容类型、内容长度、服务器信息、设置Cookie等等。
3.响应体:最主要的部分,包含了请求资源的内容,如网页HTML、图片二进制数据等。

简单试验

在python交互模式下执行以下命令:
import requests
response=requests.get(‘http://www.baidu.com’)
print(response.text)
在这里插入图片描述
这些命令将一次 requests后得到的response的内容通过库里的get方法获取,并打印出来。
在这里插入图片描述
还可以看看response的响应头长啥样:
print(response.headers)
在这里插入图片描述
可以看到这是一个字典形式的结构。
再看看状态码:
print(response.status_code)
在这里插入图片描述
以上就是简单用代码感受以下Request与Response的过程。

能抓怎样的数据

1.网页文本:如HTML文档、Json格式文本等。
2.图片:获取到的是二进制文件,保存为图片格式。
3.视频:同为二进制文件,保存为视频格式即可。
4.其他:只要是能请求到的,都能获取。

怎样来解析

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

为什么我们抓到的和浏览器审查看到的不一样?

以微博为例,我们可以看一下首页的源代码(右键:检查):
在这里插入图片描述
将代码赋值到文本编辑器中看一下:
在这里插入图片描述
可以看到这里有许多用js配置的形式,和我们直接浏览网站看到的并不一样。
现在我们用命令行试试,在python交互模式下执行以下命令:
import requests
requests.get(‘http://m.weibo.com’)
requests.get(‘http://m.weibo.com’).text
可以看到窗口中打印一堆密集的东西,这和刚才文本编辑器中看到的内容是一样的。
问题的回答就是:网页最终显示的页面源码是经过浏览器解释后的,我们get或者post请求到的源码是服务器直接返回的。二者是不一样的。

怎么解决JavaScript渲染的问题

1.分析Ajax请求

返回的是json格式的字符串,方便我们提取数据

2.用Selenium/WebDriver驱动一个浏览器来模拟加载网页

演示一下,在python交互模式下执行以下命令:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get(‘http://m.weibo.com’)
driver.get(‘http://www.taobao.com’)
print(driver.page_source)
(注意,需要先安装webdriver这个库,以及Chromedriver,详情可以看这篇文章:https://blog.csdn.net/z714405489/article/details/83047772)
系统就会驱动一个浏览器,并且访问我们请求的网址,最后可以将该页面的源代码打印出来,这和我们审查网页源代码时看到的就是一样的了。

3.Splash

可以在github搜索详情。

4.PyV8、Ghost.py等等其他的库

怎样保存数据?

1.文本:纯文本、Json、Xml等。
2.关系型数据库:MySQL、Oracke、SQL Server等具有结构化表结构形式存储。
3.非关系型数据库:如MongoDB、Redis等Key-Value形式存储。
4.二进制文件:如图片、视频、音频等等直接保存成特定格式即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫的原理(基本流程,Request与Response,怎么解决JavaScript渲染的问题,怎么保存数据) 的相关文章

  • Keras model.summary() 结果 - 了解参数数量

    我有一个简单的神经网络模型 用于使用 Keras Theano 后端 从用 python 编写的 28x28px 图像中检测手写数字 model0 Sequential number of epochs to train for nb ep
  • 使用 glGetFloatv 检索 pyglet 中的模型视图矩阵

    我正在使用 pyglet 在 python 中进行 3D 可视化 并且需要检索模型视图和投影矩阵来进行一些选择 我使用以下方式定义我的窗口 from pyglet gl import from pyglet window import wi
  • 如何将人物传奇带到前台?

    我有一系列子图 其中每个子图都有一个图例 我想在每个子图之外与相邻子图重叠 问题在于图例位于其自己的图的 顶部 但位于相邻图的下方 Legend 不将 zorder 作为参数 所以我不知道如何解决这个问题 这是我使用过的代码 import
  • 将文件标记为从 Python 中删除?

    在我的一个脚本中 我需要删除当时可能正在使用的文件 我知道我无法删除正在使用的文件 直到它不再使用为止 但我也知道我可以将该文件标记为由操作系统 Windows XP 删除 我将如何在 Python 中做到这一点 以及另一个不依赖于 pyw
  • 如何将 UPX 与 pyinstaller 一起使用?

    如何将 UPX 与 pyinstaller 一起使用 我正在关注文档 我已经下载了UPX 我的文件如下所示 import csv import selenium import pandas print Hello 然后我运行 pyinsta
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉
  • 如何将嵌套的Python字典转换为简单的命名空间?

    假设我有一个深度为 N 的嵌套字典 如何将每个内部嵌套字典转换为简单的命名空间 example input key0a test key0b key1a key2a keyNx key2b test key1b test example o
  • Django“模型”对象不可迭代

    我有一张表 其中显示了已注册的员工 我想根据他们的数据库生成一个简单的 HTML 页面 其中包括他们的姓名 id 职称等 为此 我将一个 id 传递给视图 以便它可以获取相应用户的详细信息并向我显示 一切正常 直到出现错误对象不可迭代 下面
  • 手动安装开放多语言世界网 (NLTK)

    我正在使用一台只能访问专用网络并且无法从命令行发送指令的计算机 因此 每当我必须安装 Python 包时 我都必须手动安装 我什至不能使用 Pypi 幸运的是 NLTK 允许我手动下载语料库 从here https www nltk org
  • 自定义 Keras 损失函数中的 conv2d

    我正在尝试基于两个图像的拉普拉斯算子在带有 TF 后端的 Keras 中实现自定义损失函数 def blur loss y true y pred weighting of blur loss alpha 1 mae losses mean
  • 如何使直方图列的宽度都相同

    我在操作直方图时遇到了一些麻烦 我有一个包含两列的 df 我将它们绘制为堆叠直方图 我将它们放入特定的垃圾箱中 请参阅下面的代码 但我想在最后制作一个大垃圾箱 4000 10000 但是 默认情况下 大垃圾箱的列宽很大 有没有办法让这个大垃
  • 使用 matplotlib 设置或固定二元分布值

    I ve animated a bivariate gaussian distribution using matplotlib 我已经计算过这个distribution通过调整COV matrix来考虑特定的变量 我可以提供有关此过程的更
  • 如何打印和显示子进程 stdout 和 stderr 输出而不失真?

    也许有人可以帮助我解决这个问题 我在 SO 上看到了许多与此类似的问题 但没有一个问题同时处理标准输出和标准错误 也没有处理像我这样的情况 因此出现了这个新问题 我有一个 python 函数 它打开一个子进程 等待它完成 然后输出返回代码以
  • 尝试将 cuda 与 pytorch 一起使用时出现运行时错误 999

    我为我的 Geforce 2080 ti 安装了 Cuda 10 1 和最新的 Nvidia 驱动程序 我尝试运行一个基本脚本来测试 pytorch 是否正常工作 但出现以下错误 RuntimeError cuda runtime erro
  • pandas-更改重采样时间序列的开始和结束日期

    我有一个时间序列 我将其重新采样到这个数据框中df 我的数据是从6月6日到6月28日 它希望将数据从6月1日延长到6月30日 计数列仅在较长时间内具有 0 值 而我的实际值是从 6 日到 28 日 Out 123 count Timesta
  • CryptoJS 和 Pycrypto 一起工作

    我正在使用 CryptoJS v 2 3 加密 Web 应用程序中的字符串 并且需要在服务器上使用 Python 对其进行解密 因此我使用 PyCrypto 我觉得我错过了一些东西 因为我无法让它工作 这是JS Crypto AES enc
  • 执行许多插入重复键更新错误:未使用所有参数

    所以我一直在尝试使用 python 2 7 15 使用 mysql connector 执行此查询 但由于某种原因 它似乎不起作用并且总是返回错误 并非所有参数都被使用 表更新有一个主键 即 ID 这是我尝试运行此 SQL 的查询 sql
  • 如何使用资源模块来衡量函数的运行时间?

    我想使用Python代码测量函数的CPU运行时间和挂钟运行时间 此处建议资源模块 如何以 Python 代码 不是从终端 的形式分别测量函数的 CPU 运行时间和挂钟运行时间 https stackoverflow com q 192046
  • 将同一 numpy 数组的两个视图组合成单个视图而不复制数组?

    我有一个大型 2d numpy 数组 我想删除它的子集并处理函数剩下的内容 我需要对许多子集执行此操作 因此理想情况下我不想每次都创建数组的副本 该函数不会更改数组中的任何值 mat np load filename mat 1 mat i
  • IOError:在 Linux 上的 ReportLab 中使用 matplotlib PNG 时“解码器 zip 不可用”,适用于 Windows

    我正在使用 ReportLab 打印 matplotlib 生成的图表 我可以在我的 Windows 开发机器上毫无问题地执行此操作 然而 当我部署到 Ubuntu 服务器时 渲染失败并出现所述错误 我假设我缺少一个 Python 模块 但

随机推荐

  • UVA-1354 天平难题 题解答案代码 算法竞赛入门经典第二版

    GitHub jzplp aoapc UVA Answer 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 这道题需要 1 遍历二叉树的每种构成方式 我这里每次把当前所有结点列出 然后遍历选取两个组合构成一个新结点 原来的结点剔除 新结点
  • 17张经典动态图带您看懂电动机运行原理!电机一共有多少种?

    电动机 电动机是一种旋转式电动机器 它将电能转变为机械能 它主要包括一个用以产生磁场的电磁铁绕组或分布的定子绕组和一个旋转电枢或转子 在定子绕组旋转磁场的作用下 其在电枢鼠笼式铝框中有电流通过并受磁场的作用而使其转动 这些机器中有些类型可作
  • php弹窗24小时一次,javascript 24小时弹出一次的代码(利用cookies)_广告代码

    function jb51tuitan if getCookie jb51popped 要执行的代码或一些操作 setCookie jb51popped ok 写入cookies表示已经执行过了 alert ok jb51tuitan fu
  • spring mvc 集成freemarker模板

    主要使用到的jar 文件 spring mvc freemarker jar 第一步 spring mvc 集成 freemarker
  • SQL如何进行帕累托分析?(窗口函数、累计百分比分类)

    帕累托分析法是指定决策的统计方法 包含按降序排序的列和表示累积总百分比的线条 面试题 有一张 学生成绩表 包含3个字段 学号 课程 成绩 问题 找出每门课程A类和B类的学生 判断标准是累计占比 0 60 的记为A类 60 85 记为B类 解
  • GPIO模块功能测试

    目录 1 功能描述 2 端口复用 3 如何操作 4 测试代码分析 4 1GPIO VERIFICATION01 GPIO复位值验证 4 2GPIO VERIFICATION02 GPIO读写验证 4 3GPIO VERIFICATION03
  • WebGL射线拾取模型——八叉树优化

    经过前面2篇WebGL射线拾取模型的文章 相信大家对射线和模型面片相交的原理已经有所了解 那么今天我们再深入探究关于射线拾取的一个问题 那就是遍历场景中的所有与射线相交的模型的优化问题 首先我们来复习一下射线拾取模型的原理 请看下图 我们从
  • ELK 日志系统收集K8s中日志

    容器特性给日志采集带来的困难 K8s弹性伸缩性 导致不能预先确定采集的目标 容器隔离性 容器的文件系统与宿主机是隔离 导致日志采集器读取日志文件受阻 日志按体现方式分类 应用程序日志记录体现方式分为两类 标准输出 输出到控制台 使用kube
  • 人工智能算法 上市公司,人工智能算法公司排名

    人工智能上市公司龙头股票有哪些 一 科大讯飞 002230 属于人工智能稀缺标的 多领域布局苦尽甘来 业绩拐点临近 二 浪潮信息 000977 人工智能基础设施提供商 目前具备业界最全CPU服务器产品线 三 中科曙光 603019 含着金钥
  • 第十二章 内中断

    引言 本书主要讲解硬件中断 12 1 内中断的产生 12 2 中断处理程序 12 3 中断向量表 中断向量表在内存中存放 对于8086PC机 中断向量表指定存放在内存地址0处 从内存0000 0000到0000 03FF的1024个单元中存
  • 微信小程序npm构建

    步骤 一 初始化 npm init y 自动生成生成package json文件 二 project config js配置项 packNpmManually false packNpmRelationList packageJsonPat
  • error: No rule to make target ‘...‘. Stop. 解决方案

    一 error 二 解决方案 第一步 删除 xxx pro 文件中的 RESOURCES xxx qrc 然后 CTRL S 保存文件 第二步 重新添加资源文件 注 文件名不要使用中文 以避免未知的错误 三 环境
  • 类成员函数创建线程

    include
  • iOS--伪后台(安卓与iOS区别)

    1 后台机制方面的区别 提到后台 大家应该会很容易想到安卓的真后台了吧 所谓真后台 就是像PC一样 将应用保留在RAM中 当你使用HOME键退出应用 程序实际上并没有完全退出 而是被系统挂在了后台 比如一些聊天软件 之所以关闭后依然能够收到
  • 注意力机制详述

    学习本部分默认大家对RNN神经网络已经深入理解了 这是基础 同时理解什么是时间序列 尤其RNN的常用展开形式进行画图 这个必须理解了 这篇文章整理有关注意力机制 Attention Mechanism 的知识 主要涉及以下几点内容 1 注意
  • Django 项目使用 Bootstrap 的导入方式

    Django 项目中导入 Bootstrap 是固定的 补充 1 Django 项目的 html 文件中必须先写 meta 再引入其他内容 并且对于导入 JS 的先后顺序有比较严格的要求 补充 2 Django 项目表单中使用POST的方法
  • C++ 对象模型

    C 对象模型 虚函数机制 实现执行器绑定 虚基类机制 实现多继承体系中只有一个共享实体 非静态数据成员放在 object 之中 静态数据成员放在 object 之外 静态和非静态成员函数都放在 object 之外 每个类会产生一堆指向虚函数
  • 表单--form对象

    在Javascript 中 页面上的每一对
  • AAAI 2021

    作者 孙宇冲 单位 中国人民大学 多模态学习旨在使计算机拥有处理不同来源信息的能力 近年来成为了人工智能领域的研究热点 多模态学习将不同模态信息进行融合 学习不同模态信息之间的关联 人类对信息的处理其实也是多模态的 如人可以同时利用视觉和听
  • 爬虫的原理(基本流程,Request与Response,怎么解决JavaScript渲染的问题,怎么保存数据)

    什么是爬虫 爬虫就是请求网站并提取数据的自动化程序 爬虫基本流程 1 发起请求 通过HTTP库向目标站点发起请求 即发送一个Request 请求可以包含额外的headers等配置信息 等待服务器响应 2 获取响应内容 如果服务器能正常响应