网络爬虫之Ajax动态数据采集

news2025/1/19 3:09:55

动态数据采集

规则

        有时候我们在用 requests 抓取页面的时候,得到的结果可能和在浏览器中看到的不一样,在浏览器中可以看到正常显示的页面教据,但是使用 requests 得到的结果并没有,这是因为requests 获取的都是原始的 HTML 文档,而浏览器中的页面则是经过 JavaScript 处理数据后生成的结果,这些数据的来源有多种,可能是通过 Ajax 加载的,可能是包含在 HTML 文档中的,也可能是经过 avaScript 和特定算法计算后生成的。
对于第一种情况,数据加载是一种异步加载方式,原始的页面最初不会包含某些数据,原始页面加载完后,会再向服务器请求某个接口获取数据,然后数据才被处理从而呈现到网页上,这其实就是发送了一个 Ajax 请求。
        照 Web 发展的趋势来看,这种形式的页面越来越多。网页的原始 HTML 文档不会包含任何数据,数据都是过 Ajax 统一加载后再呈现出来的,这样在 We 开发上可以做到前后端分离,而且降低服务器直接渲染页面带来的压力。
        所以如果遇到这样的页面,直接利用 requests 等库来抓取原始页面,是无法获取到有效数据的,这时需要分析网页后台向接口发送的Ajax 请求,如果可以用 requests 来模拟 Aiax 请求,那么就可以成功抓取了所以,本章我们的主要目的是了解什么是 Ajax 以及如何去分析和抓取 Ajax 请求。

什么是Ajax

        Ajax,全称为 Asynchronous JavaScript and XML,即异步的avaScript 和 XML,它不是-门编程语言,而是利用JavaScript在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。
        对于传统的网页,如果想更新其内容,那么必须要刷新整个页面,但有了 Ajax,便可以在页面不被全部刷新的情况下更新其内容。在这个过程中,页面实际上是在后台与服务器进行了数据交互,获取到数据之后,再利用JavaScript 改变网页,这样网页内容就会更新了。

手写Ajax接口

环境搭建

pip install flask

一个简单请求过程

通俗地说,路由(Routing)就像是一种地图,告诉服务器当用户访问一个特定的 URL 地址时该如何响应。在 Web 开发中,路由是将浏览器中的 URL 映射到后端应用程序中的一种功能或代码块的机制。

API 是“应用编程接口”(Application Programming Interface)的缩写。它是一套预定义的规则和协议,用于构建和集成软件应用程序。简单来说,API 是一种使得不同软件组件之间可以相互沟通的方式。

Web API:通常指的是通过HTTP协议为Web服务器和客户端或者两个在线服务之间提供数据交换的接口。例如,天气服务的API可以允许开发者获取天气预报数据。

在Web开发中,视图通常指的是用户请求特定URL时服务器返回的页面。例如,在一个Web应用中,服务器可能会根据用户请求的不同路径(比如/home/products)来提供不同的HTML内容。在Web框架中,视图还可以是模板,模板中的数据会由服务器动态填充,然后渲染成最终的HTML发送给客户端。

在Web开发领域,模板特指的是用于动态生成HTML页面的预设文件。这些模板文件包含了静态的HTML标记,以及用于插入动态内容的特殊模板标签或占位符。当服务器接收到一个请求时,它会结合模板和相关的数据来生成最终的HTML页面,然后发送给客户端。

例如,在Python的Flask框架中,模板可能会使用Jinja2模板引擎编写:

<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>Hello, {{ name }}!</h1>
</body>
</html>

在上面的例子中,{{ title }}{{ name }} 是模板变量,它们在渲染过程中会被实际的值所替换。

编写网络爬虫爬取蛋卷基金信息并存储

import requests
import pymysql

# 创建数据库连接
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306)
cursor = db.cursor()
cursor.execute('use spiders')
def get_data():
    url = 'https://danjuanfunds.com/djapi/fund/growth/011102?day=1m'
    headers = {
        'User-Agent':'111222333444'
    }
    resp = requests.get(url, headers=headers).json()
    data = resp.get('data')['fund_nav_growth']
    for item in data:
        date = item.get('date')  # 如果没有就返回 None
        value = item.get('value')
        than_value = item.get('than_value')
        print('日期:', date, '\n', '本产品:', value, '沪深:', than_value)
        # 保存数据到数据库
        save_data(date, value, than_value)

def save_data(date, value, than_value):
    sql = 'INSERT INTO funds(date, value, than_value) VALUES(%s, %s, %s)'
    cursor.execute(sql, (date, value, than_value))
    db.commit()  # 提交事务

# 获取并保存数据
get_data()

# 关闭光标和数据库连接
cursor.close()
db.close()

编写网络爬虫爬取虎牙信息并存储

import requests,pymysql

def conn_mysql():
    db = pymysql.connect(host='localhost',user='root',password='123456',database='spiders')
    cursor = db.cursor()
    return cursor,db
def get_date(url):
    resp = requests.get(url).json()
    dates = []
    try:
        date = resp.get('vList')
        for item in date:
            indurce = item.get('sIntroduction')
            author = item.get('sNick')
            home_numb = item.get('sGameHostName')
            # print('主播名:',author,'简介:',indurce,'房间号:',home_numb)
            dates.append([author,indurce,home_numb])
        save_date(dates)
    except Exception as e:
        print(e)
def save_date(data):
    cursor, db = conn_mysql()
    cursor.execute('use spiders')
    sql = 'insert into huya(author,indurce,home_numb) values(%s,%s,%s)'
    for d in data:
        print(d)
        try:
          cursor.execute(sql,(d[0],d[1],d[2]))
          db.commit()
        except Exception as e:
            print(e)
            db.rollback()
urls = []
for i in range(1,127):
    url = 'https://live.huya.com/liveHttpUI/getLiveList?iGid=0&iPageNo={}&iPageSize=120'.format(i)
    if url not in urls:
        urls.append(url)
for url in urls:
    print(i)
    get_date(url)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1331106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小白攻略】php 小数转为百分比,保留两位小数的函数

php 小数转为百分比 首先&#xff0c;最简单直观的方法是利用PHP内置的number_format函数。该函数可以对一个数字进行格式化&#xff0c;并可以设置小数点后的精度。通过将小数乘以100&#xff0c;再用number_format函数将结果格式化为百分比形式&#xff0c;即可达到将小数转为…

uniapp怎么动态渲染导航栏的title?

直接在接口请求里面写入以下&#xff1a; 自己要什么参数就写什么参数 本人仅供参考&#xff1a; this.name res.data.data[i].name; console.log(名字, res.data.data[i].name); uni.setNavigationBarTitle({title: this.name}) 效果&#xff1a;

图论 | 网络流的基本概念

文章目录 流网路残留网络增广路径割最大流最小割定理最大流Edmonds-Karp 算法算法步骤程序代码时间复杂度 流网路 流网络&#xff1a; G ( V , E ) G (V, E) G(V,E) 有向图&#xff0c;不考虑反向边s&#xff1a;源点t&#xff1a;汇点 c ( u , v ) c(u, v) c(u,v)&#xff…

CSS:浮动

CSS&#xff1a;浮动 浮动效果浮动方式 float浮动特性标准流脱标脱标的影响脱标的影响范围 清除浮动清除浮动原理 clear基于clear的清除浮动方式额外标签法:afert伪元素法双伪元素法 清除浮动原理 BFCBFC定义BFC布局规则创建一个BFC基于BFC的清除浮动方式父级添加overflow法 浮…

物理模拟重力 斜抛运动计算 抛物线计算

物理模拟重力 斜抛运动计算 抛物线计算 一、介绍二、原理三、实现如下PhysicsUtil.cs 工具类Missile.cs 四、资源分享 一、介绍 模拟Unity原始重力系统进行重写&#xff0c;可是实现发射到指定目标位置并能继续当前力进行自身的弹力与摩擦继续运动 二、原理 将Unity原始不受控…

鸿蒙开发4.0-ArkTS与H5的交互

ArkTS侧与H5的交互 首先在开发H5页面&#xff08;输入框和金额选择部分&#xff09;前需要实现JSBridge桥接打通两侧的交互。开发者可以在ArkTS侧定义一个JSBridge类&#xff0c;在类中封装call方法以及initJsBridge方法。 准备异步执行脚本&#xff0c;在脚本中声明一个JSBri…

工具系列:PyCaret介绍_Fugue 集成_Spark、Dask分布式训练

工具系列&#xff1a;PyCaret介绍_Fugue 集成_Spark、Dask分布式训练 Fugue 是一个低代码的统一接口&#xff0c;用于不同的计算框架&#xff0c;如 Spark、Dask。PyCaret 使用 Fugue 来支持分布式计算场景。 目录 1、分布式计算示例&#xff1a; (1)分类 (2)回归 (3)时间…

7.5组合总和②(LC40-M)

算法&#xff1a; 相比于上一题&#xff0c;数组candidates有重复元素&#xff0c;而要求不能有重复的组合&#xff0c;所以相对于39.组合总和 (opens new window)难度提升了不少。 如何去重&#xff1f; 先把candidates排序&#xff0c;让重复的元素都在一起 单层递归时&a…

MATLAB - 读取双摆杆上的 IMU 数据

系列文章目录 前言 本示例展示了如何从安装在双摆杆上的两个 IMU 传感器生成惯性测量单元 (IMU) 读数。双摆使用 Simscape Multibody™ 进行建模。有关使用 Simscape Multibody™ 构建简易摆的分步示例&#xff0c;请参阅简易摆建模&#xff08;Simscape Multibody&#xff09…

深度学习(七):bert理解之输入形式

传统的预训练方法存在一些问题&#xff0c;如单向语言模型的局限性和无法处理双向上下文的限制。为了解决这些问题&#xff0c;一种新的预训练方法随即被提出&#xff0c;即BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;。通过在大规模…

python通过JS逆向采集艺恩电影数据, 并制作可视化

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 环境使用: 版 本&#xff1a; python 3.10 编辑器&#xff1a;pycharm 2022.3.2 nodejs 模块使用: requests -> pip install requests execjs -> pip install…

python实现bp神经网络对csv文件进行数据预测

参考资源&#xff1a; sklearn库 bp神经网络[从原理到代码一篇搞定]&#xff08;2&#xff09;_sklearn 神经网络-CSDN博客 十分钟上手sklearn&#xff1a;安装&#xff0c;获取数据&#xff0c;数据预处理 - 知乎 (zhihu.com) 一个实例讲解如何使用BP神经网络(附代码) - 知…

基于STM32单片机智能手环老人防跌倒报警系统GSM短信上报毕业设计7

STM32单片机老人防跌倒报警系统GSM短信上报加速度7 演示视频&#xff08;复制到浏览器打开&#xff09;&#xff1a; 基于STM32单片机的智能手环老人防跌倒报警系统设计GSM短信上报ADXL345重力加速度检测设计DIY开发板套件7 修改接收短信手机号码视频&#xff1a; ★★★如何修…

Pycharm解释器的配置: System Intgerpreter 、Pipenv Environment、Virtualenv Environment

文章目录 前提1. 环境准备2. 了解虚拟环境 一、进入Interpreter设置页二、添加Interpreter1. 方式一2. 方式二 三、 System Interpreter四、 Pipenv Environment前提条件&#xff1a;详细步骤1&#xff09; 选择pipenv2&#xff09; 设置Base Interpreter3&#xff09; 设置Pip…

必学的maven的起步

Maven的简介 maven是什么 Maven的本质是一个项目管理工具将项目开发和管理过程抽象成一个项目对象模型&#xff08;POM&#xff09;POM&#xff1a;项目对象模型 Maven的作用&#xff1a; 项目构建&#xff1a;提供标准的、跨平台的自动化项目构建方式依赖管理&#xff1a;方…

mingw下编译opencv4.5.2

初衷&#xff1a; 加载之前的模型没问题&#xff0c;但最近加载另一个模型时出现报错&#xff1a; OpenCV: terminate handler is called! The last OpenCV error is: OpenCV(4.1.0) Error: Assertion failed (nodesMapIt ! nodesMap.end()) in sortByExecutionOrder, file G…

R软件包ConsensusCluster进行共识聚类(Consensus Clustering)

从下面论文看到这个方法&#xff1a; Wang, Xin, et al. "Deep learning using bulk RNA-seq data expands cell landscape identification in tumor microenvironment." Oncoimmunology 11.1 (2022): 2043662. 这篇论文基于 AI 方法对 bulk RNA-seq 数据识别肿瘤微环…

qt项目-《图像标注软件》源码阅读笔记-Shape类绘图及其子类

目录 1. Shape 概览 2. Shape 基类 2.1 字段 2.2 方法 2.3 嵌套类型 3. Shape2D 2d形状纯虚基类 3.1 字段 3.2 方法 4. Shape3D 3d形状纯虚基类 5. Shape2D子类 5.1 Rectangle 矩形类 1. Shape 概览 功能&#xff1a;Shape类及其子类负责形状的绘制及形状的存储。…

【数据结构入门精讲 | 第十三篇】考研408、公司面试树专项练习(二)

在上一篇中我们进行了树的判断题、选择题、填空题专项练习&#xff0c;在这一篇中我们将进行编程题的相关练习。 目录 编程题R7-1 目录树R7-1 是否同一棵二叉搜索树R7-2 二叉搜索树的结构R7-3 平衡二叉树的根R7-1 完全二叉搜索树R7-1 修理牧场R7-2 嘴强王者R7-3 房屋分拆R7-4 动…

Qt/QML编程学习之心得:在QML中调用fileDialog(十六)

Qt中有一些内置的对话框dialog,比如 在QWidget工程中使用比较容易,比如 #include <QFileDialog>fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), "/home/jana", tr("Image Files (*.png *.jpg *.bmp)")); 那么在QM…