一个小白的网安学习之路之Python入门八:Python的网络请求模块(urllib,Requests)

网络请求模块

urllib模块讲解

urllib.request

  • urllib 库 是 Python 内置的 HTTP 请求库。
urllib.request是什么
  • 常用的方法

    • urllib.request.urlopen(“网址”/“请求对象”) 作用 :向网站发起一个请求并获取响应。 urlopen()不支持重构User-Agent
    • urllib.request.Request(“网址”,headers=“字典”) ,该方法返回一个请求对象
urllib.request.urlopen(“网址”/“请求对象”)实例一(不重构请求头)
  • 不重构请求头可以访问部分未进行反爬的网站,如下

    import urllib.request
    # urllib 是一个内置库   不用我们通过pip工具进行安装 进行导入就行
    
    # 第一步 目标url
    url = "http://www.baidu.com"
    
    # 第二步 发起请求
    response = urllib.request.urlopen(url)  # ctrl+鼠标左键或者ctrl+B,可进入该函数,查看该函数的说明
    """Open the URL url, which can be either a string or a Request object
    参数我们不仅可以传入一个网址 也可以传入一个对象
    which 是什么从句  定位从句
    either ... or ...  要么 要么
    """
    print(response)  # HTTPResponse object 响应对象
    
    # 第三步 获取响应
    # html = response.read()  # 获取字节流
    # print(html)
    html = response.read().decode('utf-8')  # 获取字符串
    print(html)
    
    
    print(response.getcode())  # 返回HTTP的响应码
    print(response.geturl())   # 返回实际数据的URL
    
urllib.request.urlopen(“网址”/“请求对象”)实例二(重构请求头)
  • 如豆瓣网站具有反爬功能,必须重构请求头才能进行爬取,那么则可以利用urllib.request.Request(“网址”,headers=“字典”)方法,通过它返回的请求对象,作为urllib.request.urlopen(“网址”/“请求对象”)的参数。一共也是三步。

    import urllib.request
    # urllib.request.Request()
    # 创建请求对象并构建User-Agent
    
    # 目标url
    url = "https://www.douban.com/"
    
    # 请求头 字典的形式 左右两边没有空格
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
    }
    
    # 第一步 创建请求对象并构建User-Agent
    req = urllib.request.Request(url, headers=headers)
    print(req)  # <urllib.request.Request object at 0x000001FF91613FD0> 请求对象
    
    # 第二步 获取响应对象  urlopen
    """我们依然是用urlopen()方法来发送这个请求,只不过这次urlopen()方法的参数不再是一个URL,
    而是一个Request请求对象,通过构造这个请求头 
    一方面我们可以将请求独立成一个对象,另一方面可配置参数更加丰富和灵活。"""
    response = urllib.request.urlopen(req)
    
    # 第三步 读取响应对象的内容  read().decode("utf-8")
    html = response.read().decode("utf-8")
    print(html)
    
    print(response.getcode())#返回HTTP状态码
    print(response.geturl())#返回实际数据的url
    
  • 以上三个步骤代码可以浓缩成一行代码

    html = urllib.request.urlopen("http://www.baidu.com").read().decode('utf-8')
    print(html)
    

urllib.parse模块详解

以百度搜索海贼王为例

右键检查 -> 选择network -> 过滤Doc静态资源文件 -> 选择preview(查看预览是否与当前页面一致,没有图片的原因是图片不存在doc中而是在image包中) -> response(响应体即网络源代码) -> headers(查看请求头,可以把"wd=海贼王"后半部分参数删了)-> 重复发送请求(查看size,如果size在删除参数后骤然变小,则可以推测某部分是参数负责了加密) -> 接着看headers -> url很长,其实就是由"https://www.baidu.com/s?"和payload中的参数构成的

url中出现中文的处理方法
  • 解决方案: 把中文处理成%+十六进制的样式

    import urllib.request
    import urllib.parse
    
    url1 = "https://www.baidu.com/s?wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B"
    url2 = "https://www.baidu.com/s?wd=海贼王"
    url3 = "https://www.baidu.com/s?wd=python"
    
    req = urllib.request.urlopen(url1)#分别输入url1、url2、url3,发现url2报错
    print(req)  # UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-12: ordinal not in range(128)
    
方法一:使用urlencode(字典) 推荐
  • # 第一种方法
    '''
    urlencode
    传入参数类型:字典
    功能:将存入的字典参数编码为URL查询字符串,即转换成以key1=value1&key2=value2的形式
    导入:from urllib.parse import urlencode
    '''
    r = {"wd": "海贼王"} #字典
    result = urllib.parse.urlencode(r)  # 对r进行解码
    print(result)
    f_url = "https://www.baidu.com/s?" + result
    print(f_url)
    
方法二:使用quote(字符串)
  • # 第二种方法
    '''
    url单个字符串编码用quote()函数
    '''
    r = "海贼王" #字符串
    result = urllib.parse.quote(r)
    print(result)
    f_url = "https://www.baidu.com/s?wd=" + result
    print(f_url)
    
urllib保存图片

百度搜索某类型图片,点开某图片 -> 此时浏览器网址栏的url是图片的下载地址吗?答:不是,下载是由另外的url构成的。 -> 鼠标右键检查 -> element -> 点击图片,会自动展示出图片的下载地址。或者右键图片,选择复制图片地址。

使用urlretrieve方法
  • """
    urlretrieve方法
    参数说明:
    url:外部或者本地url
    filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);
    reporthook:是一个回调函数,我们可以利用这个回调函数来显示当前的下载进度。
    data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename,headers),filename表示保存到本地的路径,header表示服务器的响应头。
    """
    
    from urllib.request import urlretrieve
    url = "https://nimg.ws.126.net/?url=https://dingyue.ws.126.net/2021/0705/cd49fbabj00qvqyrd002bc000hs012hc.jpg&thumbnail=650x2147483647&quality=80&type=jpg"
    urlretrieve(url=url, filename="girl1.png")
    
使用requests 方法下载图片
  • import requests
    url = "https://nimg.ws.126.net/?url=https://dingyue.ws.126.net/2021/0705/cd49fbabj00qvqyrd002bc000hs012hc.jpg&thumbnail=650x2147483647&quality=80&type=jpg"
    response = requests.get(url)
    print(response,type(response)) #response是一个请求对象
    with open("girl2.jpg", mode="wb")as f: #使用字节流写入
        f.write(response.content) #response.content获得的是下载内容的二进制内容
    
使用requests 方法下载视频

抖音网页 -> 点击检查 -> network -> 清空 -> 选择media -> 刷新 -> 选择下方name列表中的一个 -> header中的url -> 通过直接访问该url判断其是否为视频地址

  • # 下载视频
    url = 'https://v26-web.douyinvod.com/bf3e12c1875411fd7d0e1351b8777d34/65255b4a/video/tos/cn/tos-cn-ve-15c001-alinc2/o4h8oABAgL9D4JfDXbCAeQnCluicEndpHpDgAA/?a=6383&ch=5&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=534&bt=534&cs=2&ds=3&ft=bvTKJbQQqU-mfJ4ZPo0OW_EklpPiXOUY7FVJEZ8W2cbPD-I&mime_type=video_mp4&qs=15&rc=NmhnNzw7ZjplOGQ1MzQ0NEBpMzs1MzM6Zmo6bjMzNGkzM0AyXjAwMTAyXmIxYDExNGJgYSNhLTVkcjRvMWNgLS1kLTBzcw%3D%3D&btag=e00008000&dy_q=1696943408&l=202310102110073115065F872CC224E1CE'
    response = requests.get(url)
    with open("girl.mp4", mode="wb")as f:
        f.write(response.content)
    

Requests模块讲解

Requests简介

  • Requests是用Python语言编写,基于 urllib的开源协议的第三方 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。

requests模块的安装

  • 换源安装《Python第一个爬虫程序中讲过》

  • 这里讲一下换源安装

    注意:建议不要进行永久换源安装,因为有些不全

    pip install requests
    # 若出现下载超时,换源即可
    
    # 示例
    pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple/
    
    # 阿里云 http://mirrors.aliyun.com/pypi/simple/
    # 豆瓣http://pypi.douban.com/simple/
    # 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
    # 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
    # 华中科技大学http://pypi.hustunique.com/
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值