当前位置: 首页 > 后端技术 > Python

爬虫系列:存储媒体文件

时间:2023-03-26 14:14:44 Python

上一期讲解:使用API??本期爬虫系列主要讲解爬虫收集到数据后我们应该如何存储数据,用什么方法存储数据。虽然在命令行显示结果很有趣,但随着数据不断增加,需要进行数据分析,将数据打印到命令行不是一种选择。为了远程使用大多数网络爬虫,您还需要存储收集到的数据。本文介绍的数据存储方式适用于大多数应用。如果您要为网站创建后端服务或创建自己的API,那么您可能需要将数据写入数据库。如果您需要一种快速简便的方法来从Web收集文档并将它们保存到您的硬盘驱动器,您可能需要创建一个文件流来执行此操作。存储媒体文件存储媒体文件的方式主要有两种:只获取文件的URL链接,或者直接下载源文件。您可以通过链接媒体文件所在的URL直接引用它。这样做的好处是:爬虫运行速度更快,消耗的流量更少,因为不需要下载文件只要需要链接;可以节省大量的存储空间,因为只需要存储URL链接;存储URL的代码更容易写,不需要文件下载代码;不下载文件会减少目标服务器上的负载。保存媒体文件的缺点:这些嵌入在您的网站或应用程序中的外部URL链接称为热链接。使用盗链可能会给您带来无穷无尽的麻烦。每个网站都会实施防盗链措施;因为你的链接放在了别人的服务器上,所以你的应用程序运行在别人的步调上;盗链很容易改变。如果你把盗链图片放到你的博客上,如果被对方服务器发现,你可能会被欺骗。如果您存储该URL链接供以后使用,它可能在您使用时已失效,或变成完全无关的内容;真正的浏览器不仅会请求HTML页面和切换页面,还会下载访问页面上面的所有资源。下载文件将使您的爬虫看起来更像一个人在浏览网站,这可能是有益的。如果你还在犹豫是存储文件还是只存储文件的URL链接,你可以考虑一下,这些文件是不是会被多次使用,或者放到数据库中,就等着被“刷灰”,再也打不开再次。如果答案是后者,那么最好只存储这些文件的URL。如果答案是前者,请继续阅读。从utils导入请求importconnection_utilclassSaveData(object):def__init__(self):self._target_url='https://www.pdflibr.com'self._init_connection=connection_util.ProcessConnection()defsave_image(self):#Connectto目标网站,获取内容real_path=self._target_url+imageLocationr=requests.get(real_path)withopen("ip_location.png",'wb')asf:f.write(r.content)如果__name__=="__main__":SaveData().save_image()这个程序从IP查询-爬虫识别中下载一张图片,然后保存在程序运行的文件夹中。如果您只需要下载一个文件,并且您知道如何获取它以及它是什么类型的文件,那很好。但是大多数爬虫一天只下载一个文件。下面的程序会下载IP查询-爬虫识别上所有带有src属性的文件:._baseUrl='https://www.pdflibr.com/ip'self._init_connection=connection_util.ProcessConnection()defget_absolute_url(self,baseUrl,source):ifsource.startswith("https://image."):url="https://"+source[14:]elifsource.startswith("https://"):url=sourceelifsource.startswith("www."):url="https://"+source[4:]else:url=sourceifbaseUrlnotinurl:returnNone返回urldefget_download_path(self,baseUrl,absoluteUrl,download_dir):path=absoluteUrl.replace("www.","")path=path。替换(baseUrl,“”)路径=下载目录+路径目录=os.path.dirname(路径)如果不是os.path.exists(directory):os.makedirs(directory)返回路径defdownload_main(self):get_content=self._init_connection.init_connection(self._baseUrl)如果get_content:download_list=get_content.findAll(src=True)在下载列表中下载:file_url=self.get_absolute_url(self._baseUrl,download["src"])如果file_url不是None:print(file_url)urlretrieve(file_url,self.get_download_path(self._baseUrl,file_url,self._init_download_dir))if__name__=='__main__':GetAllSrc().download_main()运行上述代码时注意:该程序会将页面上的所有文件下载到您的硬盘中,其中可能包括一些bash脚本、.exe文件、设置它可能是恶意软件(malmare)。本程序首先选取页面上所有具有src属性的标签,然后清洗标准化URL链接,获取文件的绝对路径(并去除外部链接),最后将每个文件下载到程序所在的下载文件中位于。这里使用Python的os模块获取每个下载文件的目标文件夹,建立完整路径。os模块是Python和操作系统之间的接口。它可以操作文件路径、创建目录、获取有关正在运行的进程和环境变量的信息,以及其他与系统相关的操作。文章源代码托管在Github:爬虫系列:存储媒体文件