ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【Python学习笔记】简单调用百度API应用

2022-01-02 18:30:30  阅读:188  来源: 互联网

标签:__ Entry2 Python request urllib API print root 百度


#本文一切代码及理论均来自于郑秋生、夏敏捷二位老师主编《Python项目案例发 从入门到实践》一书,本人仅做微改。创作本文的目的仅为总结本人的学习过程和成果,借此巩固。可能存在许多疏漏之处,还请各位同道多多批评指正。

        今天学的是调用百度API一个章节,百度大家都熟悉,现如今中国最大的互联网企业之一,坐拥大量曾经的“爆款”,甚至拥有堪称第一代中国现象级软件的“百度贴吧”,创造了无数出圈梗,几乎是一代人的网络记忆。

        当然了,由于各种原因,百度现在的影响力大不如前,曾经的如日中天沦落到如今只剩一句“What's your problem”为人所知。

        那么,在这样的背景下,百度该如何回到曾经的辉煌呢
        

        跟我没啥关系TnT,赚了钱又不给我分红

但是作为一名刚踏入互联网圈的小白,对百度还是挺喜欢的———毕竟百度提供了那么多好用的API~

        今天我们需要借用的就是百度的翻译API来了解Python的一个新库:urllib!

        urllib库是Python最常用的,访问网页用的库,通过这个简约的库,便可以像访问本地文件一般,去访问网页,并抓取、读取和保存网页。怎么个意思呢,就是网页里头的东西,你不用打开网页,费个三五秒简单地敲打几下鼠标,只需要耗费半个多小时敲个几十行代码,测试个几分钟,不到一小时就完事了,是不是特别简便啊!(bushi)

        urllib库和其他的Python库一样,延续了简单易懂的特点,主要的模块和函数都好用好记,主要用于操作URL的模块有以下几款:

urllib.request
#打开和读取URL

urllib.error
#包含urllib.request中包含的错误

urllib.parse
#包含解析URL的诸多方法

urllib.robotparser
#书中原话:用来解析robots.txt文本文件。它提供一个单独的robotfileparser类。通过该类的can—fetch()方法测试爬虫是否可以下载一个页面

        先说  urllib.request  和  urllib.parse  两个大概是常用的模块着手,来对urllib库有一个整体的认识吧!

        想要和一位姑娘搞对象,就要先走近她的灵魂;想要读取一个网站,就要先打开它的大门。那么Python是怎么“接近”一位姑娘的“灵魂”的呢?

        urllib的第一个方法,便是urllib.requset.urlopen(不是openurl啊!!)

        urlopen会返回response对象,response对象的操作拥有多种方法:

read()  close()  readline()
#与文件操作相同

info()
#能够返回远程服务器的头信息

getcode()
#能够返回远程服务器的状态码,就是各位熟知的什么 401 404 等

geturl()
#能够返回网页的url

        具体使用如下:

from urllib import request

if __name__=="__main__":
    response = request.urlopen("http://fanyi.baidu.com")
    html = response.read()
    html = html.decode("uft-8")
    print(read)

        若如此做,我们便可以得到服务器接收到的信息——不是大家看到的解析页面,而是解析前的界面信息,由于内容量过大,大家可以自行试一试,会得到一串长长的Html语句。(就是如<html></html>这种一对一对的语句)

        如果需要下载,可以使用urltrieve()函数

from urllib import request
request.urltrieve(fileurl,filename)

        光走近姑娘的灵魂没有用啊,老话讲叫“潘驴邓小闲” ,现在讲叫“渣男加暖男”,你得慢慢地贴近她,呵护她,靠近她,分享快乐,分担痛苦,你们才能走到一起。

        urllib也是,光打开网站只能是作为学习html的一个辅助,只有进一步操作,才能得到想要的结果。

        网站最重要的,便是HTTP的头信息。HTTP是WEB开发的核心,头信息又是HTTP的核心信息,就仿佛喜欢一位姑娘,你肯定是喜欢她的性格、身材、颜值、才华等,很少有人因为姑娘的脚指甲、膝盖、肘关节或后背而喜欢一位姑娘吧,头信息就是包含了HTTP的颜值、身材、性格、才华的一份“履历说明”,getheader()方法便能够帮助我们获得姑娘的“履历说明”

        在获得头信息以前,应当先获得status和reason两项信息。

        一位姑娘,不是你表白她就会接受你;一个网站,不是你访问他就会允许你。status就是姑娘有没有接受你,reason就是姑娘拒绝你的原因。那么如果被拒绝了呢?那“履历说明”自然就和你无关了~

        具体操作如下:

from urllib import request

r = request.urlopen("http://fanyi.baidu.com")

data = r.reaf()

read = read.decode("utf-8")

print("status:"+r.status+"reason:"+r.reason)

for s, t in r.getheader():
    print("%s:%s"%(s,t)

        这样得到姑娘的“履历说明”后,我们便能够根据自己的目标,去找到姑娘相应的指标。那么,我们怎么从中抽取出某一项指标呢

        还记得上面说的多种方法么,这时候便派上了用途。

#接续上一段代码段
print('geturl反馈信息:',r.geturl())
print('info反馈信息:',r.info())
print('geturl反馈信息:',r.getcode())

         当然了,你不但要看人家姑娘的履历说明,人家姑娘也得看你啊,看你的性格、收入、颜值和工作等信息。这个时候就需要你给人家姑娘发信息。

        根据HTTP标准,get用于信息获取——就是上面我们做的所有事情,就是由姑娘(服务器)到你(客户端);另一个就是post,就是我们提到的给姑娘发信息。就是由你(客户端)到姑娘(服务器);

        当然了,get也可以给姑娘递履历信息,但是有几点不同于post的:

        1.  get就是把自己想说的话信息写在HTTP信息里,post就是把个人信息也写在履历信息里,区别在哪儿呢?这儿埋个小问题,大家很容易可以在网上查到,会比我这里逼逼叨叨大家记得清楚。

        2.  get要求你不能写超过1024个字节;post却无长度上的限制。

        如果希望使用post方法,只需要使用在方法中加入data参数。

 response = request.urlopen(URL,data)

        现在有的女生,被一些网络小说或者网剧教坏了,老想找什么“高富帅”或“霸道总裁”,一般男生不管多优秀,她们都不屑一顾。

        对于这种女生,如果我们要接近,就一定要先给自己坳一个“高富帅”的人设。(当然了,这种女生只是极少数,但是如果真的遇到,我还是推荐各位男同胞一定不能过于沉沦。你是很棒的,你值得更好的!)

        同样的,有的网站也只允许人访问——目的主要是为了防止爬虫(当然了,不止这一个方法防止爬虫,这只是一个底线方法)。那么,Python为了防止网站觉得他不是Python而是人类呢?这时候我们就需要代理来隐藏身份了。

        用户代理一般放在“个人履历”(head)信息中。网站一检查:“你有。行,过去吧”“你没有。你是Python脚本,你不准进!”

        具体的代理,根据版本不同、设备不同和端口不同各有不同,具体使用时还需要各位在网上自行搜索使用,在此不可尽举,也就不便赘述,只挑选其一为列位举个栗子

User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
#Firefox的代理,从中也可以看得出这款Firefox浏览器的具体信息

         至于设置方法,只需要在创建Request对象时,将参数传入header中

from urllib import request
if __name__ == "__main__":
    url = "https://www.csdn.net/"
    head = {}
    #写入信息
    head['User-Agent']='Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13'
    req = request.Request(url,headers=head)
    response = request.urlopen(req)
    html = response.read().decode("utf-8")
    print(html)

        大抵如此。

        这样,我们理论层面的知识就学完了。接下来就可以实践了。

        制作一个小翻译软件,就首先要做一个页面,这里就需要用到tkinter(大家一定要熟悉一下这个图形库)

         

if __name__ == "__main__":
#绘图
    root = Tk()
    root.title("简单单词翻译")
    root['width']=250
    root['height']=130
    Label(root,text='输入要翻译的内容',width=15).place(x=1,y=1)
    Entry1 = Entry(root,width = 20)
    Entry1.place(x=110,y=1)
    Label(root,text='翻译的结果:',width=18).place(x=1,y=20)
    s=StringVar()
    s.set("hi~")
    Entry2 = Entry(root,width=20,textvariable=s)
    Entry2.place(x=110,y=20)
#两个事件按钮
    Button1=Button(root,text='翻译',width=8)
    Button1.place(x=40,y=80)
    Button2 = Button(root, text='清空', width=8)
    Button2.place(x=110, y=80)
    Button1.bind("<Button-1>",leftClick)
    Button2.bind("<Button-1>", leftClick2)
    root.mainloop()

        之后就是对数据的传导(你-->python-->baidu api)

        你-->python

#确认事件按钮
def leftClick(event):
    s.set("")
    Entry2.config(Entry2, text=s)
    print('hi')
    en_str = Entry1.get()
    print(en_str)
    vText = translate_word(en_str)
    Entry2.config(Entry2,text=vText)
    print("say yes")
    Entry2.delete(0, 'end')
    Entry2.insert(0,vText)

#清空事件按钮
def leftClick2(event):
    s.set("")
    Entry2.insert(0,"")
    s.set("")
    Entry2.config(Entry2,text=s)

Python-->Baidu api

def translate_word(en_str):
    URL='http://api.fanyi.baidu.com/api/trans/vip/translate'
    Form_Data={}
#头信息,整体格式为{"from":"en"(从XX语言),"to":"zh"(到XX语言),"trans_result":[{"src":"hello","dst":"\u4f60\u597d"}]}
    Form_Data['from']='en'
    Form_Data['to']='zh'
    Form_Data['q']=en_str
    Form_Data['appid']='自己申请的app id'
    Form_Data['salt']='随机数'
    key="自己申请的密钥"
#签名格式要求,之后用hashlib内置的md5函数计算MD5值
    m=Form_Data['appid']+en_str+Form_Data['salt']+key
    m_MD5=hashlib.md5(m.encode('utf8'))
    Form_Data['sign']=m_MD5.hexdigest()

    data = parse.urlencode(Form_Data).encode('utf-8')

    response = request.urlopen(URL,data)
    html=response.read().decode('utf-8')
    translate_results=json.loads(html)
    translate_results = translate_results['trans_result'][0]['dst']
    print("翻译的结果是:%s" % translate_results)
    return translate_results

         最后,展示一下需要引用的lib(其实我相信朋友已经能够从代码中看出个八九不离十了)

from tkinter import *
from urllib import request
from urllib import parse
import json
import hashlib

         好了,这一章节的学习就进入了尾声,接下来我可能会进入爬虫的学习,可能就需要一段时间才能够总结出学习笔记,那么大家,未来见!

标签:__,Entry2,Python,request,urllib,API,print,root,百度
来源: https://blog.csdn.net/qq_51998067/article/details/122276153

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有