学科分类
目录
网络爬虫

构造Request对象

当我们使用urlopen方法发送一个请求时,如果希望执行更为复杂的操作,比如增加HTTP报头,则必须创建一个Request对象来作为urlopen方法的参数。接下来,同样以百度首页为例,为大家演示如果使用Request对象来爬取数据,示例代码如下:

import urllib.request
# 将url作为Request方法的参数,构造并返回一个Request对象
request = urllib.request.Request('http://www.baidu.com')
# 将Request对象作为urlopen方法的参数,发送给服务器并接收响应
response = urllib.request.urlopen(request)
# 使用read方法读取获取到的网页内容
html = response.read().decode('UTF-8')
# 打印网页内容
print(html)

上述代码的运行结果和前面是完全一样的,只不过代码中间多了一个Request对象。在使用urllib库发送URL的时候,我们推荐大家使用构造Request对象的方式。因为在发送请求时,除了必须设置的url参数外,还可能会加入很多内容,例如下面的参数:

  • data:默认为空,该参数表示提交表单数据,同时HTTP请求方法将从默认的GET方式改为POST方式。

  • headers:默认为空,该参数是一个字典类型,包含了需要发送的HTTP报头的键值对。

接下来也是一个构造Request对象的案例,该案例在构造Request对象时传入data和headers参数,具体代码如下:

import urllib.request
import urllib.parse
url = 'http://www.itcast.cn'
header = {
     "User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT6.1;  
     Trident/5.0)", "Host":"httpbin.org"
}
dict_demo = {"name": "itcast"}
data = bytes(urllib.parse.urlencode(dict_demo).encode('utf-8'))
# 将url作为Request方法的参数,构造并返回一个Request对象
request = urllib.request.Request(url, data=data, headers=header)
# 将Request对象作为urlopen方法的参数,发送给服务器并接收响应
response = urllib.request.urlopen(request)
# 使用read方法读取获取到的网页内容
html = response.read().decode('UTF-8')
# 打印网页内容
print(html)

上述案例可以实现传智播客官网首页的爬取。通过构造Request对象的方式,服务器会根据发送的请求,返回对应的响应内容,这种做法在逻辑上也是非常清晰明确的。

点击此处
隐藏目录