2024年python爬虫urllib模块详解

  • urllib.robotparser:用于解析robots.txt文件,判断是否可以爬取网站信息。

2.发送请求:urlopen()方法

========================================================================================

urloprn() 方法由urllib.request模块提供,以实现基本的http请求,并接受服务器端返回的响应数据。

urlopen()语法:

urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)

  • url:访问网站的完整url地址

  • data:默认为None,表示请求方式为get请求;如果需要实现post请求,需要字典形式的数据作为参数。

  • timeout:设置超时,单位为秒。

  • cafile,capath:指定一组HTTPS请求信任的CA证书,cafile指包含单个证书的CA文件,capath指定证书文件的目录。

  • cadefault:CA证书的默认值。

  • context:描述SSL选项的 的实例。


3. 发送GET请求

=================================================================================

代码示例

import urllib.request # 导入request子模块

url = ‘https://www.python.org/’

response = urllib.request.urlopen(url=url) # 发送网络请求

print(‘响应数据类型为:’, type(response))

print(‘响应状态码为:’, response.status)

print(‘响应状态码为:’, response.getcode())

print(‘响应头所有信息为:’, response.getheaders())

print(‘响应头指定信息为:’, response.getheader(‘Accept-Ranges’))

读取HTML代码并进行utf-8解码

print(‘Python官网HTML代码如下:\n’, response.read().decode(‘utf-8’))

输出结果如下(部分):

在这里插入图片描述

  • response是一个<class ‘http.client.HTTPResponse’>对象;

  • 响应状态码也称响应码,也称状态码,可以通过status属性查看,也可以通过getcode()方法查看。

  • getheaders()用于查看响应头所有信息

  • getheader()中传入参数,用于查看响应头的指定信息。

  • 关于请求头&响应头

当你使用http(https)协议请求一个网站的时候,你的浏览器会向对方的服务器发送一个http请求,这个请求同样包含三个部分

  1. 请求方法 请求路径(URL) 请求协议版本

例:GET https://www.google.com.hk/ HTTP/1.1

  1. 报文主体

  2. (POST/GET)参数

当你向对方发送请求后,对方会回应你浏览器的请求,返回两个部分:响应头Body

Body就是返回给你的主体,比如说请求网站返回的html

响应头讯息里包含了服务器的响应讯息,如http版本,压缩方式,响应文件类型,文件编码等


4.发送post请求

================================================================================

即在上边基础上,在urlopen()函数中写入data参数。详情参考链接:python爬虫post访问案例-有道翻译

  • post请求会携带一些form表单数据,这个需要复制过来以字典形式写入。

表单数据在网页上点击F12后,在Fetch/XHR一栏中的Payload中获取。

以爬取有道翻译,翻译“你好”为例,此时的表单数据如下:

i: 你好

from: AUTO

to: AUTO

smartresult: dict

client: fanyideskweb

salt: 16417380413821

sign: 6545acd2d928b39eb5bead9349a2d4ff

lts: 1641738041382

bv: fdac15c78f51b91dabd0a15d9a1b10f5

doctype: json

version: 2.1

keyfrom: fanyi.web

action: FY_BY_REALTlME

代码示例如下:

import urllib.request

import urllib.parse

import json

要进行输入内容

key = input(“请输入内容:”)

data = {

“i”: key,

“from”: “AUTO”,

“to”: “AUTO”,

“smartresult”: “dict”,

“client”: “fanyideskweb”,

“salt”: “16374132986488”,

“sign”: “dfd139af546a8cd63de0676f446ca2ee”,

“lts”: “1637413298648”,

“bv”: “03a6a27012b22bc3c7ecc76381772182”,

“doctype”: “json”,

“version”: “2.1”,

“keyfrom”: “fanyi.web”,

“action”: “FY_BY_REALTlME”,

}

字节流,如果输入中文,需要处理的

data = urllib.parse.urlencode(data) # 转为十六进制形式

data = bytes(data, encoding=‘utf8’) # 转为字节流

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’

}

目标url发请求

{“errorCode”:50} ,把_o

url = ‘https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule’

构建请求对象

req = urllib.request.Request(url, data=data, headers=headers)

发请求,获取响应对象

res = urllib.request.urlopen(req)

print(res.getcode()) # 得到响应码,200表示请求成功

html = res.read().decode(‘utf-8’)

print(type(html)) # <class ‘str’>,得到的是json数据

json数据转字典

dic = json.loads(html)

result = dic[“translateResult”] # [[{‘src’: ‘你好’, ‘tgt’: ‘hello’}]]

print(result[0][0][‘tgt’])

在这里插入图片描述

另一个简单的示例:

import urllib.request # 导入urllib.request模块

import urllib.parse # 导入urllib.parse模块

url = ‘https://www.httpbin.org/post’ # post请求测试地址

将表单数据转换为bytes类型,并设置编码方式为utf-8

print()

data = bytes(urllib.parse.urlencode({‘hello’: ‘python’}), encoding=‘utf-8’)

response = urllib.request.urlopen(url=url, data=data) # 发送网络请求

print(response.read().decode(‘utf-8’)) # 读取HTML代码并进行

在这里插入图片描述


5. 设置网络超时

================================================================================

urlopen()的timeout参数用于设置请求超时,该参数以秒为单位,表示如果在请求时超出了设置的时间还没有得到响应时就会抛出异常。

import urllib.request

url = ‘https://www.python.org/’

response = urllib.request.urlopen(url=url, timeout=0.1) # 设置超时时间为0.1秒

print(response.read().decode(‘utf-8’))

因为0.1秒设置的过快,结果因超时而产生异常,报错。

通常根据网络环境不同,设置一个合理的时间,如2秒,3秒。

对该网络超时异常进行捕捉并处理:

import urllib.request # 导入urllib.request模块

import urllib.error # 导入urllib.error模块

import socket # 导入socket模块

url = ‘https://www.python.org/’ # 请求地址

try:

发送网络请求,设置超时时间为0.1秒

response = urllib.request.urlopen(url=url, timeout=0.1)

print(response.read().decode(‘utf-8’)) # 读取HTML代码并进行utf-8解码

except urllib.error.URLError as error: # 处理异常

if isinstance(error.reason, socket.timeout): # 判断异常是否为超时异常

print(‘当前任务已超时,即将执行下一任务!’)

在这里插入图片描述


6. 复杂网络请求_urllib.request.Request()

==========================================================================================================

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

参数说明:

  • url:访问网站的完整url地址

  • data:默认为None,表示请求方式为get请求;如果需要实现post请求,需要字典形式的数据作为参数。

  • headers:设置请求头部信息,字典类型。

  • origin_req_host:用于设置请求方的host名称或者IP。

  • unverifiable:用于设置网页是否需要验证,默认值为False。

  • method:用于设置请求方式,如GET,POST。


7.设置请求头

=============================================================================

7.1get请求示例


url = ‘https://www.baidu.com’

定义请求头信息

headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36’}

创建Request对象

r = urllib.request.Request(url=url, headers=headers)

response = urllib.request.urlopen® # 发送网络请求

print(response.read().decode(‘utf-8’)) # 读取HTML代码并进行utf-8解码

在这里插入图片描述

7.2post请求示例


import urllib.request # 导入urllib.request模块

import urllib.parse # 导入urllib.parse模块

url = ‘https://www.httpbin.org/post’ # 请求地址

定义请求头信息

headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36’}

将表单数据转换为bytes类型,并设置编码方式为utf-8

data = bytes(urllib.parse.urlencode({‘hello’: ‘python’}),encoding=‘utf-8’)

创建Request对象

r = urllib.request.Request(url=url,data=data,headers=headers,method=‘POST’)

response = urllib.request.urlopen® # 发送网络请求

print(response.read().decode(‘utf-8’)) # 读取HTML代码并进行utf-8解码

创建出一个Request对象,然后直接调用urlopen()函数。

创建Request也被称为创建请求对象

在这里插入图片描述


8. Cookies的获取与设置

=======================================================================================

Cookies是服务器向客户端返回响应数据时所留下的标记。当客户再次访问服务器时会携带这个标记。一般登录一个页面成功后,会在浏览器的cookie中保留一些信息,再次访问时服务器核对后即可确认当前用户登录过,此时可直接将登录后的数据返回。

import urllib.request

url = “https://www.csdn.net/”

opener = urllib.request.build_opener() # 获取opener对象

resp = opener.open(url)

print(resp.read().decode())

因为urlopen()方法不支持代理、cookie等其他的HTTP/GTTPS高级功能,所以这里不用urlopen()发送请求,而需要创建一个opener对象(这本来是urllib2中的方法)。示例如下。学习过程中这里作为了解即可,建议重点研究/使用requests库。

import urllib.request # 导入urllib.request模块

import http.cookiejar # 导入http.cookiejar子模块

登录后页面的请求地址

url = ‘xxx’

cookie_file = ‘cookie.txt’ # cookie文件

cookie = http.cookiejar.LWPCookieJar() # 创建LWPCookieJar对象

读取cookie文件内容

cookie.load(cookie_file,ignore_expires=True,ignore_discard=True)

生成cookie处理器

handler = urllib.request.HTTPCookieProcessor(cookie)

创建opener对象

opener = urllib.request.build_opener(handler)

response = opener.open(url) # 发送网络请求

print(response.read().decode(‘utf-8’)) # 打印登录后页面的html代码


9.设置代理IP

==============================================================================

import urllib.request # 导入urllib.request模块

url= ‘xxxxxxxxxxxxxxx’

创建代理IP

proxy_handler = urllib.request.ProxyHandler({

‘https’: ‘xxxxxxxxxxxxxxxxx’ # 写入代理IP

})

创建opener对象

opener = urllib.request.build_opener(proxy_handler)

response = opener.open(url,timeout=2)

print(response.read().decode(‘utf-8’))


10.异常处理

=============================================================================

urllib模块中的urllib.error子模块包含了URLError与HTTPError两个比较重要的异常类。

10.1 URLError


URLError类提供了一个reason属性,可以通过这个属性了解错误的原因。示例如下:

import urllib.request # 导入urllib.request模块

import urllib.error # 导入urllib.error模块

try:

向不存在的网络地址发送请求

response = urllib.request.urlopen(‘https://www.python.org/1111111111.html’)

except urllib.error.URLError as error: # 捕获异常信息

print(error.reason) # 打印异常原因

程序运行结果:

在这里插入图片描述

10.2HTTPError


HTTPError类是URLError的子类,主要用于处理HTTP请求所出现的一次。此类有以下三个属性。

  • code :返回HTTP状态码

  • reason 返回错误原因

  • headers 返回请求头

import urllib.request # 导入urllib.request模块

import urllib.error # 导入urllib.error模块

try:

向不存在的网络地址发送请求

response = urllib.request.urlopen(‘https://www.python.org/1111111111.html’)

print(response.status)

except urllib.error.HTTPError as error: # 捕获异常信息

print(‘状态码为:’,error.code) # 打印状态码

print(‘异常信息为:’,error.reason) # 打印异常原因

print(‘请求头信息如下:\n’,error.headers) # 打印请求头

结果如下(部分):

在这里插入图片描述

10.3URLError&HTTPError双重异常捕捉


现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 18
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值