首页 > 其他分享 >14--爬虫回顾和重点经验

14--爬虫回顾和重点经验

时间:2024-04-11 16:55:05浏览次数:16  
标签:浏览器 14 get -- 爬虫 url json session requests

01.浏览器

# 一个网页的加载全过程
1. 服务器端渲染
    html的内容和数据在服务器进行融合.
    在浏览器端看到的页面源代码中. 有你需要的数据

2. 客户端(浏览器)渲染
    html的内容和数据进行融合是发生在你的浏览器上的.
    这个过程一般通过脚本来完成(javascript)

我们通过浏览器可以看到上述加载过程

# 数据在浏览器的位置:
network --->  All  或  Fetch/XHR  或 JS   # 99%只会在这三个里

02.requests

# requests模块
  是python的一个非常完善的一个第三方模块,专门用来模拟浏览器进行网络请求的发送
    
# 本质就是 模拟成浏览器的样子

    

# url:
    协议     域名  端口(80) 资源文件路径   参数
    http://www.baidu.com/s?name=alex&age=185
    https://www.baidu.com/s?name=alex&age=185
# 发送get请求
# 参数类型:query string parameteres

# 方式: params 和 url传参. 二选一即可
requests.get("https://www.baidu.com/s?ie=UTF-8&wd=周杰伦")


resp = requests.get("https://www.baidu.com/s",
params={
    "ie": "UTF-8",
    "wd": "周杰伦"
})  # params 是专门给get请求增加参数的
# 发送post请求

# 参数类型:formdata 或 urlcode
requests.post(url, data={"直接给字典就可以了"})


# 参数类型:request payload, 能直观的看到是json类型的数据
requests.post(url, json={"直接给字典就可以了"})

requests.post(url, data=json.dumps({直接给字典就可以了}), headers={
    "Content-Type": "application/json; charset=UTF-8"
})



### get/pos对比
get/post, 是http的请求方式   # 我们只需要根据抓包里面的状况去选择使用
get和post的传参方式是不一样的 
get的参数,最终都会被添加到url身上 ###
# 状态码 (HTTP协议的状态码)
200 系列 一般指的是你当前本次和服务器进行通信没有问题

300 系列 一般指的是重定向. 注意在响应头上能看到location字样
        写爬虫的时候. 基本上不用管302 因为requests可以自动帮你完成这个重定向的动作

403 系列 一般都是被风控拦截了  

404 系列 资源文件路径走丢了 
       你的url不存在.再服务器上人家没办法给你想要的内容


500 系列 服务器内部出现了错误
    若浏览器有错,那就是本身服务有问题
    
    若浏览器上啥事儿没有. 你的程序一跑,就500. 基本上就是你给的参数有问题. 让服务器无法正常工作 

# 解决:重试 + 异常捕获
for i in range(10):
    try:
        发请求
        break
    except Exception as e:
        print("出错了")

03.简单反爬(header)

请求头

# 请求头参数

User-Agent  # 用户用什么设备发送的请求, 直接复制粘贴就好

Cookie      # 服务器 记录在浏览器上 的一个字符串, 写入浏览器上的一个文件中
  
    # 作用: 和服务器之间保持住会话.  session:同理,记录在服务器端的
    
    # 解决:
        1.可以直接从浏览器抓包中复制. (某些网站可以)

        2.requests.session()来保持会话
        
        注意:requests.session(). 可以帮你处理set-cookie的内容.
             它不能帮你处理javascript处理的cookie的内容.
             如果网站是用js来维护cookie的, name你需要自己来写代码处理这坨逻辑

Referer   # 用来检测上一个url是什么. 一般直接复制粘贴即可   eg: 图片防盗链


网页自己添加的一些参数   # 最蛋疼的  JS逆向的地方



### session的使用
session = requests.session()

session.headers = {

}

session.cookie = {

}

session.get()
session.post()

响应头

# 响应头参数
Location    # 302重定向地址    我们不管

Set-Cookie  # session自动维护 我们也不管

网页自己添加的一些参数  # 一般情况下是不用管的. 万中无一的那种网站会使用到

04.数据解析

# html
    re     # 常见使用场景:在html中获取到js的一部分代码(字符串)
    
    xpath  # 常见使用场景:解析常规的html结构
        from  lxml import etree
        tree = etree.HTML(response.text)
        res = tree.xpath("xxxxx/xxx/xxx")
        
        # etree的xpath,默认返回的是列表. 要判断空的情况
        if res:
            res[0]
        else:
            xxx
        
    bs4  # 常见使用场景:解析 xml类型和 svg(使用XML格式,定义图像)
        .find()
        .findall()

        
# json
    response.json()
    
    json.loads(response.text)

    # 注意:
    如果遇到反爬. 很可能拿到的东西 和 抓包工具获取的 不一致
    切记, 先打印response.text. 确定好 返回的内容是json格式. 才开始转化

    
# jsonp    一般是 network 中 JS 请求类型 返回的数据类型

    # 这个"jsonpxxxxxx",也在该url的 请求参数中看得到
        callback: jsonpxxxxxx
    
    # eg:
    jsonpxxxxxx({json})  => {json}
    
    # 解决:想办法去掉左右两端的xxxxxx( ) => 得到的就是json
    "jsonpxxxxxx({json})".replace("xxxxxx(", "")[:-1]

05.多任务异步爬虫

# 一般情况下:
最多是 多进程 + 多线程 就够了, 协程不仅麻烦,而且基本正规的网站 都有频率等限制,用不到协程这么高性能


# 进程是资源单位. 进程与进程之间是隔离的
p1 = Process()
p2 = Process()

Queue / redis   # 进程通信:队列 和 redis


# 线程是执行单位,多个线程共享 同一个进程的资源


# 协程是人为干预,主进程下 主线程的任务执行情况,将耗时任务 挂起,并切换到其他任务 (最麻烦的)

06.数据库

MySQL, Mongodb, redis

07.面向对象(基础)

标签:浏览器,14,get,--,爬虫,url,json,session,requests
From: https://www.cnblogs.com/Edmondhui/p/18129571

相关文章

  • Axios基础
    axiosaxios是一个专注于网络请求的库,基本语法如下axios({method:'post/get',url:'xxx',//url中带的参数即get传递的数据params:{},//post传递的参数即请求体参数data:{},}).then((result)=>{//.then用来指定请求成功后的回调函数})promise......
  • list不能直接remove
    当一个list集合里面包含某个id,我需要把它过滤掉,于是,我直接上代码if(managerIds.contains(userId)){managerIds.remove(userId);}returnmanagerIds;然而,这种写法是大错特错了!因为,list不能直接remove,要不然就会报一个索引的错误,所以,经过指导后代码就改成了if(manager......
  • 拓扑学基础
    拓扑学基础拓扑空间\((X,\mathcal{T})\):\(\varnothing,X\in\mathcal{T}\subseteq\mathcal{P}(X)\)且对任意并、有限交封闭子集\(A\)的点\(x\)的分类内点(内部\(A^\circ\)):\(x\inX,A\in\mathcal{U}(x)\)边界点(边界\(A^b\)):\(x\not\inA^e\)且\(x\not\inA^\......
  • 《无垠的太空(8).提亚玛特之怒》第四章:特蕾莎
    第四章:特蕾莎特蕾莎·杜阿尔特是高级领事杜阿尔特的独生女,从蹒跚学步起就住在拉科尼亚的帝国大厦,如今她快14岁了,伊利奇上校担任她的教师。近来,父亲要她一起参加帝国事务的报告会议,并在会后和他探讨。父亲把她当帝国的接班人培养,以便他出意外后由她接替高级领事的位置。 完整发......
  • 最长递增子序列leetcode的总结
    使用动态规划解决,首先明白dp数组的含义dp[i]表示在位置i时最长的递增子序列dp[i]=max(dp[j]+1,dp[i])为递推公式初始化dp[i]=1都初始化为1因为最基本的每一个位置至少为一个遍历顺序for(inti=2;i<len;i++){            for(intj=0;j<i;j++){if(n......
  • ESLint
    一个检测代码风格的工具debugger,使用代码的方式打断点规则报错可以去eslint官网查看以参照修改插件:eslint配置:在setting.json内输入//ESLint插件配置"editor.codeActionsOnSave":{"source.fixAll":true,},插件:Prettier配置:在setting.json内输入//prettier、esli......
  • const 使用总结
    const关键字是用于定义一个不该被改变的对象,它的作用是告诉编译器和其他程序员不允许修改这个对象的值或者状态。当程序员看到使用const修饰的代码时就知道不应该修改对应对象的值,而编译器则会强制实施这个约束,任何违反这个规定的代码会在编译期间报错。它可以用于任何函数或者类......
  • IOS开发——构建版本打包上传App Store Connect中找不到新上传的版本
    遇到这个问题,直接去看你开发者账号绑定邮箱里边收到的邮件,根据邮件上的提示一项项完善了配置就可以了。如下图,红框中的内容就是添加了拍照、相册权限后报出的,也就是添加了这两个权限之后,AppStoreConnect中找不到新上传的版本了。info.plist文件添加对应的权限说明内容就好了,......
  • 27、座位表
    1、全选文字2、点击表格—【文本转为表格】—【点击确定】  【表格】—【表格选项】—【运行调整单元格间距】最后设置文字居中对齐就可以了  ......
  • 3dmax2024渲染大图高清参数,3dmax效果图渲染设置
    ​2024版的3dsMax带来了更为强大的渲染工具和优化的参数设置,使得设计师能够创造出令人惊叹的视觉作品,何利用3dsMax2024的先进功能,精心调整渲染参数,以实现高分辨率、高质量的效果图输出,满足专业设计和视觉表现的需求。下面一起来看看。3dmax2024渲染高清图的参数设置1、打开......