欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

爬虫请求 urllib.request 基础用法

程序员文章站 2022-05-03 21:34:13
...
import urllib.request
import urllib.error
import random
import socket
"""
 1、request 它是最基本的 HTTP 请求模块,我们可以用它来模拟发送一请求,
 就像在浏览器里输入网址然后敲击回车一样,
 只需要给库方法传入 URL 还有额外的参数,就可以模拟实现这个过程了。
"""
#1.1 urlopen
# urllib.request 模块中提供的最基本的HTTP构造方法,利用他可以模拟浏览器的请求发起过程。
# url : 爬取目标的URL;
# data : 请求参数,如果设置该参数,则请求默认为post请求;没有默认为get请求;
# timeout : 用于设置超时时间,单位为秒;
# context : 必须是一个ssl.SSLContext类型,用来指定SSL设置,忽略未认证的CA证书;
def use_urlopen():

    url = "http://www.baidu.com"
    response = urllib.request.urlopen(url=url)
    print(type(response))
    # 类文件对象支持文件对象的操作方法,如read()方法读取文件全部内容,返回字符串
    html = response.read()
    # 打印响应结果(byte类型)
    print(html)
    # 打印响应结果(utf-8类型)
    print(html.decode())
    # 打印状态码
    print(response.status)
    print(response.getcode())
    # 获取响应头
    print(response.getheaders())
    # 获取响应头Server信息
    print(response.getheader('Server'))
    # 获取响应结果原因
    print(response.reason)
def use_urlopen_data():
    url = "http://www.baidu.com"
    # urlopen data 参数
    data={
        'wd':'csdn'
    }
    # 格式化参数
    # 将参数字典转化为字符串
    form_data = urllib.parse.urlencode(data).encode()
    response = urllib.request.urlopen(url=url,data=form_data)
    print(response.read())
def use_urlopen_timeout():
    try:
        url = "http://www.baidu.com"
        response = urllib.request.urlopen(url=url,timeout=0.01)
        print(response.read())
    except urllib.error.URLError as e:
        if isinstance(e.reason,socket.timeout):
            print("TIME OUT 超时")

# 1.2 Requsert
# url : 爬取目标的URL,必选参数
# data 若过是字典,需要用urllib.parse.urlencode(data).encode()进行编码
# headers 用于伪装成浏览器,可以打开浏览器,F12,network,刷新,headers中寻找
# meathod ’POST' 'GET' 等
def use_Requsert():
    url = "http://www.baidu.com"
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
    }
    data = {
        'wd': 'csdn'
    }
    # 格式化参数
    form_data = urllib.parse.urlencode(data).encode()
    # 构建Request类
    req = urllib.request.Request(url=url,data=form_data,headers=headers,method='POST')
    # print(type(req))
    """
    request类Request方法常用的内置方法:
    Request.add_data(data)设置data参数,如果一开始创建的时候没有给data参数,那么可以使用该方法追加data参数;
    Request.get_method() 返回HTTP请求方法,一般返回GET或是POST;
    Request.has_data() 查看是否设置了data参数;
    Request.get_data() 获取data参数的数据;
    Request.add_header(key, val) 添加头部信息,key为头域名,val为域值;
    Request.get_full_url() 获取请求的完整url;
    Request.get_host() 返回请求url的host(主域名);
    Request.set_proxy(host, type) 设置代理,第一个参数是代理ip和端口,第二个参数是代理类型(http/https)。
    """
    response = urllib.request.urlopen(req)
    print(response.read())

# 代理
def use_proxy():
    # 声明定义代理服务器列表
    url = "http://www.baidu.com"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
    }
    data = {
        'wd': 'csdn'
    }
    # 代理可能失效
    # urllib.error.URLError: <urlopen error [WinError 10061] 由于目标计算机积极拒绝,无法连接。>
    # 可以更换新的代理
    proxy_list = [
        {"http": "121.40.108.76:80"},
        {"http": "218.249.45.162:35586"},
        {"http": "218.27.136.169:8085"},
    ]
    # 随机选择一个代理,headers也可进行随机选择
    proxy = random.choice(proxy_list)

    # 使用选择的代理构建代理处理器对象
    http_proxy_handler = urllib.request.ProxyHandler(proxy)

    # 通过 urllib.request.build_opener(),创建自定义opener对象
    opener = urllib.request.build_opener(http_proxy_handler)
    # 格式化参数
    form_data = urllib.parse.urlencode(data).encode()
    # 创建Request对象
    req = urllib.request.Request(url=url,data=form_data, headers=headers)
    # 使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理
    response = opener.open(req)
    print(response.read().decode())

if __name__ == '__main__':
    use_urlopen()
    use_urlopen_data()
    use_urlopen_timeout()
    use_Requsert()
    use_proxy()

参考资料:python3网络爬虫开发实战 崔庆才