python网络爬虫-数据存储之媒体文件
2017-09-20 09:28
429 查看
存储媒体文件有两种主要方式:只获取文件URL链接,或者直接把源文件下载下来。你可以通过媒体文件所在的URL链接直接饮用它。这样做的优点如下:
爬虫运行更快,耗费的流量更少,因为只需链接,不需要下载文件
可以节省很多的存储空间,因为只需要存储URL链接就可以了
存储URL的代码更容易写,也不需要实现文件下载代码
不下载文件能够降低目标主机服务器的负载
不过这么做也有一些缺点
这些内嵌在你的网站或应用中的外站URL链接被称为盗链(hotlinking),使用盗链可能让你麻烦不断,每个网站都会实施防盗链措施。
因为你的链接文件在别人的服务器上,所以你的应用就要跟着别人的节奏运行了
盗链很容易改变的。如果你把盗链图片放在博客上,要是被对方服务器发现,很可能被恶搞。如果你把URL链接存起来准备以后使用,可能用的时候链接已经已经失效了,或者是变成了完全无关的内容
现实中的网络浏览器不仅可以请求HTML页面并切换页面,它们也会下载访问页面上的现有资源。下载文件会让你爬虫看起来更像是在人在浏览网站,这样做反而有好处。
如果你还在犹豫究竟是存储文件,还是存储文件的URL链接,可以想想这些文件是要多次使用,还是放进数据库后就只是等着“落灰”,再也不会被打开,如果答案是后者,最好还是只存储这些文件的URL吧。如果答案是前者,那么请继续往下阅读:
在Python3.x的版本中,urllib.request.urlretrieve可以更具文件的URL下载文件:
成功完成图片的下载功能。这段程序从http://www.pythonscraping.com下载logo图片,然后在程序运行的文件夹里保存为logo.jpg图片。
如果你只需要下载一个文件,而且知道如何获取它,以及它的文件类型,这么做就可以了。但是大多数爬虫都不可能一天只下载一个文件,下面的程序会把htpp://pythonscraping.com主页上所有的src属性的文件都下载下来:
该段程序执行结果如下:
成功下载了页面的所有包含src属性的文件,包括img,sites和misc等各方面。
但是在下载的时候,需要注意以下事项:因为上述程序没有对要下载的文件进行过滤,因此可能会包含bash脚本、exe文件,甚至可能是恶意软件。所以备份重要数据及过滤要下载的文件是非常重要且需要时常注意的事情。
这个程序首先使用Lambda函数,选取首页上所有带src属性的标签,然后对URL链接进行清理和标准化,获得文件的绝对路径(而且去掉了外链)。最后,每个文件都会下载到程序所在文件夹的download文件目录下。
这里Python的os模块用来获取每个下载文件的目标问价夹,建立完整路径。os模块是Python与操作系统进行交互的接口,它可以操作文件路径,创建目录,获取运行进程和环境变量的信息,以及其他系统相关的操作。
爬虫运行更快,耗费的流量更少,因为只需链接,不需要下载文件
可以节省很多的存储空间,因为只需要存储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与操作系统进行交互的接口,它可以操作文件路径,创建目录,获取运行进程和环境变量的信息,以及其他系统相关的操作。
相关文章推荐
- python网络爬虫与信息采取之下载存储数据(一)-----下载储存媒体文件模板
- 如何在python中读写和存储matlab的数据文件(*.mat)
- Head First Python 第二章 函数模块&第三章 文件与异常&第四章 持久存储&第五章 处理数据
- Python中数据加载、存储与文件格式
- python 将复杂数据类型(list、dict)存储到文件 以及 读入 pickle模块
- Python中数据加载、存储与文件格式
- HeadFirstPython---------(二)第四章,持久存储,数据保存到文件
- python数据分析之:数据加载,存储与文件格式
- 如何在python中读写和存储matlab的数据文件(*.mat)
- 利用python进行数据分析-数据加载、存储与文件格式1
- [python]通达信历史日线数据解析转换为CSV文件进行存储
- 如何在python中读写和存储matlab的数据文件(*.mat)
- python网络爬虫-数据存储之MySQL
- 如何在python中读写和存储matlab的数据文件(*.mat)
- 利用python进入数据分析之数据加载、存储、文件格式
- Python持久存储--数据保存到文件
- Python学习入门基础教程(learning Python)--5.7 Python文件数据记录存储与处理
- python数据存储系列教程——xls文件的读写
- Python 数据分析(一) 本实验将学习 pandas 基础,数据加载、存储与文件格式,数据规整化,绘图和可视化的知识
- python网络爬虫-数据存储中如何改变mysql数据库的字符为unicode