python自学笔记(8)--Python简单爬虫从网站上下载图片和用第三方库request实现百度翻译
直接贴代码,具体参见注释,主要用到了urllib这个包,需要说明的是urllib2模块只在python2中存在,到了python3之后就被改到urllib.request中去了,所以python3是没有urllib2这个模块的。
import urllib.request
import urllib.response
import re
testUrl = "http://www.tooopen.com/view/779441.html"
testReg = r'src="(http://.*?\.jpe?g)" alt'
def get_html(url):
response = urllib.request.urlopen(url) # urlopen返回一个类文件对象,可以像文件一样操作
'''
print("info: ")
print(response.info())#返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息
print("code: ")
print(response.getcode())#返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
#一般在访问网站前判断网站是否可访问,4xx的错误一般是请求存在问题,一般是不可恢复的,5xx的问题一般是服务端存在问题,可以尝试重新下载
print("url: ")
print(response.geturl())#返回请求的url
'''
html = response.read() # read() , readline() ,readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样
# html用decode("utf-8")进行解码,由bytes变成string。
# py3的urlopen返回的不是string是bytes。
return html#返回的是string
def getImage(reg, html):
imgre = re.compile(reg)#re模块中包含一个重要函数是compile(pattern [, flags]) ,该函数根据包含的正则表达式的字符串创
# 建模式对象。可以实现更有效率的匹配。在直接使用字符串表示的正则表达式进行search,match和findall操作时,
# python会将字符串转换为正则表达式对象。而使用compile完成一次转换之后,在每次使用模式的时候就不用重复转换。
#imageList = re.findall(reg, html)# 此方式没有对reg进行编译,所以应该会多次对reg转换,导致效率降低
imageList = imgre.findall(html)#以列表的形式返回能匹配的子串
print(imageList)
count = 1
for image in imageList:
resp = urllib.request.urlopen(image)
respHtml = resp.read()
with open(str(count) + '.jpg', 'wb') as f:
f.write(respHtml)
print("save: " + str(count) + '.jpg')
count += 1;
def test():
getImage(testReg, get_html(testUrl).decode("utf-8"))
if __name__ == "__main__":
test()
利用第三方库request实现百度翻译
第三方库的导入方法参考http://blog.csdn.net/qiannianguji01/article/details/50397046
实现方法转载自https://www.cnblogs.com/yezhaodan/p/7452885.html,做了一点小修改。
import requests def translate(): url = 'http://fanyi.baidu.com/v2transapi/' print('----------感谢百度翻译,禁止用于商业用途----------') while True: content = input("Please confirm Chinese to (E)nglish,English to (C)hinese,or (Q)uit:\n") if content in ['Q','q','quit','Quit']: break; elif content in ['C']: content = input("请输入翻译内容\n") data = { 'from': 'en', 'to': 'zh', 'query': content, 'transtype': 'translang', 'simple_means_flag': '3', } elif content in ['E']: content = input("请输入翻译内容\n") data = { 'from': 'zh', 'to': 'en', 'query': content, 'transtype': 'translang', 'simple_means_flag': '3', } else: print("格式错误,请重新选择") continue headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/' + '35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0'} response = requests.post(url, data, headers = headers)#post请求数据 # head = response.headers # text = response.text # text = json.loads(text) # res = text['trans_result']['data'][0]['dst'] # print(res) # print(head['Content-Type']) print(response.json()['trans_result']['data'][0]['dst'])#requests中已经有了内置的函数,r.json(),无需引入json模块 if __name__ == "__main__": translate()