Python爬虫学习(一):urllib常用方法

本文详细介绍了Python中的urllib库,包括常用的request方法、Request对象的构造、URL的解析(urlparse,urlsplit,urljoin)、URL编码与解码(urlencode,parse_qs,parse_qsl)以及如何使用RobotFileParser处理robots.txt协议。
摘要由CSDN通过智能技术生成

如下代码中是urllib库中常用的方法及对应的使用说明:

from urllib import request, error
from urllib.parse import urlparse, urlsplit, urljoin, urlencode, parse_qs, parse_qsl, quote, unquote
from urllib.robotparser import RobotFileParser

if __name__ == "__main__":
    """
        timeout:设置超时时间,超过时间会报错
       :return:
       """
    # response = request.urlopen('https://baijiahao.baidu.com/s?id=1795283943822250715&wfr=spider&for=pc',
    #                            timeout=1)
    '''
    也可以通过Request对象的方式去构建
    def __init__(self, url, data=None, headers={},
                 origin_req_host=None, unverifiable=False,
                 method=None):
    url 用于请求 URL,这是必传参数,其他都是可选参数。 url='https://baijiahao.baidu.com/s?id=1795283943822250715&wfr=spider&for=pc'
    data 
    headers 是一个字典,它就是请求头,既可以通过 headers 参数直接构造,也可以通过调用请求实例的 add_header() 方法添加 
        headers = {
                'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
                'Host': 'httpbin.org'
            }
    origin_req_host 请求方的主机或者IP地址
    unverifiable 代表请求是否是可以被验证的 默认为false
    method 是一个字符串,用来指示请求使用的方法,比如 GET、POST 和 PUT 等 method = POST
    '''
    try:
        request1 = request.Request(url='https://baijiahao.baidu.com/s?id=1795283943822250715&wfr=spider&for=pc')
        response = request.urlopen(request1)
    # error 可以用来处理异常
    except error.URLError as e:
        print(e.reason)

    # 读取文档并进行解码
    print(response.read().decode('utf-8'))
    # 获取头信息
    print(response.getheaders())
    # 获取访问的URl
    print(response.geturl())
    # 获取code状态码
    print(response.getcode())

    """
    urlparse进行数据解析,结果如下:拆解结果为以下六个部分
        ParseResult(scheme='https', netloc='baijiahao.baidu.com', path='/s', params='', query='id=1795283943822250715&wfr=spider&for=pc', fragment='')
        scheme 代表的是协议
        netloc 代表的是域名
        path 代表的是访问路径
        params 代表的是参数
        query 代表的是查询条件
        fragment 代表的是
        
        allow_fragments=False 参数是是否会忽略allow_fragments 默认是true
    """
    parse = urlparse('https://baijiahao.baidu.com/s?id=1795283943822250715&wfr=spider&for=pc', allow_fragments=False)
    print(parse)

    """
    二者结果对比,urlsplit不会解析params
        ParseResult(scheme='https', netloc='baijiahao.baidu.com', path='/s', params='', query='id=1795283943822250715&wfr=spider&for=pc', fragment='')
        SplitResult(scheme='https', netloc='baijiahao.baidu.com', path='/s', query='id=1795283943822250715&wfr=spider&for=pc', fragment='')
    """
    split = urlsplit('https://baijiahao.baidu.com/s?id=1795283943822250715&wfr=spider&for=pc', allow_fragments=False)
    print(split)

    """
    可以对url进行拼接
        https://baijiahao.baidu.com/s?id=1795283943822250715&wfr=spider&for=pc
    """
    joinurl = urljoin('https://baijiahao.baidu.com', '/s?id=1795283943822250715&wfr=spider&for=pc')
    print(joinurl)

    """
    urlencode 将字典或者由键值对组成的序列转换为URL编码的字符串,这个字符串可以用于GET请求的查询字符串或者POST请求的数据。
        www.baidu.com?name=%E5%BC%A0%E4%B8%89&age=18
    """
    params = {
        'name': '张三',
        'age': 18
    }
    baseurl = 'www.baidu.com?'
    url = baseurl + urlencode(params)
    print(url)

    """
    parse_qs 将URL编码的字符串转换为字典
        {'name': ['张三'], 'age': ['18']}
    """
    urlqs = 'name=%E5%BC%A0%E4%B8%89&age=18'
    print(parse_qs(urlqs))

    """
    parse_qsl 将URL编码的字符串转换为元组
        [('name', '张三'), ('age', '18')]
    """
    urlqs = 'name=%E5%BC%A0%E4%B8%89&age=18'
    print(parse_qsl(urlqs))

    """
    quote 将内容转化为 URL 编码的格式
    %E5%BC%A0%E4%B8%89
    unquote 解码
    张三
    """
    print(quote('张三'))
    print(unquote('%E5%BC%A0%E4%B8%89'))

    """
    robotparser 用来解析robot协议
    
    """
    r = RobotFileParser()
    r.set_url("https://www.baidu.com/robots.txt")
    # 读取并解析指定的url  该方法不会返回结果,但对文件进行了读取操作,这一步必须调用,如果不调用,则接下来的判断均为False;
    r.read()
    # 判断是否可以抓取内容
    print(r.can_fetch('Baiduspider', 'https://www.baidu.com'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值