您的位置:首页 > 理论基础 > 计算机网络

读Python获取网络数据的笔记(9月16日)

2016-09-16 19:31 225 查看
今天看了第五章的第一节,讲存储媒体文件;书上的例子说的是下载图片,如果是视频我该怎么办……

from urllib.request import urlretrieve
from urllib.request import urlopen
from bs4 import BeautifulSoup
import os

# 下载文件所在的文件夹的名字
download_directory = "downloaded"
# 基本Url指的是什么我现在还不太明白,为什么没有www.?
base_url = "http://pythonscraping.com"

# 不使用正则表达式,而用函数的方式处理各种可能出现的Url
def get_absolute_url(one_base_url, source):
# 关于切片的知识又要复习了,没明白[11:]啊[4:]啊之类的什么意思
if source.startswith("http://www."):
url = "http://" + source[11:]
elif source.startswith("http://"):
url = source
elif source.startswith("www."):
url = source[4:]
url = "http://" + source
else:
url = one_base_url + "/" + source

if one_base_url not in url:
return None

return url

# 获取本地存储路径
def get_download_path(one_base_url, absolute_url, one_download_directory):
# 1.path赋值为去掉www.头部的完整Url
# 2.path再赋值为自己去掉匹配one_base_url部分的形式
# 3.path最后一次赋值为下载用的文件夹的路径
path = absolute_url.replace("www.", "")
path = path.replace(one_base_url, "")
path = one_download_directory + path
# 获取这个文件夹的名字
directory = os.path.dirname(path)
# 如果组成这个路径的一溜文件夹都不存在,就建立它
if not os.path.exists(directory):
os.makedirs(directory)
# 返回这个本地路径
return path

# 两大常规
html = urlopen("http://www.pythonscraping.com")
bs_obj = BeautifulSoup(html, "html.parser")
# 所有src属性内容都被选中
download_list = bs_obj.findAll(src=True)

for download in download_list:
# 下载列表里每一个Url都要经过下面的补全函数修改补全
file_url = get_absolute_url(base_url, download["src"])
if file_url is not None:
print("It's " + file_url)
urlretrieve(file_url, get_download_path(base_url, file_url, download_directory))


这段代码含有两个函数:补全Url函数为了urlretrieve和获取本地路径函数服务;获取本地路径函数为urlretrieve服务。

该程序缺点也很明显,只能获取下载列表里最后一个Url指向的文件;如果最后一个不是文件,必然要出错。于是我魔改了一下(加个异常处理):

try:
urlretrieve(file_url, get_download_path(base_url, file_url, download_directory))
except OSError:
continue


如果file_url不存在那就会出错了,所以把这个try块放在if里面。

这一段其实也有问题,那就是所有检测到的Url的路径全都会生成本地文件夹。多出一大堆空文件夹出来强迫症各种不舒服,不过今天懒癌犯了,不想遍历文件夹再删除空文件夹了,恩,就这样吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 网络 图片