关于python:爬虫系列存储媒体文件

44次阅读

共计 2945 个字符,预计需要花费 8 分钟才能阅读完成。

上一期解说了:应用 API

本期爬虫系列次要解说爬虫采集实现数据之后,咱们应该怎么存储,以及用什么样的形式存储数据。

尽管在命令行里显示后果很有意思,然而随着数据一直增多,并且须要对数据分析时,将数据打印到命令行就不是方法了。为了能够近程应用大部分网络爬虫,你还须要把采集到的数据存储起来。

本篇文章介绍的数据存储形式,绝大多数应用程序都实用。如果你筹备创立一个网站的后端服务或者创立本人的 API,那么可能须要把数据写入数据库。如果你须要一个疾速简略的办法收集网上的文档,而后保留到你的硬盘里,那么可能须要创立一个文件流(file stream)来实现。

存储媒体文件

存储媒体文件次要有两种形式:只获取文件 URL 链接,或者间接把源文件下载下来。你能够通过媒体文件所在的 URL 链接间接援用它。这样做的长处如下:

  • 爬虫运行得更快,消耗得流量更少,因为只有链接,不须要下载文件;
  • 能够节俭很多存储空间,因为只须要存储 URL 链接就能够了;
  • 存储 URL 的代码更容易编写,也不须要文件下载代码;
  • 不下载文件可能升高指标服务器的负载。

保留媒体文件存在的毛病:

  • 这些内嵌在你网站或利用中的外站 URL 链接称为 盗链(hotlinking),应用盗链可能让你麻烦一直,每个网站都会施行防盗链措施;
  • 因为你的链接放在他人的服务器上,所以你的利用就跟着他人的节奏运行了;
  • 盗链是很容易扭转的。如果你把盗链图片放在博客上,要是被对方服务器发现,就可能被恶搞。如果你把 URL 链接存储起来筹备当前再应用,可能用的时候链接曾经生效了,或者变成了齐全无关的内容;
  • 事实中的浏览器不仅会申请 HTML 页面并切换页面,它们也会下载拜访页面上所有的资源。下载文件会让你的爬虫看起来更像人在浏览网站,这样做反而有益处。

如果你还在犹豫到底是存储文件,还只是存储文件的 URL 链接,能够想想这些文件是要屡次应用还是放进数据库之后就只等着“落灰”,再也不会被关上。如果答案是后者,那么最好还是只存储这些文件的 URL 吧。如果答案是前者,那就持续往下看。

import requests

from utils import connection_util


class SaveData(object):
    def __init__(self):
        self._target_url = 'https://www.pdflibr.com'
        self._init_connection = connection_util.ProcessConnection()

    def save_image(self):
        # 连贯指标网站,获取内容
        get_content = self._init_connection.init_connection(self._target_url)
        if get_content:
            imageLocation = get_content.find("img", {"alt": "IP to Location"})["data-src"]
            real_path = self._target_url + imageLocation
            r = requests.get(real_path)
            with open("ip_location.png", 'wb') as f:
                f.write(r.content)


if __name__ == "__main__":
    SaveData().save_image()

这段程序从 IP 查问 – 爬虫辨认下载一张图片,而后保留在运行程序的文件夹里。

如果你只须要下载一个文件,而且晓得如何获取它,以及它的文件类型,这么做就能够了。然而大多数爬虫一天只下载一个文件。上面的程序会把 IP 查问 – 爬虫辨认上所有 src 属性的文件都下载下来:

import os.path
from urllib.request import urlretrieve
from utils import connection_util


class GetAllSrc(object):
    def __init__(self):
        self._init_download_dir = 'downloaded'
        self._baseUrl = 'https://www.pdflibr.com/ip'
        self._init_connection = connection_util.ProcessConnection()

    def get_absolute_url(self, baseUrl, source):
        if source.startswith("https://image."):
            url = "https://" + source[14:]
        elif source.startswith("https://"):
            url = source
        elif source.startswith("www."):
            url = "https://" + source[4:]
        else:
            url = source
        if baseUrl not in url:
            return None
        return url

    def get_download_path(self, baseUrl, absoluteUrl, download_dir):
        path = absoluteUrl.replace("www.", "")
        path = path.replace(baseUrl, "")
        path = download_dir + path
        directory = os.path.dirname(path)

        if not os.path.exists(directory):
            os.makedirs(directory)

        return path

    def download_main(self):
        get_content = self._init_connection.init_connection(self._baseUrl)
        if get_content:
            download_list = get_content.findAll(src=True)
            for download in download_list:
                file_url = self.get_absolute_url(self._baseUrl, download["src"])
                if file_url is not 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 链接进行清理和标准化,取得了文件的绝对路径(而且去掉了外链),最初每个文件都会下载到程序所在的 downloaded 文件里。

这里应用 Python 的 os 模块用来获取每个下载文件的指标文件夹,建设残缺的门路。os 模块是 Python 与操作系统交互的接口,它能够操作文件门路,创立目录,获取运行过程和环境变量的信息,以及其余零碎相干操作。

文章源代码托管于 Github:爬虫系列:存储媒体文件

正文完
 0