urllib.request的基本使用

一.urllib.request六个方法的基本使用

# urllib请求库的一些基本方法
import urllib.request

url = 'https://pic.netbian.com/'

# 模拟浏览器向服务器发起请求

response = urllib.request.urlopen(url=url)

print(type(response))  # HTTPResponse

# 六个方法

# 1.read() 按照一个字节,一个字节的方式读取网页数据源码
content = response.read().decode('gbk')
print(content)

# 2.读取一行
# content = response.readline()
# print(content)

# content = response.readlines()
# print(content)

# 3.返回状态码信息
# print(response.getcode())


# 4.geturl() 获取请求的url
# print(response.geturl())

# 5.getheaders() 获取到响应头的状态信息
# print(response.getheaders())

# 6.urlretrive() 下载图片与视频
# urllib.request.urlretrieve(下载地址,存放位置)

        1.对url发起请求之前要使用urllib.request.Request()来对url请求对象定制

                

import urllib.request

url = 'http://www.baidu.com'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47'
}
request = urllib.request.Request(url=url,headers=headers)

使用之前我们要安装一下urlllib这个请求库===>>在cmd输入pip install urllib3就可以了

安装之后在pycharm中导入urllib.request模块

注意:.当所访问的url携带参数时在请求对象定制的时候需要使用urllib.parse库来进行16进制编码,当然此处也分为get和post请求的两种请求方式

get请求参数
一个参数
        https://movie.douban.com/j/chart/top_list?name=猫猫
        urllib.parse.quote('猫猫')  ==> %E5%91%A8%E6%9D%B0%E4%BC%A6


多个参数
        https://movie.douban.com/j/chart/top_list?start=0&limit=20
        params={
             'start':0,
            "limit":20
        }
        urllib.parseurlencode(params)   ==>start=0&limit=20

post请求参数
https://movie.douban.com/j/chart/top_list   post请求(kw:spider)
携带参数到定制的请求对象中
data = {
    'kw': 'sider'
}
data = urllib.parse.urlencode(data).encode('utf-8')

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

总结:  get请求url带有参数时不需要在请求对象定制时传入,只需要编码后与url头拼接即可

# 处理参数
name = urllib.parse.quote('周杰伦')
print(name)  # %E5%91%A8%E6%9D%B0%E4%BC%A6

# url的拼接
url = url + name  # https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6
request = urllib.request.Request(url=url, headers=headers)

下面一个小案例分享给大家帮助大家理解,可能有不妥之处,还望大家多多指教,共同进步!

import urllib.request
import re
import os

# https://pic.netbian.com/4kmeinv/index.html  1
# https://pic.netbian.com/4kmeinv/index_1.html 
# https://pic.netbian.com/4kmeinv/index_2.html 2
# https://pic.netbian.com/4kmeinv/index_3.html 3
# https://pic.netbian.com/4kmeinv/index_4.html 4

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 持久化存储 (下载 )
if not os.path.exists('./彼岸图网'):
    os.mkdir('./彼岸图网')

for i in range(1, 59):
    if i == 1:
        url = 'https://pic.netbian.com/4kmeinv/'
    else:
        url = f'https://pic.netbian.com/4kmeinv/index_{str(i)}.html'
        # 请求对象定制
    request = urllib.request.Request(url=url, headers=headers)

    # 获取网页数据源码
    response = urllib.request.urlopen(request)

    # 网页数据
    content = response.read().decode('gbk')

    # print(content)

    # 数据解析 (re) 分析数据结构
    pattern = '.*?'  # 链接
    namePattern = '(.*?)'  # 标题

    # re.findall
    img_list = re.compile(pattern, re.S).findall(content)
    name_list = re.compile(namePattern, re.S).findall(content)
    # print(img_list)
    # print(name_list)

    # 创建一个结果数组 , 为了以后保存到其他的地方 [{},{},{}]
    results = []
    for index in range(len(name_list)):
        item = {}
        item['src'] = 'https://pic.netbian.com' + img_list[index]  # 图片链接
        item['name'] = name_list[index]  # 图片名字
        item['suffix'] = item['src'].split('.')[-1]  # 后缀
        results.append(item)

    print(results)

    # 下载图片
    for item in results:
        urllib.request.urlretrieve(url=item['src'], filename='./彼岸图网/' + item['name'] + '.' + item['suffix'])
        print(f'{item["name"]}--抓取完成!')
    print(f'************************第{i}页抓取完成!************************')

你可能感兴趣的:(爬虫,python)