【JS逆向课件:第一课:requests基础】

爬虫初始

爬虫相关介绍
  • 什么是爬虫
    • 就是编写程序,模拟浏览器上网,让其去互联网中抓取数据的过程
      • 模拟:
        • 浏览器本身就是一个纯天然的爬虫工具,爬虫相关的模块都是基于浏览器为基础开发出来的。
        • 注意:日后只要是你的爬虫程序没有爬取到你想要的数据,只有一个原因:
          • 就是你的爬虫程序模拟的力度不够!
      • 抓取:
        • 抓取网页数据分两种情况:
          • 将一个页面所有的数据抓取到
          • 将页面中局部的数据抓取到
  • 爬虫在应用场景的分类
    • 通用爬虫:
      • 将一个页面中所有的数据获取。
      • 大部分的搜索引擎中应用比较多。
    • 聚焦爬虫
      • 将页面中局部的指定的数据进行提取/抓取
      • 注意:聚焦爬虫一定是建立在通用爬虫的基础之上实现。
    • 功能爬虫
      • 通过浏览器或者app自动化的操作,实现相关的网页或者app自动化的操作。代替人工在网页或者手机软件中自动执行相关的行为动作。
      • 批量点赞,批量评论,刷单,秒杀…
    • 增量式爬虫
      • 用来监测网站数据更新的情况。以便爬取网站最新更新出来的数据!
    • 分布式爬虫
      • 可以对网站所有的资源使用分布式机群进行分布和联合的数据爬取
  • 爬虫的矛与盾(重点)
    • 反爬机制:对应门户网站,网站可以指定相关的机制阻止爬虫对其网站数据的采集
    • 反反爬策略:对应爬虫程序,爬虫可以制定相关的策略将网站的反爬机制破解,从而爬取到指定的数据
  • 盗亦有道的君子协议robots
    • Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots ExclusionProtocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取.
    • 注意,这个协议的存在更多的是需要网络爬虫去遵守,而起不到防止爬虫的功能。
爬虫合法性探究
  • **爬虫作为一种计算机技术就决定了它的中立性,因此爬虫本身在法律上并不被禁止,但是利用爬虫技术获取数据这一行为是具有违法甚至是犯罪的风险的。**所谓具体问题具体分析,正如水果刀本身在法律上并不被禁止使用,但是用来捅人,就不被法律所容忍了。
  • 或者我们可以这么理解:爬虫是用来批量获得网页上的公开信息的,也就是前端显示的数据信息。因此,既然本身就是公开信息,其实就像浏览器一样,浏览器解析并显示了页面内容,爬虫也是一样,只不过爬虫会批量下载而已,所以是合法的。不合法的情况就是配合爬虫,利用黑客技术攻击网站后台,窃取后台数据(比如用户数据等)。
  • 举个例子:像谷歌这样的搜索引擎爬虫,每隔几天对全网的网页扫一遍,供大家查阅,各个被扫的网站大都很开心。这种就被定义为“善意爬虫”。但是像抢票软件这样的爬虫,对着 12306 每秒钟恨不得撸几万次,铁总并不觉得很开心,这种就被定义为“恶意爬虫”。
  • 爬虫所带来风险主要体现在以下3个方面:
    • 1、违反网站意愿,例如网站采取反爬措施后,强行突破其反爬措施;
    • 2、爬虫干扰了被访问网站的正常运营;
    • 3、爬虫抓取了受到法律保护的特定类型的数据或信息。
  • 那么作为爬虫开发者,如何在使用爬虫时避免进局子的厄运呢?
    • 1、严格遵守网站设置的robots协议;
    • 2、在规避反爬虫措施的同时,需要优化自己的代码,避免干扰被访问网站的正常运行;
    • 3、在使用、传播抓取到的信息时,应审查所抓取的内容,如发现属于用户的个人信息、隐私或者他人的商业秘密的,应及时停止并删除。
  • 总结:
    • 可以说在我们身边的网络上已经密密麻麻爬满了各种网络爬虫,它们善恶不同,各怀心思。而越是每个人切身利益所在的地方,就越是爬满了爬虫。**所以爬虫是趋利的,它们永远会向有利益的地方爬行。**技术本身是无罪的,问题往往出在人无限的欲望上。因此爬虫开发者的道德自持和企业经营者的良知才是避免触碰法律底线的根本所在。
爬虫原理剖析(重点)

爬虫的基本原理:模拟浏览器发请求的模式,进行网络数据的爬取。

  • 服务器:存储数据的一方(百度,京东…)
  • 客户端:请求数据的一方(浏览器)

在这里插入图片描述

  • 网页基本结构
    • 浏览器中显示的每一个网页都是由html标记语言写成的。html是由各种标签组成的。每种形式的标签都可以代表网页中的某种结构样式。
    • 爬虫爬取的内容就存储在指定的标签之中。
<html> 
<head><meta charset="UTF-8"><title>测试网页</title>
</head>
<body>我是网页主体内容!!!下面是我展示的一张好看的图片:<img src='https://pic.netbian.com/uploads/allimg/230308/001555-1678205755f136.jpg'><div>马斯克新能源</div>
</body>
</html>

较为复杂的页面结构

<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="#" method="post"><label>用户名:</label><input type="text" name="username"/><br/><label>密码:</label><input tyåpe="password" name="password"/><br/><label>爱好:</label><input type="checkbox" name="hobby" value="lanqiu">篮球<input type="checkbox" name="hobby" value="zuqiu">足球<input type="checkbox" name="hobby" value="qumao">羽毛球<input type="checkbox" name="hobby" value="gaoer">高尔夫<br/><label>性别:</label><input type="radio" name="sex" value="male"><input type="radio" name="sex" value="female"><br/><label>生日:</label><input type="date" name="birthday"><br><label>籍贯:</label><select name="jiguan"><option>请选择籍贯</option><option value="hebei">河北</option><option value="anhui">安徽</option><option value="liaoning">辽宁</option></select><br><label>自我介绍:</label><textarea cols="30" rows="10" placeholder="请描述" name="self"></textarea><br><input type="submit" value="提交"><input type="reset" value="重置"></form>
</body>
</html>
  • 浏览器抓包工具使用
    • 浏览器自带的抓包工具NetWord可以将客户端和服务器端进行的请求和响应过程进行查看
requests基础操作(代码实操重点!!!)
  • 基本介绍

    • requests就是爬虫中一个基于网络请求的模块。
    • 作用:模拟浏览器上网的。
    • urllib模块就是一个老版的requests模块,现在没人用urllib
  • 环境安装

    • pip install requests
  • 编码流程

    • 指定url(好比打开浏览器输入网址)
    • 发起请求(好比是按下回车)
    • 获取响应数据(从指定url中爬取到的数据)
    • 持久化存储
  • 案例应用

    • 搜狗首页数据采集

      • https://www.sogou.com/

      • import requests#1,指定url
        url = 'https://www.sogou.com/'#2,发起请求(只要在浏览器地址栏输入网址按下回车,发起的一定get请求)
        #url为get方法的第一个参数,表示根据指定的url发起get请求
        #get方法会返回一个响应对象
        response = requests.get(url=url) #get使用来使用requests模块发起get请求#3.获取响应数据/爬取到的数据
        page_text = response.text #text属性使用来返回字符串形式的响应数据
        # print(page_text)#4.持久化存储
        with open('./sogou.html','w') as fp:fp.write(page_text)
        print('数据爬取存储成功!')
        
    • 简易的网页采集器

      • 注意:在浏览器的地址栏中网址,网址?后面的内容就是请求的参数(请求参数)

        • https://www.sogou.com/web?query=jay
        • query=jay就是请求的参数
          • 请求参数就是客户端发送给服务端的数据
      • https://www.sogou.com/

      • import requests#请求参数动态化
        keyword = input('请输入关键字:')
        #稍后想要把该字典作为请求参数
        pram = {'query':keyword, #只存在一个键值对(存在一组请求参数)
        }
        #1.指定url
        url = 'https://www.sogou.com/web' #需要将请求参数去除
        #2.发起请求
        #params参数就是用来在请求时携带指定的请求参数
        response = requests.get(url=url,params=pram)#3.获取响应数据
        page_text = response.text#4.持久化存储
        fileName = keyword + '.html'
        with open(fileName,'w') as fp:fp.write(page_text)#出问题:没有爬取到我们想要的数据?原因是因为遇到反爬机制
        
      • 分析该网站的反爬机制:

        • 从爬取到的内容中提取到了一个关键信息:网站检测到了异常的访问请求
          • 异常的访问请求:通过程序发起的请求
          • 正常访问请求:通过浏览器发起的请求
        • 网站如何可以监测请求是不是通过浏览器发起的呢?
          • 是通过请求的一个头信息:user-agent
          • user-agent:请求载体的身份标识
        • 破解方式(UA伪装):伪装请求载体的身份标识
          • 该反爬机制是一种最常见最通用的,也就是说绝大数网站都会携带该反爬机制,因此日后写爬虫程序,默认带上UA伪装操作。
      • import requests#请求参数动态化
        keyword = input('请输入关键字:')
        #稍后想要把该字典作为请求参数
        pram = {'query':keyword, #只存在一个键值对(存在一组请求参数)
        }
        #1.指定url
        url = 'https://www.sogou.com/web' #需要将请求参数去除
        #2.发起请求
        head = { #存放需要伪装的头信息'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
        }
        #通过headers参数进行了头信息的伪装
        response = requests.get(url=url,params=pram,headers=head)#3.获取响应数据
        page_text = response.text#4.持久化存储
        fileName = keyword + '.html'
        with open(fileName,'w') as fp:fp.write(page_text)
        

豆瓣电影

  • https://movie.douban.com/typerank?type_name=%E7%88%B1%E6%83%85&type=13&interval_id=100:90&action=

  • 爬取电影的详情数据

  • 对网站进行分析:

    • 1.在抓包工具中先定位到和浏览器地址栏的网址一样的数据包

    • 2.查看开发者工具中,定位到的数据包中的response这一项,该项中存放的就是对定位到数据包的url发起请求,请求到的数据。

    • 3.在response选项卡中查看是否存在我们想要爬取的数据:

      • 如何检测是否存在我们想要爬取的数据呢?

        • 局部搜索:将你想要爬取的局部数据,在response进行搜索,查看是否可以搜索到。

          • 搜索到了:

            • 可以直接对该数据包的url发起请求获取你想要的数据即可
          • 搜索不到:

            • 说明你想要的数据是【动态加载数据】
            • 什么是动态加载数据?
              • 特指,不是通过浏览器地址栏的请求请求到的数据,就是动态加载数据。同理,动态加载数据一定是通过其他的请求请求到的。
            • 如何获取动态加载数据?
              • 基于抓包工具进行全局搜索
                • 鼠标点击任意的数据包,然后按下cotrl+f打开全局搜索框,搜索局部你想要的数据,即可定位到包含搜索数据的指定数据包。
                  • 从指定数据包中就可以提取出:
                    -url:https://movie.douban.com/j/chart/top_list
                    -请求方式:get
                    -请求参数:type=13&interval_id=100%3A90&action=&start=0&limit=1
import requests
head = { #存放需要伪装的头信息'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
pram = {"type": "13","interval_id": "100:90","action": "","start": "0","limit": "20",
}
url = 'https://movie.douban.com/j/chart/top_list'
response = requests.get(url=url,headers=head,params=pram)
#获取响应数据
#json()可以将获取到的json格式的字符串进行反序列化
page_text = response.json()
fp = open('./douban.txt','w')
for dic in page_text:title = dic['title']score = dic['score']fp.write(title+':'+score+'\n')print(title,'爬虫保存成功!')

肯德基

  • http://www.kfc.com.cn/kfccda/index.aspx

    • 将餐厅的位置信息进行数据爬取
import requests
head = { #存放需要伪装的头信息'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
#post请求的请求参数
data = {"cname": "","pid": "","keyword": "天津","pageIndex": "1","pageSize": "10",
}
#在抓包工具中:Form Data存放的是post请求的请求参数,而Query String中存放的是get请求的请求参数
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
#在post请求中,处理请求参数的是data这个参数不是params
response = requests.post(url=url,headers=head,data=data)
#将响应数据进行反序列化
page_text = response.json()
for dic in page_text['Table1']:name = dic['storeName']addr = dic['addressDetail']print(name,addr)

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

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

相关文章

【开发踩坑】使用PageHelper工具正常sql后面多无关语句

背景 SQL日志打印出现了脏东西&#xff1a; 本来结束的 where muc.code ?;后面凭空多出了一个 LIMIT语句 ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your …

使用 Flask 3 搭建问答平台(三):注册页面模板渲染

前言 前端文件下载 链接https://pan.baidu.com/s/1Ju5hhhhy5pcUMM7VS3S5YA?pwd6666%C2%A0 知识点 1. 在路由中渲染前端页面 2. 使用 JinJa 2 模板实现前端代码复用 一、auth.py from flask import render_templatebp.route(/register, methods[GET]) def register():re…

汇编教程2

本教程主要教大家如何安装32位Linux虚拟机&#xff0c;为后续实验拆炸弹做准备 下载系统映像文件 以Ubuntu14.04.6系统为例 官方网站&#xff1a;下载地址 点击下载图中32位系统 如果官网进不去可以使用镜像网站 清华镜像网站&#xff1a;下载地址 进入之后找到下图中链接…

Android C++系列:Linux线程(四)线程同步

多个线程同时访问共享数据时可能会冲突,这跟我们前面信号文章所说的可重入性是同样的问题。比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 从内存读变量值到寄存器;寄存器的值加1;将寄存器的值写回内存假设两个线程在多处理器平台上同时执行这三…

13. C++继承 | 详解 | 虚拟继承及底层实现

目录 1.定义 1.1继承的概念 1.2 继承的定义 2. 对象赋值转换 3. 继承中的作用域 a. 隐藏/重定义 (Hiding/Redefinition) b. 重载 (Overloading) c. 重写/覆盖 (Overriding) d. 编译报错 (Compilation Error) 4. 派生类的默认成员函数 构造 拷贝构造 运算符重载 析…

Windows FFmpeg 开发环境搭建

FFmpeg 开发环境搭建 FFmpeg命令行环境搭建使用FFmpeg官方编译的库Windows编译FFmpeg1. 下载[msys2](https://www.msys2.org/#installation)2. 安装完成之后,将安装⽬录下的msys2_shell.cmd中注释掉的 rem set3. 修改pacman 镜像源并安装依赖4. 下载并编译源码 FFmpeg命令行环境…

Harmony 状态管理 @Local 和 @Param

Harmony 状态管理 Local 和 Param Local 背景 Local 是harmony应用开发中的v2版本中 对标**State**的状态管理修饰器&#xff0c;它解决了 State 对状态变量更改的检测混乱的问题&#xff1a; State 修饰的状态变量 可以是组件内部自己定义的State 修饰的状态 也可以由外部父…

mysql常用函数五大类

mysql常用函数 1. 第一类&#xff1a;数值函数1.1 圆周率pi的值1.2 求绝对值1.3 返回数字的符号1.4 开平方&#xff0c;根号1.5 求两个数的余数1.6 截取正数部分1.7 向上取整数1.8 向下取整数1.9 四舍五入函数1.10 随机数函数1.11 数值左边补位函数1.12 数值右边补位函数1.13 次…

从PyTorch官方的一篇教程说开去(3.1 - GD 梯度下降法)

在openAI以前&#xff0c;我们所讨论的“人工智能”基本上都是“人工智障”&#xff0c;即时在某些方面表现得非常出色&#xff0c;击败了世界冠军&#xff0c;但最多算个某领域的“专才”而不是“通才”。 那么这些“智障”程序们&#xff0c;究竟是靠什么才能做到“专才”呢…

【总结】nginx源码编译安装报错./configure: error: SSL modules require the OpenSSL library.

问题现象 源码编译安装nginx时&#xff0c;执行./configure …… --with-http_ssl_module 命令安装https模块&#xff0c;需要用到openssl&#xff0c;由于机器缺少openssl库&#xff0c;报如下错误。 …… checking for openat(), fstatat() ... found checking for getaddr…

Flink HA

目录 Flink HA集群规划 环境变量配置 masters配置 flink-conf.yaml配置 测试 Flink HA集群规划 FLink HA集群规划如下&#xff1a; IP地址主机名称Flink角色ZooKeeper角色192.168.128.111bigdata111masterQuorumPeerMain192.168.128.112bigdata112worker、masterQuorumPee…

MySQL(5)表的查询

目录 1.表的查询 1.表的查询: 1.1创建表: 语法: create table 表名( 字段 类型 约束, 字段 类型 约束, ... 字段 类型 约束 ); 1.2 单行数据全行插入: &#x1f330; 表的字段都插入数据: insert into student values(100, 1000, 唐三藏, null); 1.3 多行数据 指定列插入:…

Go网络编程-RPC程序设计

gRPC 通信 RPC 介绍 RPC, Remote Procedure Call&#xff0c;远程过程调用。与 HTTP 一致&#xff0c;也是应用层协议。该协议的目标是实现&#xff1a;调用远程过程&#xff08;方法、函数&#xff09;就如调用本地方法一致。 如图所示&#xff1a; 说明&#xff1a; Servi…

STM32智能安防系统教程

目录 引言环境准备智能安防系统基础代码实现&#xff1a;实现智能安防系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;家庭与企业安防管理问题解决方案与优化收尾与总结 1. 引言 智能安防系统通过STM32…

webrtc QOS方法十三(视频渲染平滑)

一、背景介绍 视频渲染时间的确定需要考虑三方面的因素&#xff1a;网络抖动、网络延时、音视频同步 网络抖动&#xff1a;视频帧在网络上传输&#xff0c;会受到网络抖动的影响&#xff0c;不能收到立刻播放&#xff0c;需要进行适当的平滑 网络延时&#xff1a;一些报文在…

鱼眼相机变普通相机,利用Transform进行球面变换

Abstract 高分辨率广角鱼眼图像在自动驾驶等机器人应用中变得越来越重要。然而&#xff0c;使用普通的卷积神经网络或视觉变换器处理这类数据时会遇到问题&#xff0c;因为在将其投影到平面上的矩形网格时会引入投影和失真损失。为了解决这个问题&#xff0c;我们引入了HEAL-S…

雷达组网拼图3.0数据掌握和python解析处理

废话不多说&#xff0c;先展示雷达图 以反射率为例&#xff1a; 核对数据格式 Z_RADA_C_BABJ_20240705043615_P_DOR_ACHN_CREF_20240705_043000.bin数据分析认识 1. 组网产品分类&#xff1a;组网产品包括组网混合扫描反射率&#xff08;HSR&#xff09;&#xff0c;组网组…

Qt-事件与信号

事件和信号的区别在于&#xff0c;事件通常是由窗口系统或应用程序产生的&#xff0c;信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装&#xff0c;如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组…

Android Studio - adb.exe已停止运作的解决方案

adb.exe 是Android Debug Bridge 的缩写&#xff0c;它是Android SDK 中的一个调试工具&#xff0c;允许开发者通过命令行界面与设备进行交互&#xff0c;执行各种操作&#xff0c;如运行设备的shell、管理模拟器或设备的端口映射、在计算机和设备之间上传/下载文件、将本地APK…

鸿蒙语言基础类库:【@system.mediaquery (媒体查询)】

媒体查询 说明&#xff1a; 从API Version 7 开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.mediaquery]。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import mediaquery from sy…