#本文一切代码及理论均来自于郑秋生、夏敏捷二位老师主编《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
好了,这一章节的学习就进入了尾声,接下来我可能会进入爬虫的学习,可能就需要一段时间才能够总结出学习笔记,那么大家,未来见!