您的位置:首页 > 电脑安全 > 黑客漏洞 > python爬虫之请求模块urllib的基本使用

python爬虫之请求模块urllib的基本使用

2022-04-08 15:05:08 来源:易采站长站 作者:

python爬虫之请求模块urllib的基本使用

目录
前言urllib的子模块HttpResponse常用方法与属性获取信息urlli.parse的使用(一般用于处理带中文的url)✅爬取baidu官网HTML源代码✅添加请求头信息(重构user_agent)????扩展知识????????with open和open两者的区别????总结

前言

????在实现网络爬虫的爬取工作时,就必须使用网络请求,只有进行了网络请求才可以对响应结果中的数据进行提取,urllib模块是python自带的网络请求模块,无需安装,导入即可使用。下面将介绍如果使用python中的urllib模块实现网络请求????

urllib的子模块

模块描述
urllib.request用于实现基本HTTP请求的模块
urllib.error异常处理模块,如果在发送网络请求的过程时出现错误,可以捕获异常进行有效处理
urllib.parse用于解析URL的模块
urllib.robotparser用于解析robots.txt文件,判断网站是否可以爬取信息

HttpResponse常用方法与属性获取信息

通过urllib.request() 获取的对象类型是HttpReponse,有以下几种常用的方法,示例如下:

import urllib.request
# 定义一个url(你要爬取的网址)
url = 'https://www.baidu.com'
# 添加请求头信息
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
# 创建Request对象
res = urllib.request.Request(url=url, headers=headers)
# 模拟浏览器向服务器发送网络请求
response = urllib.request.urlopen(res)
# read()函数可以获取响应,但返回的响应格式是二进制的,需要解码
# 解码:decode('编码格式') 编码格式在Response Headers,Content_Type里面查看
print('baidu官网HTML\n', response.read().decode('utf-8'))

# HTTPResponse这个类型
# 常见方法:read、readline、readlines、getcode、status、geturl、getheaders、getheader
# print(type(response)) # response是HTTPResponse的类型

# (1) 按照一个字节一个字节去读
content = response.read()
print(content)

# 读取具体的n个字节,在read()函数中传参即可
content2 = response.read(5)
print(content2)

# (2) 按行读取,但是只能读取一行
content3 = response.readline()
print(content3)

# (3) 按行读取,并且读取所有行
content4 = response.readlines()
print(content4)

# (4) 返回状态码的方法:200状态码没有问题,其他的状态码可能有问题
print('响应状态码为', response.getcode())
print('响应状态码为', response.status)

# (5) 返回访问的目标的url地址
print('响应访问的url地址为', response.geturl())

# (6) 获取的是响应头所有信息
print('响应头所有信息为', response.getheaders())

# (7)获取响应头指定信息
print('响应头指定信息为', response.getheader('Content-Type'))

urlli.parse的使用(一般用于处理带中文的url)

????使用urllib模块向一个携带中文字样的url发送请求时 ,会报错:‘ascii’ codec can’t encode characters in position 10-11: ordinal not in range(128)????

字典格式的处理方式

步骤

(1)导入request和parse模块

(2)添加请求头header(重构ua)反反爬第一步

(3)使用urllib.parse方法处理url中的中文字样(使用字典存储要处理的内容,经过parse处理返回正常的url地址)

(4)使用+拼接固定的url地址和经过处理后的url地址

(5)创建请求对象

(6)使用urlopen()模拟浏览器像服务器发送网络请求

(7)打印获取响应对象里面的内容,并进行decode解码

import urllib.parse  # 导入parse解析模块
import urllib.request  # 导入request模块

url = 'https://www.baidu.com/s?wd=酷我'
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
# 通过urllib.parse处理url中的中文字样--> 得到可以通过urllib发送请求的url地址
# 字典格式的处理方式
org = {'wd': '酷我'}
# 经过处理之后返回wd=%E9%85%B7%E6%88%9
result = urllib.parse.urlencode(org)
# 使用+拼接固定的url地址和经过处理的url地址
# https://www.baidu.com/s?wd=%E9%85%B7%E6%88%91
new_url = 'https://www.baidu.com/s?' + result

# 1、构造请求对象
res = urllib.request.Request(new_url, headers=header)
# 2、发送请求 获取响应
response = urllib.request.urlopen(res)
# 3、获取响应对象里面的内容(获取网页源码)
print(response.read().decode('utf-8'))

字符串格式的处理方式

步骤

(1)导入request和parse模块

(2)添加请求头header(重构ua)反反爬第一步

(3)使用urllib.parse.quote方法处理url中的中文字样(用一个变量存储酷我字样,使用parse.quote处理即可返回酷我经过处理的url地址)

(4)使用+拼接固定的url地址(需要加上wd=)和经过处理后的url地址(酷我字样处理后的url地址)

(5)创建请求对象

(6)使用urlopen()模拟浏览器像服务器发送网络请求

(7)打印获取响应对象里面的内容,并进行decode解码

import urllib.request
import urllib.parse

header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
# 第二种 字符串格式的处理方式
string_org = '酷我'
# %E9%85%B7%E6%88%91
string_result = urllib.parse.quote(string_org)

# 使用+拼接固定的url地址(需要加上wd=)和经过处理后的url地址
new_string_url = 'https://www.baidu.com/s?wd=' + string_result

# 1、构造请求对象
res = urllib.request.Request(new_string_url, headers=header)
# 2、发送请求 获取响应
response = urllib.request.urlopen(res)
# 3、获取响应对象里面的内容,并进行decode解码
print(response.read().decode('utf-8'))

简单了解web前端

HTTP基本原理

HTTP(HpperText Transfer Protocol),即超文本传输协议,是互联网上应用广泛的一种网络协议。HTTP是利用TCP在Web服务器和客户端之间传输信息的协议,客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。

HTTP协议常用的请求方法

方法描述
GET请求指定的页面信息,并返回响应内容
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。POST请求可能会导致新的资源的建立、或已有资源的修改
GEAD类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报文头部信息
PUT从客户端像服务器传送的数据取代指定的文档内容
DELEAE请求服务器删除指定内容
OPTIONS允许客户端查看服务器性能

HTML状态码及其含义

代码含义
 信息,请求收到,继续处理
2**成功,行为被成功地接受、理解和采纳
3**重定向,为了完成请求必须进一步执行的动作
4**客户端错误,请求包含语法错误或者请求无法实现
5**服务器错误,服务器不能实现一种明显无效的请求

浏览器中的请求与响应

????最好使用谷歌浏览器????

使用谷歌浏览器访问baidu官网,查看请求和响应的具体步骤如下:

1在谷歌浏览器输入网址进入baidu官网

2按下F12键(或单击鼠标右键选择”检查“选项),审查页面元素

3单击谷歌浏览器调试工具中“Network”选项,按下F5 键(或手动刷新页面),单击调试工具中的“Name”栏目下的网址,查看请求与响应信息。

Genral

Geral概述关键信息如下:

Request URL:请求的URL网址,也就是服务器的URL网址

Request Method:请求方式为GET

Status Code:状态码为200,即成功返回响应。

Remote Address :服务器IP地址是39.156.66.14:443,端口号是443

✅http的端口号是80,https的端口号是443✅

Request Headers请求头

Response Headers响应头

✅爬取baidu官网HTML源代码✅

添加请求头信息(重构user_agent)

User-Agent(简称UA),记录了操作系统的信息和浏览器的信息

以www.baidu.com为例演示

当不重构ua时,直接访问网址,只会返回baidu的部分源码,因为baidu识别出来我们是爬虫

这时就需要重构ua,伪装自己是浏览器发起请求

查看浏览器ua的方法 按F12键打开Network,在request headers里面就可以看到浏览器的ua.

创建Request对象

创建具有请求头信息的Request对象,然后使用urlopen()方法向“baidu”地址发送一个GET请求,利用字典添加请求头信息最常用的用法就是修改User-Agent来伪装浏览器,例如
headers = {“user-agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36”
}表示伪装成谷歌浏览器进行网络请求,可以获取baidu的全部源代码

import urllib.request

# 请求对象的定制:为了解决反爬虫的第一种手段
url = 'https://www.baidu.com'
# 用户代理:UA
header = {
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
# urlopen()方法中不能传参字典,因而用户代理UA不能作为传参传入
# 此时需要定制一个请求对象:
# 如果request = urllib.request.Request(url,headers) 写会报错
request = urllib.request.Request(url, headers=header)
response = urllib.request.urlopen(request)
print('baidu官网HTML\n', response.read().decode('utf-8'))

????扩展知识????

1.使用with open 和 open保存图片

import requests  # 导入requests模块

# 找到目标图片的url地址
url = 'https://c-ssl.duitang.com/uploads/blog/202107/26/20210726111411_b4057.jpg'
img_name = 'code.png'
res = requests.get(url)
# 保存图片,音频之类的,会使用wb ————>以二进制方式写入
with open(img_name, 'wb') as file_obj:
    # 保存图片,音频之类的,会使用content去响应对象里面取
    file_obj.write(res.content)
import requests  # 导入requests模块

url = 'https://c-ssl.duitang.com/uploads/blog/202008/12/20200812094028_qzhsq.jpg'
img_name = 'code2.png'
# 向目标网址发送网络请求并赋给一个变量
res = requests.get(url)
# file_obj是一个文件对象
file_obj = open(img_name, 'wb')
file_obj.write(res.content)
# 用open写入需要关闭
file_obj.close()

????with open和open两者的区别????

with open会自动关闭,open则不会

2.使用urillib.request.urlretrieve() 函数保存图片

import urllib.request  # 导入request模块

# 找到目标图片的url地址
url = 'https://c-ssl.duitang.com/uploads/item/201912/20/20191220140202_sbpjp.jpg'
# 给图片命名
img_name = 'code3.png'
# 使用urllib.request.urlretrieve
urllib.request.urlretrieve(url, img_name)

????扩展????使用路径保存图片

from urllib import request  # 导入request模块

url = 'https://c-ssl.duitang.com/uploads/blog/202102/14/20210214203011_1336a.jpeg'
# 传入要保存的文件路径(可copy path查看)  加r防止转意
file_name = r'D:\web spider\request\code4.png'
request.urlretrieve(url, file_name)

????两种导入方式????

import urllib.request(使用时需要urllib.request)

from urllib import request(使用时直接request即可)

总结

到此这篇关于python爬虫之请求模块urllib基本使用的文章就介绍到这了,更多相关python请求模块urllib使用内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!

如有侵权,请联系QQ:279390809 电话:15144810328

相关文章

  • 拯救者y9000x对比y7000p哪个更值得买

    拯救者y9000x对比y7000p哪个更值得买

    大家都知道,11月30日晚上,联想在其直播晚会上面发布了两款全新的电竞笔记本电脑,其中一款就是拯救者y9000x,随着新鲜血液的加入,让用户开心的同时也不知道该如何挑选适合自己的笔记本,今天小编就为大家带来拯救者y9000x和y7000p对比,感兴趣的朋友不要错过了。1、拯救者y9000x和y7000p参数对比2、拯救者y9000x和y7000p哪个好?Y7000p因为其电竞屏的配置,是一款典型的
    2020-12-03
  • 骁龙870对比骁龙865plus哪个好

    骁龙870对比骁龙865plus哪个好

    大家都知道,骁龙870 5G移动平台已经正式发布了,骁龙870更像是对骁龙865的一次终极优化升级,那么骁龙870性能究竟怎么样?骁龙870和骁龙865plus相比哪个性能更好?小编为大家带来关于骁龙870和骁龙865plus的详细对比,感兴趣的朋友不要错过了。1、主要参数对比2、CPU骁龙870采用了“1+3+4”八核架构,一个A77超大核最高频率可达3.2GHz。骁龙8
    2021-01-20
  • 如何判断显卡性能高低 显卡性能主要看哪些参数

    如何判断显卡性能高低 显卡性能主要看哪些参数

      很多小伙伴想要自己配置一台电脑,到挑选显卡的时候,不知道通过哪些显卡参数来判断一块显卡的性能好坏。为此,小编特意整理了本篇教程,帮助大家了解我们主要通过看显卡的哪几个参数,来得知显卡的性能强弱。如何判断显卡性能高低?显卡性能主要看哪些参数?  第一,流处理器,这个数量越多越好,数量多它的出图速度就越快,这个在显卡参数里面,有的标为流处理器数量,有的是标为CUDA核心数量。  第二,显卡核心频率
    2021-03-23
  • 显卡1060和1050ti怎么选 显卡1060和1050ti区别对比

    显卡1060和1050ti怎么选 显卡1060和1050ti区别对比

      显卡是电脑的重要组成部分之一,因此显卡的选择是非常重要的。有些朋友喜欢装gtx1060,而有些朋友就会喜欢装gtx1050ti。这两个显卡有什么区别呢?下面小编就给大家讲讲显卡1060和1050ti的区别有哪些。  显卡1060和1050ti区别对比:  为了比较直观的了解gtx1060与gtx1050ti显卡的区别,以图片的形式罗列出两者的参数。  1、GTX1060的性能比GTX1050T
    2021-03-24
  • 前端从浏览器的渲染到性能优化

    前端从浏览器的渲染到性能优化

    问题前瞻1. 为什么css需要放在头部?2. js为什么要放在body后面?3. 图片的加载和渲染会阻塞页面DOM构建吗?4. dom解析完才出现页面吗?5. 首屏时间根据什么来判定?浏览器渲染1.浏览器渲染图解浏览器渲染页面主要经历了下面的步骤:1.处理 HTML 标记并构建 DOM 树。2.处理 CSS 标记并构建 CSSOM 树。3.将 DOM 与 CSSOM 合并成一个渲染树。4.根据渲染
    2021-05-17
  • 详解Spring工厂特性

    详解Spring工厂特性

    一、饿汉式创建优势工厂创建之后,会将Spring配置文件中的所有对象都创建完成(饿汉式)。提高程序运行效率。避免多次IO,减少对象创建时间。(概念接近连接池,一次性创建好,使用时直接获取)二、生命周期方法 自定义初始化方法:添加“init-method”属性,Spring则会在创建对象之后,调用此方法。 自定义销毁方法:添加“destroy-method”属性,Spring则会在销毁对
    2021-05-19
  • Python基础之元组与文件知识总结

    Python基础之元组与文件知识总结

    大纲Python文件类型及汇总一、元组1 特征1.任意对象的有序集合2.通过下标访问3.不可变4.长度固定,任意类型,任意嵌套>>> t = (1,2,3,4,5)>>> t[0] = 2Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not
    2021-05-19
  • 华为MateView GT值得入手吗 华为MateView GT详细评测

    华为MateView GT值得入手吗 华为MateView GT详细评测

    5月19日华为召开新品发布会,正式进军显示器领域,并带来华为MateView和华为MateView GT两款产品,一款直面,一款曲面。华为此时进入显示器领域和当前消费者对于显示要求以及多屏办公娱乐的需求分不开,尤其是在越来也注重效率的当下,显示器早已不再是台式机的专属,很多笔记本用户也会在本身屏幕之外选择一款显示器作为第二块屏幕,从而实现更高效的办公、学习和娱乐。华为MateView GT详细评测
    2021-05-20