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


Posted in Python onApril 08, 2022

前言

?在实现网络爬虫的爬取工作时,就必须使用网络请求,只有进行了网络请求才可以对响应结果中的数据进行提取,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”栏目下的网址,查看请求与响应信息。

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

Genral

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

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识别出来我们是爬虫

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

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

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

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

创建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使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python下使用Psyco模块优化运行速度
Apr 05 Python
Python3编程实现获取阿里云ECS实例及监控的方法
Aug 18 Python
python 剪切移动文件的实现代码
Aug 02 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
Dec 04 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
python+opencv像素的加减和加权操作的实现
Jul 14 Python
python实现图像拼接
Mar 05 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
Mar 10 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
Apr 02 Python
tensorflow常用函数API介绍
Apr 19 Python
解决pip install psycopg2出错问题
Jul 09 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 Python
用Python仅20行代码编写一个简单的端口扫描器
Python实现视频自动打码的示例代码
Apr 08 #Python
Python OpenCV实现图形检测示例详解
Python语法学习之进程的创建与常用方法详解
基于PyQt5制作一个群发邮件工具
Python&Matlab实现樱花的绘制
Python OpenCV形态学运算示例详解
You might like
dedecms模版制作使用方法
2007/04/03 PHP
php利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
PHP中加密解密函数与DES加密解密实例
2014/10/17 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
PHP二维数组排序简单实现方法
2016/02/14 PHP
Laravel 5.3 学习笔记之 错误&日志
2016/08/28 PHP
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
2016/05/09 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
BootStrap树状图显示功能
2016/11/24 Javascript
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
react-redux中connect()方法详细解析
2017/05/27 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
nodeJS微信分享
2017/12/20 NodeJs
关于layui flow loading占位图的实现方法
2019/09/21 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
JavaScript编码小技巧分享
2020/09/17 Javascript
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
Python实现运行其他程序的四种方式实例分析
2017/08/17 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
python简单实现AES加密和解密
2019/03/28 Python
使用python制作一个解压缩软件
2019/11/13 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
python的setattr函数实例用法
2020/12/16 Python
python math模块的基本使用教程
2021/01/16 Python
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
银行演讲稿范文
2014/01/03 职场文书
2014年机关植树节活动方案
2014/02/27 职场文书
工作经历证明书范文
2014/11/02 职场文书
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS
无线电知识基础入门篇
2022/02/18 无线电