爬虫实战学习笔记_6 网络请求request模块:基本请求方式+设置请求头+获取cookies+模拟登陆+会话请求+验证请求+上传文件+超时异常

1 requests

requests是Python中实现HTTP请求的一种方式,requests是第三方模块,该模块在实现HTTP请求时要比urlib、urllib3模块简化很多,操作更加人性化。

2 基本请求方式

由于requests模块为第三方模块,所以在使用requests模块时需要通过执行“pipinstallrequests”代码进行该模块的安装。

如果使用了Anaconda,则不需要单独安装requests模块。

2.1 requests发送GET请求+获取网站页面时,设置编码防止乱码

import requests    # 导入网络请求模块requests# 发送网络请求
response = requests.get('https://www.baidu.com')
print('响应状态码:',response.status_code) # 响应状态码: 200
print('请求网络地址',response.url) # 请求网络地址 https://www.baidu.com/
print('头部信息',response.headers) # 头部信息 {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Mon, 28 Mar 2022 13:01:40 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:23:55 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
print('cookie信息',response.cookies) # cookie信息 <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>response.encoding = 'utf-8' # 设置编码 防止乱码
print(response.text) # 文本的形式打印

2.2 requests模块获取图片信息并保存

import requests    # 导入网络请求模块requests# 发送网络请求,下载百度logo
response = requests.get('https://www.baidu.com/img/bd_logo1.png')
print(response.content)              # 打印二进制数据
with open('百度logo.png','wb')as f:   # 通过open函数将二进制数据写入本地文件f.write(response.content)        # 写入

2.3 requests模块的POST请求

import requests    # 导入网络请求模块requests
import json        # 导入json模块# 字典类型的表单参数
data = {'1':'好运常伴','2':'平安喜乐'}
# 发送网络请求
response = requests.post('http://httpbin.org/post',data=data)
response_dict = json.loads(response.text)      # 将响应数据转换为字典类型
print(response_dict)                             # 打印转换后的响应数据

3 高级请求方式

requests模块将复杂的请求头、Cookie以及网络超时请求方式进行了简化,只要在发送请求时设置对应的参数即可实现复杂的网络请求。

3.1 设置请求头

请求一个网页内容时,发现通过GET或者POST以及其他请求方式,都会出现403错误。原因在于服务器拒绝了用户的访问,因为通过检测头部信息的方式防止恶意采集。解决方案:模拟浏览器的头部信息来进行访问。

3.1.1 代码实现:requests模块设置请求头

import requests    # 导入网络请求模块requestsurl = 'https://www.baidu.com/'     # 创建需要爬取网页的地址
# 创建头部信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0'}
response = requests.get(url, headers=headers)    # 发送网络请求
print(response.status_code)                       # 打印响应状态码 200

3.2 获取cookies

在爬取某些数据时,需要进行网页的登录,才可以进行数据的抓取工作。Cookie登录就像很多网页中的自动登录功能一样,可以让用户在第二次登录时不需要验证账号和密码直接登录。

在使用requests模块实现Cookie登录时,首先在浏览器的开发者工具页面中找到可以实现登录的Cookie信息,然后将Cookie信息处理并添加至RequestsCookieJar的对象中,最后将RequestsCookieJar对象作为网络请求的Cookie参数,发送网络请求即可。

3.2.1 代码实现:requests模块获取cookies

import requests  # 导入网络请求模块
from lxml import etree  # 导入lxml模块cookies = '此处填写登录后网页中的cookie信息'
headers = {'Host': 'www.XXXXX.com','Referer': 'https://www.baidu.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ''AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/72.0.3626.121 Safari/537.36'}
# 创建RequestsCookieJar对象,用于设置cookies信息
cookies_jar = requests.cookies.RequestsCookieJar()
for cookie in cookies.split(';'):key, value = cookie.split('=', 1)cookies_jar.set(key, value)  # 将cookies保存RequestsCookieJar当中
# 发送网络请求
response = requests.get('https://www.douban.com/',headers=headers, cookies=cookies_jar)
if response.status_code == 200:  # 请求成功时html = etree.HTML(response.text)  # 解析html代码# 获取用户名name = html.xpath('//*[@id="db-global-nav"]/div/div[1]/ul/li[2]/a/span[1]/text()')print(name[0])  # 打印用户名

3.3 会话请求

设置Cookie的方式先实现模拟登录,然后再获取录后页面的信息内容,比较繁琐。

3.3.1 会话请求功能

requests模块中的Session对象实现在同一会话内发送多次网络请求。即创建一个登陆好的对象,在该对象的属性中进行登陆操作,登陆完成后该对象就是已登陆成功的模拟用户,可以随意发送请求进行数据的收集。

3.3.1 代码实现:requests模块会话请求

import requests        # 导入requests模块
# 原理:使用同一个对象获取,分别从这个对象读取不同的页面信息
s = requests.Session()  # 创建会话对象
data={'username': 'LiBiGor', 'password': '123456'}  # 创建用户名、密码的表单数据
# 发送登录请求
response_1 = s.post('http://site.XXXX.com:8001/index/checklogin.html',data=data)
response_2 = s.get('http://site.XXXX.com:8001')   # 发送登录后页面请求
print('登录信息:',response_1.text)                # 打印登录信息
print('登录后页面信息如下:\n',response_2.text)    # 打印登录后的页面信息

3.4 验证请求页面

3.4.1 验证请求简述

在查看文章时,会突然弹出要求登陆账号密码的情况,防止恶意爬取。


requests模块自带了验证功能,只需要在请求方法中填写auth参数,该参数的值是一个带有验证参数(用户名与密码)的HTTPBasicAuth对象。

3.4.2 代码实现:requests模块解决验证请求

import requests          # 导入requests模块
from requests.auth import HTTPBasicAuth  # 导入HTTPBasicAuth类url = 'http://sck.XXX.com:8001/spider/auth/'  # 定义请求地址
ah = HTTPBasicAuth( 'LiBiGor', '123456')     #创建HTTPBasicAuth对象,参数为用户名与密码
response = requests.get(url=url,auth=ah) # 发送网络请求
if response.status_code==200:            # 如果请求成功print(response.text)                 # 打印验证后的HTML代码

3.5 网络超时与异常

在访问一个网页时,如果该网页长时间未响应,系统就会判断该网页超时,所以无法打开网页。

3.5.1 代码实现:requests模块模拟超时异常

import requests     # 导入网络请求模块
# 循环发送请求50次
for a in range(0, 50):try:    # 捕获异常# 设置超时为0.5秒response = requests.get('https://www.baidu999.com/', timeout=0.1)print(response.status_code)            # 打印状态码except Exception as e:                     # 捕获异常print('异常'+str(e))                   # 打印异常信息

3.5.2 代码实现:requests模块判断网络异常

import requests  # 导入网络请求模块
# 导入requests.exceptions模块中的三种异常类
from requests.exceptions import ReadTimeout,HTTPError,RequestException
# 循环发送请求50次
for a in range(0, 50):try:    # 捕获异常# 设置超时为0.1秒response = requests.get('https://www.baidu999.com/', timeout=0.1)print(response.status_code) # 打印状态码except ReadTimeout:       # 超时异常print('timeout')except HTTPError:         # HTTP异常print('httperror')except RequestException:  # 请求异常print('reqerror')

3.6 上传文件

3.6.1 上传图片文件

使用requests模块实现向服务器上传文件也是非常简单的,只需要指定post()函数中的files参数可以指定一个BufferedReader对象,该对象可以使用内置的open()函数返回。

3.6.2 代码实现:requests模块上传图片文件

import requests                   # 导入网络请求模块
bd = open('百度logo.png','rb')     # 读取指定文件
file = {'file':bd}                 # 定义需要上传的图片文件
# 发送上传文件的网络请求
response = requests.post('http://httpbin.org/post',files = file)
print(response.text)               # 打印响应结果

3.7 设置IP代理

在爬取网页的过程中,IP被爬取网站的服务器所屏蔽经常导致失败。此时代理服务可以解决这一麻烦。设置代理时,首先需要找到代理地址,
例如,1788.176.38对应的端口号为3000,完整的格式为117.88.176.38:3000

3.7.1  代码实现:requests模块设置IP代理

import requests      # 导入网络请求模块
# 头部信息
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ''AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/72.0.3626.121 Safari/537.36'}
proxy = {'http': 'http://117.88.176.38:3000','https': 'https://117.88.176.38:3000'}  # 设置代理ip与对应的端口号
try:# 对需要爬取的网页发送请求response = requests.get('http://baidu.com', headers= headers,proxies=proxy,verify=False,timeout=3)print(response.status_code)  # 打印响应状态码
except Exception as e:print('错误异常信息为:',e)    # 打印异常信息


 

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

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

相关文章

201521123044 《Java程序设计》第01周学习总结

1.本章学习总结 你对于本章知识的学习总结 1.了解了Java的发展史。 2.学习了什么是JVM,区分JRE与JDK,下载JDK。 3.从C语言的.c 到C的 .cpp再到Java的.java&#xff0c;每种语言编译程序各有不同&#xff0c;却有相似之处。 2. 书面作业 **Q1.为什么java程序可以跨平台运行&…

爬虫实战学习笔记_7 【实战】模拟下载页面视频(模板)

import requests # 导入requests模块 import re # 导入re模块 import os # 导入系统os模块# 实现发送网络请求&#xff0c;返回响应结果 def send_request(url,headers):response requests.get(urlurl,headersheaders) # 发送网络请求if response.st…

create_proc_read_entry中函数的说名

原型 &#xff1a;struct proc_dir_entry *create_proc_read_entry (const char *name, mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void *data);说明 &#xff1a;name : 要创建的文件名&#xff1b;mode : 文件掩码&#xff0c;为 0 则按照系统默认…

将一个java工程导入到myeclipse应该注意的地方

[原文]http://www.cnblogs.com/ht2411/articles/5471130.html 1. 最好新建一个myeclipse工程&#xff0c;然后从从文件系统导入该工程文件。 原因&#xff1a;很多项目可能是eclipse创建的&#xff0c;或者myeclipse的版本不一致&#xff0c;这样可能导致很多奇怪的现象&#x…

【Pytorch神经网络理论篇】 25 基于谱域图神经网络GNN:基础知识+GNN功能+矩阵基础+图卷积神经网络+拉普拉斯矩阵

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

strace调试(Linux Device Driver)

strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界&#xff0c;进程不能直接访问硬件设备&#xff0c;当进程需要访问硬件设备(比如读取磁盘文件&#xff0c;接收网络数据等等)时&#xff0c;必须由用户态模式切换至内核态模式&#xff0c;通 过系统调用访问硬…

【Pytorch神经网络基础理论篇】 07 线性回归 + 基础优化算法

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

浅谈命令查询职责分离(CQRS)模式

在常用的三层架构中&#xff0c;通常都是通过数据访问层来修改或者查询数据&#xff0c;一般修改和查询使用的是相同的实体。在一些业务逻辑简单的系统中可能没有什么问题&#xff0c;但是随着系统逻辑变得复杂&#xff0c;用户增多&#xff0c;这种设计就会出现一些性能问题。…

Linux shell sed awk

&#xff11;、我们的平台编译kernel的时候总是要输入项目名称&#xff0c;很麻烦 ################################################ ## Compile kernel and pack it into boot.img ## ################################################ #!/bin/shPROJECT$1 echo $PROJEC…

【Pytorch神经网络实战案例】20 基于Cora数据集实现图卷积神经网络论文分类

1 案例说明&#xff08;图卷积神经网络&#xff09; CORA数据集里面含有每一篇论文的关键词以及分类信息&#xff0c;同时还有论文间互相引用的信息。搭建AI模型&#xff0c;对数据集中的论文信息进行分析&#xff0c;根据已有论文的分类特征&#xff0c;从而预测出未知分类的…

mybatis基础学习3---特殊sql语句(备忘)

1&#xff1a; 2&#xff1a; 3:resultMap的用法 转载于:https://www.cnblogs.com/kaiwen/p/6486283.html

使用gdb

1、gdb调试 gdb 对于看系统内部是非常有用. 在这个级别精通调试器的使用要求对 gdb 命令有信心, 需要理解目标平台的汇编代码, 以及对应源码和优化的汇编码的能力. LINUX DEVICE DRIVERS,3RD EDITION 调试器必须把内核作为一个应用程序来调用. 除了指定内核映象的文件名之外…

【Pytorch神经网络实战案例】21 基于Cora数据集实现Multi_Sample Dropout图卷积网络模型的论文分类

Multi-sample Dropout是Dropout的一个变种方法&#xff0c;该方法比普通Dropout的泛化能力更好&#xff0c;同时又可以缩短模型的训练时间。XMuli-sampleDropout还可以降低训练集和验证集的错误率和损失&#xff0c;参见的论文编号为arXⅳ:1905.09788,2019 1 实例说明 本例就…

linux自旋锁

1、为什么要有自旋锁 我们写驱动代码的时候,往往忽略这一点,然后版本发布后会经常遇到一些异常的问题,资源的竞争相当重要,很容易出现空指针 引用: if (!dptr->data[s_pos]) { dptr->data[s_pos] = kmalloc(quantum, GFP_KERNEL); if (!dptr->data[s_pos])…

java基础-public/private/protected的具体区别

在说明这四个关键字之前&#xff0c;我想就class之间的关系做一个简单的定义&#xff0c;对于继承自己的class&#xff0c;base class可以认为他们都是自己的子女&#xff0c;而对于和自己一个目录下的classes&#xff0c;认为都是自己的朋友。 1、public&#xff1a;publi…

【Pytorch神经网络理论篇】 26 基于空间域的图卷积GCNs(ConvGNNs):定点域+谱域+图卷积的操作步骤

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

Linux设备驱动之mmap设备操作

1.mmap系统调用 void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); 功能&#xff1a;负责把文件内容映射到进程的虚拟地址空间&#xff0c;通过对这段内存的读取和修改来实现对文件的读取和修改&#xff0c;而不需要再调用read和write&#xff…

hadoop安装以及Java API操作hdfs

因为工作需求&#xff0c;需要我这边实现一个大文件上传到HDFS的功能&#xff0c;因为本机无法连接公司内网的集群&#xff0c;无奈只好自己动手搭建一个单节点的Hadoop来满足工作的需求。下面简单介绍下安装过程中遇到的坑我的机器是阿里云的最低配 安装文件&#xff1a;hadoo…

【Pytorch神经网络理论篇】 27 图神经网络DGL库:简介+安装+卸载+数据集+PYG库+NetWorkx库

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

给ubuntuGedit安装gedit-source-code-browser

插件链接下载 https://bugs.launchpad.net/ubuntu/source/gedit-source-code-browser-plugin/bug/1242126 下载这个安装完后还用不了&#xff0c;还要添加下面的补丁 diff -Naur old-plugins/sourcecodebrowser/ctags.py plugins/sourcecodebrowser/ctags.py --- old-plugin…