关键词搜索

源码搜索 ×
×

Python爬虫学习:使用urllib(request)

发布2019-04-09浏览689次

详情内容

1. 前言

在Python2中,有urllib和urllib2两个库来实现请求的发送。而在python3中,已经不存在urllib2这个库了,统一为urllib。
urllib是Python内置的HTTP请求库,也就是说不需要额外安装即可使用,它一共包含四个模块:

request:它是最基本的HTTP请求模块,可以用来模拟发送请求。就像在浏览器输入网址,然后回车一样,只需要给库方法传入URL以及额外的参数,就可以实现这个过程

error:异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作以保证程序不会意外终止

parse:一个工具模块,提供了许多URL处理方法,比如拆分、解析、合并等

robotparser:主要用来识别网站的robots.txt文件,然后判断哪些网站可以爬,哪些网站不可以爬

2. 发送请求

我们使用urllib的request模块,可以方便地实现请求的发送并得到响应

  1. urlopen()
urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False)
    import urllib.request
    url = 'http://www.baidu.com'
    response = urllib.request.urlopen(url)
    print(response.read().decode('utf-8'))
    
      3
    • 4
    print(type(response)) # <class 'http.client.HTTPResponse'>
    
    • 1

    它返回的是一个HTTPResponse类型的对象,主要包含read()、getheader(name)、getheaders()等方法,以及version、reason、closed等属性

    得到这个对象之后,我们可以把它赋值为response变量,然后就可以调用这些方法和属性,从而得到一系列信息了

    import urllib.request
    url = 'http://www.baidu.com'
    response = urllib.request.urlopen(url)
    print(response.status)#200
    print(response.getheaders())
    print(response.getheader('Connection'))#close
    
      3
    • 4
    • 5
    • 6

    data参数:这个参数是可选的,如果传递了这个参数,则它的请求方式就不再是GET方式,而是POST方式,这个data参数的值必须符合这个application/x-www-form-urlencoded的格式,可以使用urllib.parse.urlencode()将字符串转换为这个格式

    import urllib.request
    import urllib.parse
    import json
    # 浏览器请求的网址
    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
    content=input("请输入需要翻译的内容:")
    data={}
    data['i']=content
    data['from']='AUTO'
    data['to']='AUTO'
    data['smartresult']='dict'
    data['client']='fanyideskweb'
    data['doctype']='json'
    # 使用urllib.parse.urlencode()转换字符串
    data = urllib.parse.urlencode(data).encode('utf-8')
    response = urllib.request.urlopen(url,data)
    html = response.read().decode('utf-8')
    target = json.loads(html)
    print("翻译结果:%s"% (target['translateResult'][0][0]['tgt']))
    
      3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    timeout参数:用于设置超时时间,单位为秒,意思就是如果请求超出了设置的这个时间,还没有得到响应,就会抛出异常,如果不指定该参数,就会使用全局默认时间

    import urllib.request
    url = 'http://www.baidu.com'
    try:
        response = urllib.request.urlopen(url,timeout=1)
        print(response.read().decode('utf-8'))
    except:
        print("Time out")
    
      3
    • 4
    • 5
    • 6
    • 7

    这里我们设置超时时间来控制一个网页如果长时间未响应,就跳过它的抓取

    1. Request
      利用urlopen()方法可以实现最基本请求的发起,但这几个简单的参数不再是URL,而是一个Request类型的对象
    class urllib.request.Request(url, data=None, headers={},
                     origin_req_host=None, unverifiable=False,
                     method=None)
    #url:用于请求URL,这是必传参数,其他都是可选参数
    #data:表示是否为POST方式
    #headers:是一个字典,请求头,可以对其修改,来伪装浏览器
    #origin_req_host:指请求方的host名称或者IP地址
    #unverifiable:表示这个请求时无法验证的,默认是FALSE,意思就是没有足够权限来选择接受这个请求的结果
    #method:表示请求的方法
    
      3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    可参考

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载