Python爬虫之requests模块(一)

Python爬虫之requests模块(一)

学完urllib之后对爬虫应该有一定的了解了,随后就来学习鼎鼎有名的requests模块吧。

一、requests简介。

1、什么是request模块?

requests其实就是py原生的一个基于网络请求的模块,模拟浏览器发起请求,是不是和urllib很像。没错,其实requests和urllib是有很多相似之处的,但是requests更加的便捷、简单。

2、为什么要使用requests模块?

一个技术的出现,肯定是有所图的,回想一下urllib的使用。
第一:是不是如果url携带中文,是不是每次都要对url进行编码?(使用quote函数),如果一个url中,有很多组参数都带中文,那岂不是需要对url进行数次的编码?
第二:基于post请求,需要手动的处理post请求的参数(urlencode函数)
第三:urllib处理cookie和代理的操作比较繁琐。

但是对于requests来说,则会自动处理url编码、自动处理post请求参数,还简化了cookie和代理操作等等

3、requests模块如何被使用?

其实和其他所有模块一样,需要先使用pip安装,随后import调用

pip install requests

具体使用流程和urllib几乎类似:

  1. 指定url
  2. 使用requests模块发起请求
  3. 获取响应数据
  4. 进行持久化存储

二、基于requests模块发起get请求

1、requests模块处理不带参数的get请求

  • 需求爬取搜狗首页页面数据
import requests
#1、指定url
url = "https://www.sogou.com/"

#2、发起一个get请求,直接调用requests的get方法,url参数为指定爬取的url
#get方法会返回请求成功后的响应对象
response = requests.get(url=url)

#3、获取响应中的数据值,text属性作用是获取响应对象中字符串形式的页面数据
page_data = response.text

# print(page_data)
#4、持久化存储
with open("sougou_req.html","w",encoding="utf-8") as f:
    f.write(page_data)

其实和urllib很类似。但是可以看到响应对象的属性,有一个text。
其实关于响应对象的常用属性还是挺多的,如下常见的:

requests对象中其他重要的属性:

response.content  #content属性和text类似,只不过返回的是响应对象中二进制(byte)类型的数据
response.status_code #status_code很简单明了,就是返回响应状态码,比如200、404、502等...
response.headers  #返回响应头信息,字典形式展示
response.url # 获取请求当中指定的url

2、requests模块处理携带参数的get请求

  • 需求:指定一个词条,获取搜狗搜索结果所对应的页面数据

第一种方式:

import requests

#指定URL,query后面是请求参数,词条是孙燕姿,编码格式是utf-8
url = "https://www.sogou.com/web?query=孙燕姿&ie=utf8"

#发送请求,requests即使请求url携带参数,也同样可以直接使用get函数对其发起请求
response = requests.get(url=url)

#获取响应页面数据
page_data = response.text

#持久化存储
with open('sunyanzi_re.html', 'w', encoding='utf-8') as f:
    f.write(page_data)

第二种方式:

import requests

#指定URL,query后面是请求参数,参数先不写
url = "https://www.sogou.com/web"

#get方法其实还有一个params的参数,可以将参数使用字典的方式直接赋值
#将参数封装到字典中
params = {
    "query": "孙燕姿",
    "ie": "utf-8"
}
#使用get的params赋值
response = requests.get(url, params=params)

#查看响应状态码
print(response.status_code)

这里使用status_code返回请求的状态码,成功则为200。

3、requests模块get请求自定义请求头信息

requests模块自定义请求头信息和urllib类似:

import requests

#自定义请求头信息
url = "https://www.sogou.com/web"

#将参数封装到字典中
params = {
    "query": "孙燕姿",
    "ie": "utf-8"
}

#自定义请求头信息
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"
}

#使用get的headers自定义请求头信息,将请求头信息赋值给headers
response = requests.get(url, params=params,headers=headers)

#获取页面响应数据
data_page = response.text

#持久化存储
with open("ff.html","w",encoding="utf-8") as f:
    f.write(data_page)

三、基于requests模块发起post请求

  • 需求:登陆豆瓣,获取登录成功后的页面数据

首先这里需要获取到登陆时的URL
在这里插入图片描述
查看数据表单,确认用户数据。(这里我发现豆瓣密码居然是明文传输的。)在这里插入图片描述

import requests

#指定POST请求的URL
url = "https://accounts.douban.com/j/mobile/login/basic"

#封装post请求的data参数,data参数是账号密码信息,在浏览器中复制数据表单!
data = {
    "remember": "true",
    "name": "**",
    "password": "**",
    "ticket": "tr0kBmbIbu****vjIlOi6F7Q**",
    "randstr": "**",
    "tc_app_id": "204**"
}

#伪装UA
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"
}

#发起post请求,调用post方法,第二个参数是data参数,第三个参数为自定义请求头信息
response = requests.post(url=url,data=data,headers=headers)

#获取响应对象中的页面数据
data_page = response.text

#持久化保存
with open("douban_re.html","w",encoding="utf-8") as f:
    f.write(data_page)

四、quests模块的ajax的get请求

AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。
ajax是一种浏览器通过js异步发起请求,局部更新页面的技术。
Ajax请求的局部更新,浏览器地址栏不会发生变化
局部更新不会舍弃原来页面的内容

  • 需求:抓取豆瓣电影上的详情数据

当然,首先还是得获取到一个ajax的请求。这里通过开发者工具抓取到get方式的URL
在这里插入图片描述

这里注意到URL是携带参数的,可以点开GET左边的箭头打开复制下面的参数。
在这里插入图片描述

import requests

#url携带参数,需要封装字典或者抽取到params中
#url = "https://movie.douban.com/j/chart/top_list?type=5&interval_id=100:90&action=&start=20&limit=20"
url = "https://movie.douban.com/j/chart/top_list"

#抽取参数,start表示从20开始获取,获取20个电影
params = {
    "type": "5",
    "interval_id": "100:90",
    "action": "",
    "start": "20",
    "limit": "20"
}

#自定义请求头信息
heards = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0"
}

#发起请求,ajax依旧是get方法
response = requests.get(url=url,params=params,headers=heards)

data_page = response.text
print(data_page)

五、quests模块的ajax的post请求

  • 需求:爬取肯德基城市餐厅位置数据

打开kfc官网

http://www.kfc.com.cn/kfccda/index.aspx在这里插入图片描述
点击查询按钮,就可以看到一个异步的ajax请求
在这里插入图片描述
这里选择北京,点击查询并且抓取XHR就能抓取到这个ajax请求。在这里插入图片描述
同样表单数据可以看到参数
在这里插入图片描述

import requests

#指定url
url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname"

#处理URL
data = {
    "cname": "北京",
    "pid": "",
    "pageIndex": "1",
    "pageSize": "10"
}

#伪装UA
heards = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"
}

#发起基于ajax的post请求
response = requests.post(url=url,params=data,headers=heards)

kfc = response.text
print(kfc)

拿到结果可以验证一下,这就是基于ajax的post请求。在这里插入图片描述

六、初步总结

使用requests模块基于ajax的post和get请求和普通的get和post请求没有什么差别,唯一的不同是必须要基于抓包工具抓取异步请求的url。

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

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

相关文章

「漏洞复现」灵当CRM marketing/index.php SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

python爬虫初体验(一)

文章目录 1. 什么是爬虫?2. 为什么选择 Python?3. 爬虫小案例3.1 安装python3.2 安装依赖3.3 requests请求设置3.4 完整代码 4. 总结 1. 什么是爬虫? 爬虫(Web Scraping)是一种从网站自动提取数据的技术。简单来说&am…

c++调用python函数进行传参计算和返回

目录 前言:配置环境:基础夯实:1. 初始化Python解释器2. 导入Python模块3. 获取函数对象4. 调用Python函数5. 处理返回值6. 错误处理7. 资源管理8. 编译和链接9. 线程安全性10. 进一步学习 效果展示:实现功能:操作步骤&…

CentOS上使用Mosquitto实现Mqtt主题消息发布和订阅mqtt主题消息连同时间戳记录到文件

场景 CentOS上使用rpm离线安装Mosquitto(Linux上Mqtt协议调试工具)附资源下载: CentOS上使用rpm离线安装Mosquitto(Linux上Mqtt协议调试工具)附资源下载-CSDN博客 上面介绍了mosquitto的离线安装。 如果业务场景中需要订阅某mqtt主题的消息并将收到消息的时间以…

Android轻量级RTSP服务使用场景分析和设计探讨

技术背景 好多开发者,对我们Android平台轻量级RTSP服务模块有些陌生,不知道这个模块具体适用于怎样的场景,有什么优缺点,实际上,我们的Android平台轻量级RTSP服务模块更适用于内网环境下、对并发要求不高的场景&#…

Activiti7《第九式:破气式》——流畅驱动工作流进程。面试题大全

冲冲冲!开干 这篇文章将分为九个篇章,带你逐步掌握工作流的核心知识。“破气式”,代表着工作流中的 无形之力,它是贯穿整个流程的 关键驱动 不知不觉已经到了独孤九剑最后一式了,我相信到这里之后各位都已经出神入化…

windows桌面管理软件推荐:一键整理桌面!美化电脑桌面小助手!

windows桌面管理软件推荐来咯!在繁忙的工作和生活中,一个整洁、有序的电脑桌面不仅能提升工作效率,还能带来愉悦的视觉体验。然而,随着文件的增多,桌面往往变得杂乱无章。幸运的是,市面上有许多优秀的Windo…

构建高可用和高防御力的云服务架构第五部分:PolarDB(5/5)

引言 云计算与数据库服务 云计算作为一种革命性的技术,已经深刻改变了信息技术行业的面貌。它通过提供按需分配的计算资源,使得数据存储、处理和分析变得更加灵活和高效。在云计算的众多服务中,数据库服务扮演着核心角色。数据库服务不仅负…

​地质图制图规范大全资料分享

我们在《2024年最新测绘地理信息规范在线查看下载》一文整理460个测绘地理信息相关规范的在线查看链接。 现在我们又整理了地质图制图规范大全分享给大家,你可以在文末查看该文档的领取方法。 地质图制图规范大全 这些地质图制图规范来自地质科学数据出版系统&am…

Rustrover2024.2 正式发布:个人非商用免费,泰裤辣

如果这个世界本身 已经足够荒唐 那究竟什么才能算是疯狂 爱情就是这样 一旦错过了 就会有另一个人代替 我们知道 jetbrains 在今年的早些时候正式为 rust 语言发布了专用的 IDE ,也就是 rustrover。如今 rustrover 也正式跻身为 jetbrains IDE 系列的一员猛将。…

network request to https://registry.npmjs.org/xxx failed, reason: connect ETIM

目录: 1、问题描述2、解决方案3、npm镜像仓库替换 1、问题描述 npm install 时,报错:npm ERR! network request to https://registry.npmjs.org/postcss-pxtorem failed, reason: connect ETIMEDOU npm ERR! code ETIMEDOUT npm ERR! errno…

COMTRADE 录波文件 | 可视化工具 | 电能质量查看软件

COMTRADE 录波文件 | 可视化工具 | 电能质量查看软件 主要功能介绍 支持 IEEE Std C37.111-1991/1999/2013 规范。读取 ASCII 或二进制 COMTRADE 文件。查看来自 COMTRADE 配置文件的模拟和数字通道列表。将图表导出为 SVG、BMP、JPEG 和 PNG 图形格式。将显示的观察结果以 C…

携手长江存储,构建高性能分布式存储

近年来,《金融科技(FinTech)发展规划(2022-2025 年)》《关于银行业保险业数字化转型的指导意见》《金融标准化“十四五”发展规划》等金融监管政策陆续出台,金融机构对于数据基础设施的升级部署&#xff0c…

工业建模设计软件概览与SOLIDWORKS深度解析

在当今快速发展的工业领域,高效的建模设计软件是工程师和设计师不可或缺的工具。这些软件不仅提高了设计的精确度,还大幅缩短了产品从概念到市场的周期。本文将为您介绍当前市场上主流的工业建模设计软件,并重点介绍SOLIDWORKS的优势和应用。…

10.软件工程知识详解上

软件工程概述 软件开发生命周期 软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目标,具体可分成问题定义、可行性研究、需求分析等。软件开发时期:就是软件的设计与实现,可分成…

汽车总线之----FlexRay总线

Introduction 随着汽车智能化发展,车辆开发的ECU数量不断增加,人们对汽车系统的各个性能方面提出了更高的需求,比如更多的数据交互,更高的传输带宽等。现如今人们广泛接受电子功能来提高驾驶安全性,像ABS防抱死系统&a…

git push出错Push cannot contain secrets

报错原因: 因为你的代码里面包含了github token明文信息,github担心你的token会泄漏,所以就不允许你推送这些内容。 解决办法: 需要先把代码里面的github token信息删除掉,并且删掉之前的历史提交,只要包…

关于ShuffleNetV1中的channel shuffle操作【代码分析】

1. 官方给出的代码 旷视科技在自己的开源GitHub上给出的channel shuffle相关代码如下图所示: 分析上图中的代码,旷视科技将channel shuffle这个操作视为一个函数,函数传入的参数是输入张量x,x的shape为(batchsize, num_ch…

Ceph 基本架构(一)

Ceph架构图 Ceph整体组成 Ceph 是一个开源的分布式存储系统,设计用于提供优秀的性能、可靠性和可扩展性。Ceph 的架构主要由几个核心组件构成,每个组件都有特定的功能,共同协作以实现高可用性和数据的一致性。 以下是 Ceph 的整体架构及其…

大数据处理从零开始————3.Hadoop伪分布式和分布式搭建

1.伪分布式搭建(不会用,了解就好不需要搭建) 这里接上一节。 1.1 伪分布式集群概述 伪分布式集群就是只有⼀个服务器节点的分布式集群。在这种模式中,我们也是只需要⼀台机器。 但与本地模式不同,伪分布式采⽤了分布式…