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

python网络爬虫-数据存储之媒体文件

2017-09-20 09:28 429 查看
  存储媒体文件有两种主要方式:只获取文件URL链接,或者直接把源文件下载下来。你可以通过媒体文件所在的URL链接直接饮用它。这样做的优点如下:

爬虫运行更快,耗费的流量更少,因为只需链接,不需要下载文件
可以节省很多的存储空间,因为只需要存储URL链接就可以了
存储URL的代码更容易写,也不需要实现文件下载代码
不下载文件能够降低目标主机服务器的负载

   不过这么做也有一些缺点

这些内嵌在你的网站或应用中的外站URL链接被称为盗链(hotlinking),使用盗链可能让你麻烦不断,每个网站都会实施防盗链措施。
因为你的链接文件在别人的服务器上,所以你的应用就要跟着别人的节奏运行了
盗链很容易改变的。如果你把盗链图片放在博客上,要是被对方服务器发现,很可能被恶搞。如果你把URL链接存起来准备以后使用,可能用的时候链接已经已经失效了,或者是变成了完全无关的内容
现实中的网络浏览器不仅可以请求HTML页面并切换页面,它们也会下载访问页面上的现有资源。下载文件会让你爬虫看起来更像是在人在浏览网站,这样做反而有好处。

如果你还在犹豫究竟是存储文件,还是存储文件的URL链接,可以想想这些文件是要多次使用,还是放进数据库后就只是等着“落灰”,再也不会被打开,如果答案是后者,最好还是只存储这些文件的URL吧。如果答案是前者,那么请继续往下阅读:

     在Python3.x的版本中,urllib.request.urlretrieve可以更具文件的URL下载文件:

from urllib.request import urlretrieve
from urllib.request import urlopen
from bs4 import BeautifulSoup
html=urlopen("http://www.pythonscraping.com")
bsObj=BeautifulSoup(html,"html.parser")
imageLocation=bsObj.find("a",{"id":"logo"}).find("img")["src"]
urlretrieve(imageLocation,"logo.jpg")
脚本执行结果如下:



成功完成图片的下载功能。这段程序从http://www.pythonscraping.com下载logo图片,然后在程序运行的文件夹里保存为logo.jpg图片。

       如果你只需要下载一个文件,而且知道如何获取它,以及它的文件类型,这么做就可以了。但是大多数爬虫都不可能一天只下载一个文件,下面的程序会把htpp://pythonscraping.com主页上所有的src属性的文件都下载下来:

import os
from urllib.request import urlretrieve
from urllib.request import urlopen
from bs4 import BeautifulSoup
downloadDirectory="download"
baseUrl="http://pythonscraping.com"
def getAbsoluteURL(baseUrl,source):
if source.startswith("http://www."):
url="http://"+source[11:]
elif source.startswith("http://"):
url=source
elif source.startswith("www."):
source=source[4:]
url="http:"+source
else:
url=baseUrl+"/"+source
if baseUrl not in url:
return None
return url

def getDownloadPath(baseUrl,absoluteUrl,downloadDirectory):
path=absoluteUrl.replace("www.","")
path=path.replace(baseUrl,"")
path=downloadDirectory+path
directory=os.path.dirname(path)
if not os.path.exists(directory):
os.makedirs(directory)
return path
html=urlopen("http://www.pythonscraping.com")
bsObj=BeautifulSoup(html,"html.parser")
downloadList=bsObj.findAll(src=True)
for download in downloadList:
fileUrl=getAbsoluteURL(baseUrl,download["src"])
if fileUrl is not None:
print(fileUrl)
urlretrieve(fileUrl,getDownloadPath(baseUrl,fileUrl,downloadDirectory))

该段程序执行结果如下:



成功下载了页面的所有包含src属性的文件,包括img,sites和misc等各方面。

     但是在下载的时候,需要注意以下事项:因为上述程序没有对要下载的文件进行过滤,因此可能会包含bash脚本、exe文件,甚至可能是恶意软件。所以备份重要数据及过滤要下载的文件是非常重要且需要时常注意的事情。

      这个程序首先使用Lambda函数,选取首页上所有带src属性的标签,然后对URL链接进行清理和标准化,获得文件的绝对路径(而且去掉了外链)。最后,每个文件都会下载到程序所在文件夹的download文件目录下。

      这里Python的os模块用来获取每个下载文件的目标问价夹,建立完整路径。os模块是Python与操作系统进行交互的接口,它可以操作文件路径,创建目录,获取运行进程和环境变量的信息,以及其他系统相关的操作。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息