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

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'))
print(type(response)) # <class 'http.client.HTTPResponse'>

它返回的是一个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

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']))

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")

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

  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:表示请求的方法

可参考

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值