请求模块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中的25个隐藏特性
Mar 30 Python
Python常见格式化字符串方法小结【百分号与format方法】
Sep 18 Python
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
python 保存float类型的小数的位数方法
Oct 17 Python
python实现顺时针打印矩阵
Mar 02 Python
Python matplotlib学习笔记之坐标轴范围
Jun 28 Python
Django ORM 自定义 char 类型字段解析
Aug 09 Python
python argparser的具体使用
Nov 10 Python
Python图像处理库PIL的ImageFont模块使用介绍
Feb 26 Python
Python PyQt5整理介绍
Apr 01 Python
Python实现列表拼接和去重的三种方式
Jul 02 Python
Python 视频画质增强
Apr 28 Python
用Python仅20行代码编写一个简单的端口扫描器
Python实现视频自动打码的示例代码
Apr 08 #Python
Python OpenCV实现图形检测示例详解
Python语法学习之进程的创建与常用方法详解
基于PyQt5制作一个群发邮件工具
Python&Matlab实现樱花的绘制
Python OpenCV形态学运算示例详解
You might like
php smtp实现发送邮件功能
2017/06/22 PHP
详解PHP swoole process的使用方法
2017/08/26 PHP
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
AngularJS中$interval的用法详解
2016/02/02 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
2016/08/02 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
Vue router传递参数并解决刷新页面参数丢失问题
2020/12/02 Vue.js
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
python模块导入的细节详解
2018/12/10 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
Django--权限Permissions的例子
2019/08/28 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
CSS3 透明色 RGBA使用介绍
2013/08/06 HTML / CSS
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
怎样在程序里获得一个空指针
2015/01/24 面试题
新员工欢迎词
2014/01/12 职场文书
大学生素质拓展活动方案
2014/02/11 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
国庆节演讲稿范文2014
2014/09/19 职场文书
2014年后勤工作总结
2014/11/18 职场文书
团结主题班会
2015/08/13 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android
青岛市的收音机研制与生产
2022/04/07 无线电