• 【Python3 爬虫】02_利用urllib.urlopen向百度翻译发送数据并返回结果


    上一节进行了网页的简单抓取,接下来我们详细的了解一下两个重要的参数url与data

    urlopen详解

    urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None

    URL参数

    Open the URL url, which can be either a string or a Request object.

    大概意思:URL参数不仅可以是一个字符串也可以是一个对象

    data参数

    data may be a bytes object specifying additional data to send to the server, or None if no such data is needed. data may also be an iterable object and in that case Content-Length value must be specified in the headers. Currently HTTP requests are the only ones that use data; the HTTP request will be a POST instead of a GET when the data parameter is provided. data should be a buffer in the standard application/x-www-form-urlencoded format. The urllib.parse.urlencode() function takes a mapping or sequence of 2-tuples and returns a string in this format. urllib.request module uses HTTP/1.1 and includes Connection:close header in its HTTP requests.

    大概意思:如果没有设置urlopen()函数的data参数,HTTP请求采用GET方式,也就是我们从服务器获取信息,如果我们设置data参数,HTTP请求采用POST方式,也就是我们向服务器传递数据。data参数有自己的格式,它是一个基于application/x-www.form-urlencoded的格式, 因为我们可以使用urllib.parse.urlencode()函数将字符串自动转换成上面所说的格式。

    对象作为urlopen参数

    urlopen返回的对象不仅可以使用read()进行读取,同时也可以使用geturl(),info(),getcode()方法

    • geturl()返回的是一个url的字符串;

    • info()返回的是一些meta标记的元信息,包括一些服务器的信息;

    • getcode()返回的是HTTP的状态码,如果返回200表示请求成功。

    # -*- coding:UTF-8 -*-
    
    from urllib import request
    
    if __name__ == '__main__':
    	req = request.Request("http://cn.bing.com/translator?ref=MSTToolbar")
    	response = request.urlopen(req)
    	#geturl
    	print("geturl打印信息:%s"%(response.geturl()))
    	print('***************************************')
    	#info
    	print("info打印信息:%s"%(response.info()))
    	print('***************************************')
    
    	#getcode
    	print("getcode打印信息:%s"%(response.getcode()))
    

    打印结果:

    image

    发送data示例

    下面是一个向百度翻译传输数据并返回结果的例子:

    # -*- coding:UTF-8 -*-
    
    from urllib import request,parse
    import json
    if __name__ == '__main__':
    	#对应上图的url
    	Request_URL = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.baidu.com/link'
    
    	#创建字典
    	Form_Data = {}
    	Form_Data[type] = 'AUTO'
    	Form_Data['i'] = 'My name is Alice'
    	Form_Data['doctype'] = 'json'
    	Form_Data['xmlVersion'] = '1.8'
    	Form_Data['keyform'] = 'fanyi.web'
    	Form_Data['ue'] = 'ue:utf-8'
    	Form_Data['action'] = 'FY_BY_CLICKBUTTON'
    
        #使用urlcode转换后的标准格式
    	data = parse.urlencode(Form_Data).encode("utf-8")
    
    	response = request.urlopen(Request_URL,data)
    
    	html = response.read().decode("utf-8")
    
    	translate_results = json.loads(html)
    
    	translate_results = translate_results['translateResult'][0][0]['tgt']
    
    	print(translate_results)

    执行结果如下:

    image

  • 相关阅读:
    Web开发细节搜集
    excel设置单元格为文本
    网页QQ唤起
    .net提高文章
    代码重构学习
    js的undefined怎么判断
    微软.net一些类的源码
    FineMessBox的js依赖导致错误Uncaught ReferenceError: addEvent is not defined
    [译转]深入理解LayoutInflater.inflate()
    java 和 Android Base64加密
  • 原文地址:https://www.cnblogs.com/OliverQin/p/8625076.html
Copyright © 2020-2023  润新知