爬虫requests+综合练习详解

Day2 - 1.requests第一血_哔哩哔哩_bilibili

requests作用:模拟浏览器发请求

requests流程:指定url -> 发起请求 -> 获取响应数据 -> 持续化存储

爬取搜狗首页的页面数据

import requests

# 指定url
url = 'https://sogou.com'
# 发起请求
response = requests.get(url)
# 获取响应数据,text返回字符串形式的响应数据
page_txt = response.text
# 持久化存储
with open('./sogpu.html', 'w', encoding='utf-8') as fp:
    fp.write(page_txt)

简易网页采集器

输入关键词后,爬取搜索结果的页面信息

https://www.sogou.com/web?query=%E8%B5%B5%E6%B5%A9%E7%84%B6&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=2106&sst0=1705812059807&lkt=0%2C0%2C0&sugsuv=1705811188521571&sugtime=1705812059807

把url中多余的参数去掉

https://www.sogou.com/web?query=%E8%B5%B5%E6%B5%A9%E7%84%B6

这里的中文变成了乱码,无需处理,当然想手动换成中文也行

为了使关键词可变,需要处理url携带的参数:封装到字典中

再把url中的参数删干净https://www.sogou.com/web

import requests

url = 'https://www.sogou.com/web'
keyword = input()
param = {
    'query': keyword
}
response = requests.get(url, params=param)
page_txt = response.text
filename = keyword+'.html'
with open(filename, 'w', encoding='utf-8') as fp:
    fp.write(page_txt)

UA伪装

此次案例中需要介绍一种反扒机制——UA检测

UA:User-Agent:请求载体的身份标识

UA检测:门户网站的服务器会检测对应请求的载体身份标识,如果检测到载体身份标识为某一款浏览器,则认为是正常的请求;否则认为是不正常的请求

UA伪装:将对应的User-Agent封装到headers字典中

f12或者检查页面,找到网络部分,先清楚网络日志再刷新页面,找到需要的请求对应的UA

然后把这个headers字典放入get请求中

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
}
url = 'https://www.sogou.com/web'
keyword = input()
param = {
    'query': keyword
}
response = requests.get(url, params=param, headers=headers)
page_txt = response.text
filename = keyword+'.html'
with open(filename, 'w', encoding='utf-8') as fp:
    fp.write(page_txt)

破解百度翻译

爬取百度翻译中,对应单词翻译的结果

由于我们不是想要爬取整个页面,而是爬取页面中的部分信息,经常需要用到数据解析

但不使用数据解析也能获取局部信息,这次我们就不使用

从上面两张图我们可以看出,输入单词后页面做了一个局部的刷新,我们知道局部的刷新是可以通过Ajax实现的,也就意味着我们在文本框中输入字符后,会自动进行Ajax的请求发送,Ajax请求成功后会对页面进行局部刷新

经过分析,我们是不是应该利用抓包工具,捕获一下对应的Ajax请求

点击XHR,XHR中对应的是Ajax请求的数据包

输入dog

在xhr类型中一个个找

查看post请求携带的参数是d,不清楚是什么东西,所以接着往下看

三个sug包对应的是每输入一个字符后的Ajax请求,我们需要的是dog的翻译结果,所以要抓最后一个sug包

这样我们就拿到了请求的url,Content-Type这里是指我们输入一个字符后,服务器端响应回来的是一组json串

分析总结

(1)post请求(携带了参数)

(2)响应数据是一组json数据

import requests
import json

post_url = 'https://fanyi.baidu.com/sug'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36 HBPC/12.1.3.303'
}
word = input()
data = {
    'kw': word
}
response = requests.post(url=post_url, data=data, headers=headers)
# 响应数据是json数据,如果继续使用.text获取的是一组字符串形式的json,而.json返回的是一个obj,json是什么对象就是什么对象,在这里是字典
dict_obj = response.json()
# 由于是字典对象,所以不能直接write
filename = './' + word + '.json'
fp = open(filename, 'w', encoding='utf-8')
json.dump(dict_obj, fp, ensure_ascii=False)  # 字典中有中文,不用ascii编码

豆瓣电影排名

爬取豆瓣电影某一分区的电影排名,以喜剧片为例

第一种方法:利用数据解析,如果对当前url进行整个页面信息的爬取,则能拿到页面信息,再利用数据解析就可以获取电影名、主演名、上映时间等等信息

第二种方法:思考它会不会像百度翻译一样,使用Ajax请求进行局部刷新呢?我们用滚轮滑到底部

发现新的电源被加载出来了,滚轮回到中间,但是我们的url并没有改变,所以确实是一个Ajax请求

加载新电影时果然捕获了一个Ajax请求,GET请求且携带了5个参数,服务器端返回json串

5个参数中,我们大概可以猜测出来start和limit含义:

start:从豆瓣数据库中第几部电源开始取出来

limit:取多少部

在响应中看到json串是列表对象

import requests
import json

url = 'https://movie.douban.com/j/chart/top_list'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
}
param = {
    'type': '24',
    'interval_id': '100:90',
    'action': '',
    'start': '0',  # 从豆瓣数据库中第几部电源开始取出来
    'limit': '20'  # 一次取多少部
}
response = requests.get(url, params=param, headers=headers)

list_obj = response.json()

fp = open('douban_movie.json', 'w', encoding='utf-8')
json.dump(list_obj, fp, ensure_ascii=False)

肯德基餐厅查询

肯德基官方网站 - Welcome to KFC.com.cn

爬取肯德基餐厅位置

输入关键字后发现url并没有改变,说明是Ajax请求

import requests
from bs4 import BeautifulSoup

url = 'https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
}
word = input()
data = {
    'cname': '',
    'pid': '',
    'keyword': word,
    'pageIndex': '1',
    'pageSize': '10'
}
response = requests.post(url, data=data, headers=headers)
text = response.text

with open('kfc_' + word + '.html', 'w', encoding='utf-8') as fp:
    fp.write(text)

国家药监局化妆品生产许可证

由于找不到网站在哪,所以无法敲代码实战,以下是需求分析:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Netty和Reactor设计模式

Netty Netty一个线程通过多路复用,能够实现多个socket的非阻塞的调用。 Reactor Reactor 模式是一种设计模式,也叫响应器模式。 以下是 Reactor 模式的基本组成部分: 事件处理器(Event Handlers): 这些是实际处理特…

【深度学习目标检测】十七、基于深度学习的洋葱检测系统-含GUI和源码(python,yolov8)

使用AI实现洋葱检测对农业具有以下意义: 提高效率:AI技术可以快速、准确地检测出洋葱中的缺陷和问题,从而提高了检测效率,减少了人工检测的时间和人力成本。提高准确性:AI技术通过大量的数据学习和分析,能够…

Simulink之Signal

Simulink.Signal 指定信号的属性 描述 此类使您能够创建工作区对象,用于分配或验证信号或离散状态的属性,如其数据类型、数字类型、维度等。您可以使用信号对象来: 将值指定给信号源未指定的信号属性(值为-1或auto)。 验证其值由信号源显式指定的信号属性。此类属性的…

Windows系统如何修改Nginx配置实现远程访问多个本地站点

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…

IDEA配置Maven

打开idea选择Configure-->Settings 配置Mavne的路径信息 创建一个Maven项目 创建完成后默认会打开我们的pom.xml文件 添加一个junit的maven 分享一个maven资源的下载网址 Maven Repository: Search/Browse/Explore (mvnrepository.com) 打开网址 选中它进入首页 搜索jun…

Go新项目-Gin中wire的依赖注入方式实战(6)

选型Go项目过程中,针对依赖注入方式的分析和使用 参考资料 https://go.dev/blog/wirehttps://medium.com/dche423/master-wire-cn-d57de86caa1bhttps://toutiao.io/posts/et0t2lk/previewhttps://imlht.com/archives/223/https://lailin.xyz/post/go-training-week…

右值引用和move语义

文章目录 一、左值和右值二、左值引用和右值引用三、move语义四、右值引用的作用1.左值引用的作用和局限2.右值引用的作用3.重谈std::move()4.完美转发 一、左值和右值 在《C Primer Plus》书中这样提到左值:左值是用于标识或定位存储位置的标签。 对于早期的 C 语…

Kafka框架详解

Kafka 1、Kafka介绍 ​ Kafka是最初由linkedin公司开发的,使用scala语言编写,kafka是一个分布式,分区的,多副本的,多订阅者的消息队列系统。 2、Kafka相比其他消息队列的优势 ​ 常见的消息队列:Rabbit…

【设计模式】张一鸣笔记:责任链接模式怎么用?

我将通过一个贴近现实的故事——请假审批流程,带你了解和掌握责任链模式。 什么是责任链模式? 责任链模式是一种行为设计模式,它让你可以避免将请求的发送者与接收者耦合在一起,让多个对象都有处理请求的机会将这个对象连成一条…

MQ 消息丢失、重复、积压问题,如何解决?

面试官在面试候选人时,如果发现候选人的简历中写了在项目中使用了 MQ 技术(如 Kafka、RabbitMQ、RocketMQ),基本都会抛出一个问题:在使用 MQ 的时候,怎么确保消息 100% 不丢失? 这个问题在实际…

2024-01-22(MongoDB)

1.Mongodb使用的业务场景: 传统的关系型数据库/mysql在“三高”需求以及应对web2.0的网站需求面前,有点力不从心,什么是“三高”需求: a. 对数据库高并发的读写需求 b. 对海量数据的高效率存储和访问需求 c. 对数据库的高可扩…

wayland(wl_shell) + egl + opengles 实例——gears

文章目录 前言一、ubuntu 上 opengl 版本的 glxgears二、基于 wayland 窗口协议的 gles-gears1.egl_wayland_gears.c2. matrix.c 和 matrix.h3. 编译4. 运行总结参考资料前言 本文主要介绍如何在linux 下 wayland 窗口中,使用 egl + opengles 控制GPU 渲染 gears 并显示,即实…

element plus表格的表头和内容居中

文章目录 需求分析 需求 对于 element-plus 中的 table 进行表头和内容的居中显示 分析 单列的表头和内容居中 &#xff1a; 在对应的那一列加上align“center” 即可 <el-table-column prop"name" label"商品名称" align"center" />…

统计灰度图像的灰度值分布并绘制

1、numpy方法 函数&#xff1a; numpy.histogram(a, bins10, rangeNone, normedNone, weightsNone, densityNone) 参数说明&#xff1a; a:输入数据数组&#xff1b;bins:指定统计的区间个数&#xff0c;可以是一个整数&#xff0c;也可以是一个数组&#xff0c;默认值为10…

华而有实,维乐Prevail Glide带你领略风景线,成为风景线~

大家都知道呢&#xff01;骑行&#xff0c;不仅是一种运动&#xff0c;更是一种生活态度。在骑行装备的世界里&#xff0c;一个好的坐垫对于骑行的舒适度和安全性至关重要。那今天&#xff0c;我要为大家推荐一款备受赞誉的坐垫——维乐坐垫美学系列-Prevail Glide。    为…

【C++】初识类和对象

引言 在C语言中&#xff0c;我们用结构体来描述一个复杂的对象&#xff0c;这个对象可能包括许多的成员&#xff0c;如用结构体描述一个学生的成绩&#xff0c;或者描述一个日期等。 struct Date {int _year;int _month;int _day; }; 如上是一个描述日期的结构体定义&#x…

一本满是错误的Go语言书,凭什么1000万人都在读

犯错是每个人生活的一部分。正如爱因斯坦曾说过&#xff1a;一个从未犯过错的人从未尝试过新东西。 最重要的不是我们犯了多少错误&#xff0c;而是我们从错误中学到了多少东西。 这个观点同样适用于编程领域。 我们从一门编程语言中获取经验不是一个神奇的过程&#xff0c;…

Rocky Linux 9. 3安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

2024.1.19 网络编程 作业

思维导图 练习题 1> UDP传输实现聊天室 服务器端 #include <myhead.h> #define SER_IP "192.168.125.151" #define SER_PORT 9999 typedef struct Msg {char user[32]; //用户名int type; //执行操作1.登录、2.发消息、0.退出char text[1024]; …

NOC总线(1)

1. 背景 SoC &#xff08;system on chip,片上系统&#xff09;通常指在单一芯片上实现的数字计算机系统&#xff0c;总线结构是该系统的主要特征&#xff0c;由于其可以提供高性能的互连而被广泛运用。随着单芯片上集成的处理器核数越来越多&#xff0c;片上互连架构经历了从专…