urllib库的使用

目录

1、urllib的使用

2、一个类型和六个方法

 2.1、一个类型

 2.2、六个方法

 2.3、下载图像、视频

3、请求对象的定制

 3.1、编解码

  3.1.1、get请求方式

  3.1.2、Post请求方式

 3.2、ajax请求

  3.2.1、ajax的get请求

  3.2.2、ajax的post请求

 3.3、cookie登录

4、使用代理

 4.1、handler代理

 4.2、handler代理IP地址修改

 4.3、代理池


1、urllib的使用

 urllib.request.urlopen() 模拟浏览器向服务器发送请求:

 1)定义需要访问的url地址

 2)模拟浏览器向服务器发送请求

 3)获取响应的页面源码

# 使用urllib获取百度首页源码
import urllib.request

# 1、定义一个url 需要访问的地址
url = 'http://www.baidu.com'

# 2、模拟浏览器向服务器发送请求 response就是响应
response = urllib.request.urlopen(url)

# 3、获取响应中的页面源码
# read方法 返回的是字节形式的二进制数据 -> 需要转换为字符串
# 解码:二进制->字符串 decode('编码的格式')
content = response.read().decode('utf-8')

# 4、打印数据
print(content)

2、一个类型和六个方法

 2.1、一个类型

  1)代码:

# 使用urllib获取百度首页源码
import urllib.request

# 1、定义一个url 需要访问的地址
url = 'http://www.baidu.com'

# 2、模拟浏览器向服务器发送请求 response就是响应
response = urllib.request.urlopen(url)

# 一个类型和六个方法
print(type(response))

  2)输出:

  3)response的数据类型是HttpResponse:

  • 字节‐‐>字符串 解码decode
  • 字符串‐‐>字节 编码encode

 2.2、六个方法

  1. read() 字节形式读取二进制 扩展:rede(5)返回前几个字节
  2.  readline() 只能 读取一行

  3. readlines() 一行一行读取 直至结束

  4. getcode() 获取状态码 (判断书写逻辑是否正确,返回200表示正常)

  5. geturl() 获取url地址

  6. getheaders() 获取header 

# 使用urllib获取百度首页源码
import urllib.request

# 1、定义一个url 需要访问的地址
url = 'http://www.baidu.com'

# 2、模拟浏览器向服务器发送请求 response就是响应
response = urllib.request.urlopen(url)

# 按照一个字节一个字节的方式进行读取
content = response.read()

# 返回5个字节
content = response.read(5)

# 读取一行数据
content = response.readline()

# 按照一行一行的方式进行读取
content = response.readlines()

# 返回状态码 如果是200证明没有错
print(response.getcode())

# 返回url地址
print(response.geturl())

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

 2.3、下载图像、视频

import urllib.request

# 下载网页
url_page = 'http://www.baidu.com'

# url代表的是下载的路径 filename文件的名字
urllib.request.urlretrieve(url_page, 'baidu.html')

# 下载图片
url_img = 'https://img0.baidu.com/it/u=1309359181,3567527426&fm=253&fmt=auto&app=138&f=JPEG?w=281&h=499'

urllib.request.urlretrieve(url_img, 'lisa.jpg')

# 下载视频
url_video = 'https://vd3.bdstatic.com/mda-kjtx64epufgk8zw5/sc/cae_h264_nowatermark/1604104149/mda-kjtx64epufgk8zw5.mp4?v_from_s=hkapp-haokan-hnb&auth_key=1659543870-0-0-4dd2d6b9e96b8193a5e2ec3a86177452&bcevod_channel=searchbox_feed&pd=1&cd=0&pt=3&logid=3270589526&vid=6647036806223333961&abtest=103747_2-103890_2&klogid=3270589526'

urllib.request.urlretrieve(url_video, 'lisa.mp4')

3、请求对象的定制

UA介绍:User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统 及版本、CPU 类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言、浏览器插件等

UA反爬虫:在进行爬虫时候,程序模仿浏览器操作,但是反爬虫机制在响应爬虫请求时候需要进行UA识别,这时候就需要将UA参数传进我们的爬虫程序中

import urllib.request
 
url = 'https://www.baidu.com'
 
# url的组成
# https://www.baidu.com/s?wd=周杰伦
 
# http/https    www.baidu.com   80/443     s      wd = 周杰伦     #
#    协议             主机        端口号     路径     参数           锚点
# http   80
# https  443
# mysql  3306
# oracle 1521
# redis  6379
# mongodb 27017
 
headers = {
    'User-Agent': ''
}
 
# 因为urlopen方法中不能存储字典 所以headers不能传递进去
# 请求对象的定制
request = urllib.request.Request(url=url,headers=headers)
 
response = urllib.request.urlopen(request)
 
content = response.read().decode('utf8')
 
print(content)

 3.1、编解码

  3.1.1、get请求方式

  1)urllib.parse.quote():quote方法能够将汉字转换成unicode编码的格式,适用于单个参数

import urllib.request

url = 'https://cn.bing.com/search?q='

# 模拟浏览器访问——解决ua反爬
headers = {
    'User-Agent': ''
}

# 将周杰伦三个字变成unicode编码
# 我们需要依赖于urllib.parse
name = urllib.parse.quote('猪猪侠')

url = url + name

# 请求对象的定制
request = urllib.request.Request(url=url, headers=headers)
# 模拟浏览器向服务器发送消息
response = urllib.request.urlopen(request)
content = response.read().decode('utf8')

# 打印数据
print(content)

  2)urllib.parse.urlencode():urlencode方法也可以将汉字转换成unicode编码,适用于多个参数

# urlencode的应用场景:多个参数的时候
import urllib.request

base_url = 'https://cn.bing.com/search?'

data = {
    'q': '周杰伦',
    'sex': '男',
    'location': '中国台湾省'
}

new_data = urllib.parse.urlencode(data)

url = base_url + new_data

headers = {
    'User-Agent': ''
}

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

response = urllib.request.urlopen(request)

context = response.read().decode('utf-8')

print(context)

  3.1.2、Post请求方式

 post请求方式与get请求方式区别

1)get请求方式的参数必须编码:

        参数是拼接到url后面编码之后,不需要调用encode方法

                url = base_url + new_data

                new_data = urllib.parse.urlencode(data)

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

2)post请求方式的参数必须编码:

        参数是放在请求对象定制的方法中,编码之后需要调用encode方法:

                url = 'https://fanyi.baidu.com/sug'

                data = urllib.parse.urlencode(data).encode('utf8')

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

         

import urllib.request

url = 'https://fanyi.baidu.com/sug'

headers = {
    'User-Agent': ''
}

data = {
    'kw': 'spider'
}

# post请求方式的参数,必须要进行编码 data = urllib.parse.urlencode(data).encode('utf8') 编码之后必须调用encode方法
# post请求方式的参数,不会拼接在url后,而是放在请求对象定制的参数中
data = urllib.parse.urlencode(data).encode('utf8')

# post参数放在请求对象定制的方法中
request = urllib.request.Request(url=url, data=data, headers=headers)

response = urllib.request.urlopen(request)

context = response.read().decode('utf8')

print(context)

 3.2、ajax请求

  3.2.1、ajax的get请求

  1)获取豆瓣电影第一页

# get请求
# 获取豆瓣电影的第一页数据 并且保存起来

import urllib.request

url = "https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action="

headers = {
    'User-Agent': ''
}

# 请求对象的定制
request = urllib.request.Request(url=url, headers=headers)

# 获取响应的数据
response = urllib.request.urlopen(request)
content = response.read().decode('utf8')

# 数据下载到本地(open方法默认为gdk版本,如果需要保存汉字,需要设置编码为utf8)
fp = open('douban.json', 'w', encoding='utf8')
fp.write(content)

  2)获取豆瓣电影前十页

# https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20
# https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=100&limit=20

import urllib.parse
import urllib.request


def create_request(page):
    base_url = "https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action="

    data = {
        'start': (page - 1) * 20,
        'limit': '20'
    }

    data = urllib.parse.urlencode(data)

    url = base_url + data

    headers = {
        'User-Agent': ''
    }

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

    return request


def get_content(request):
    reponse = urllib.request.urlopen(request)
    content = reponse.read().decode('utf8')
    return content


def down_load(page, content):
    with open('douban' + str(page) + '.json', 'w', encoding='utf8') as fp:
        fp.write(content)


if __name__ == '__main__':
    start_page = int(input('请输入起始的页码'))
    end_page = int(input('请输入结束的页码'))

    for page in range(start_page, end_page):
        # 请求对象定制
        request = create_request(page)
        # 获取响应的数据
        content = get_content(request)
        # 下载
        down_load(page, content)

  3.2.2、ajax的post请求

import urllib.request
import urllib.parse


def create_request(page):
    base_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'

    data = {
        'cname': '北京',
        'pid': '',
        'pageIndex': page,
        'pageSize': '10'
    }

    data = urllib.parse.urlencode(data).encode('utf8')

    headers = {
        'User-Agent': ''
    }

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

    return request


def get_content(request):
    reponse = urllib.request.urlopen(request)
    content = reponse.read().decode('utf8')
    return content


def down_load(page, content):
    with open('kfc' + str(page) + '.json', 'w', encoding='utf8') as fp:
        fp.write(content)


if __name__ == '__main__':
    start_page = int(input('请输入起始页码'))
    end_page = int(input('请输入结束页码'))

    for page in range(start_page, end_page + 1):
        # 请求对象的定制
        request = create_request(page)

        # 获取网页源码
        content = get_content(request)

        # 下载
        down_load(page, content)

 3.3、cookie登录

cookie中携带者个人登录信息,如果有登录之后的cookie,那么我们可以携带者cookie进入到任何页面

# 适用的场景:在数据采集的时候,需要绕过登录,直接采集数据
# 个人信息页面是utf8,但是还是报编码错误,因为并没有进入个人信息页面,而是跳转到了登陆页面
# 那么登录页面不是utf8,所以报错
# 请求头信息不够,所以访问不成功
import urllib.request

url = 'https://weibo.com/u/3554714072'

# 模拟浏览器访问——解决ua反爬
headers = {
    # :authority: weibo.com
    # :method: GET
    # :path: /
    # :scheme: https
    'accept': '',
    # 可能会导致编码错误
    # 'accept-encoding': '',
    'accept-language': '',
    'cache-control': '',
    'client-version': '',
    'cookie': '',
    # referer 判断当前路径是不是由上一个路径进来,一般情况下,做图片防盗链
    'referer': '',
    'sec-ch-ua': '',
    'sec-ch-ua-mobile': '',
    'sec-ch-ua-platform': '',
    'sec-fetch-dest': '',
    'sec-fetch-mode': '',
    'sec-fetch-site': '',
    'sec-fetch-user': '',
    'upgrade-insecure-requests': '',
    'user - agent': ''
}

# 因为urlopen方法中不能存储字典,所以headers不能传递进去
# 请求对象的定制(因为参数顺序的问题,不能直接写url和headers)
request = urllib.request.Request(url=url, headers=headers)

response = urllib.request.urlopen(request)

content = response.read().decode('utf8')

with open('weibo.html', 'w', encoding='utf8') as fp:
    fp.write(content)

4、使用代理

 4.1、handler代理

import urllib.request

url = 'http://www.baidu.com/'

headers = {
    'User-Agent': ''
}

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

# 获取handler对象
handler = urllib.request.HTTPHandler()

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

# 调用open方法
response = build_opener.open(request)

content = response.read().decode('utf8')

print(content)

 4.2、handler代理IP地址修改

import urllib.request

url = 'http://www.baidu.com/s?wd=ip'

headers = {
    'Accept': '',
    'Accept-Language': '',
    'Cache-Control': '',
    'Connection': '',
    'Cookie': '',
    'Host': '',
    'sec-ch-ua': '',
    'sec-ch-ua-mobile': '',
    'sec-ch-ua-platform': '',
    'Sec-Fetch-Dest': '',
    'Sec-Fetch-Mode': '',
    'Sec-Fetch-Site': '',
    'Sec-Fetch-User': '',
    'Upgrade-Insecure-Requests': '',
    'User-Agent': ''
}

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

# response = urllib.request.urlopen(request)
proxise = {
    'http': ''
}

handler = urllib.request.ProxyHandler(proxies=proxise)
opener = urllib.request.build_opener(handler)
response = opener.open(request)

context = response.read().decode('utf8')

with open('daili.html', 'w', encoding='utf8') as fp:
    fp.write(context)

 4.3、代理池

import urllib.request

url = 'http://www.baidu.com/s?wd=ip'

headers = {
    'Accept': '',
    'Accept-Language': '',
    'Cache-Control': '',
    'Connection': '',
    'Cookie': '',
    'Host': '',
    'sec-ch-ua': '',
    'sec-ch-ua-mobile': '',
    'sec-ch-ua-platform': '',
    'Sec-Fetch-Dest': '',
    'Sec-Fetch-Mode': '',
    'Sec-Fetch-Site': '',
    'Sec-Fetch-User': '',
    'Upgrade-Insecure-Requests': '',
    'User-Agent': ''
}


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

# response = urllib.request.urlopen(request)
proxise_pool = [
    {'http': ''},
    {'http': ''},
]

import random
proxies = random.choice(proxise_pool)
handler = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)

context = response.read().decode('utf8')

with open('daili.html', 'w', encoding='utf8') as fp:
    fp.write(context)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值