批量下载对路网图片并生成html的实现方法

yizhihongxing

我来为你详细讲解“批量下载对路网图片并生成html的实现方法”的完整攻略。

实现方法

确定目标图片网站

首先需要确定目标图片网站,找到需要下载的图片所在的页面

找到图片标签

在目标网站页面中,需要找到所有图片元素所对应的标签,通常是<img>标签

提取图片链接

提取每个图片标签中的src属性即可得到图片下载链接

下载图片

用python程序对获取的图片链接进行下载

生成HTML文件

通过python程序,在本地生成一个HTML文件,将所有下载的图片插入到HTML中,最后保存

示例说明

示例1:爬取bing首页每日一图

首先我们需要找到bing图片的下载链接,可以在bing首页右下角找到今天的背景图片。

接下来我们需要对bing图片网站页面中的许多元素进行爬取,根据css选择器获取每天的图片标签的data-src属性即可获取图片下载链接。

import requests
import os
from bs4 import BeautifulSoup

def get_bing_img():
    url = "https://cn.bing.com"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"}
    html = requests.get(url, headers=headers)
    soup = BeautifulSoup(html.content, "html.parser")
    image_url = url + soup.find(id='bgImgProgLoad')['data-src']
    return image_url

得到图片的链接之后,就可以直接调用 requests 包来下载图片了。

def download_image(image_url):
    folder_path = './bing'
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)
    response = requests.get(image_url)
    with open(folder_path + '/' + image_url.split('/')[-1], 'wb') as f:
        f.write(response.content)
        print('Image downloaded')

然后我们通过pyppeteer库来自动化生成下载好的所有图片的html文件,pyppeteer可以通过python控制一个headless的Chrome来生成截图或执行JS代码,这里我们用它来生成html文件。

import asyncio
from pyppeteer import launch

async def generate_html():
    folder_path = './bing'
    file_list = os.listdir(folder_path)
    file_list.sort(key=lambda fn: os.path.getctime(folder_path + '/' + fn))
    html_text = []
    for i in range(len(file_list)):
        html_text.append('<img src="{}"/>'.format(folder_path + '/' + file_list[i]))
    html_file = './bing/bing.html'
    with open(html_file, 'w') as f:
        f.write(''.join(html_text))

    # Launch headless Chrome to screenshot example.com
    browser = await launch()
    page = await browser.newPage()
    await page.goto('file:' + html_file, {'waitUntil': 'networkidle0'})
    await page.screenshot({'path': './bing/bing.png', 'fullPage': True})

    # Close the browser
    await browser.close()

asyncio.get_event_loop().run_until_complete(generate_html())

执行完之后,会在本地生成一个bing.html文件,文件中包含了所有下载好的图片,可以使用浏览器打开确保生成的html文件正确。

示例2:爬取LOFTER某个用户的图片

在LOFTER某个用户的封面图中,图片下载链接和bing稍微有点不同,但是原理相同。

首先我们需要找到LOFTER某个用户的主页来爬取,但这里我们考虑的是通过用户输入的相册地址来爬取用户的图片。接下来和bing下载方法类似,我们需要找到LOFTER某个用户相册网站页面中的所有元素进行爬取。LOFTER相册页面中,每张图片对应的标签是<img>标签,且每张图片的下载链接是data-original属性,所以我们的核心代码如下所示。

def get_img_list(url):
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"}
    response = requests.get(url, headers=header)
    html = response.content.decode('utf-8')
    bs = BeautifulSoup(html, "html.parser")
    # 找到页面中所有img标签,这些标签可以包含多个属性
    img_tags = bs.find_all("img", attrs={'class': 'imgc', 'data-original': re.compile(r'.+\.(gif|jpeg|jpg|png)$')})
    # 获取每个img标签的属性data-original中保存的地址。
    urls = [(tag.get('data-original'), tag.get('alt')) for tag in img_tags]
    return urls

这样我们就获得了图片的下载链接,接下来就是类似于bing的方法:

def download_image2(image_url, path):
    if not os.path.exists(path):
        os.makedirs(path)
    response = requests.get(image_url)
    with open(path + '/' + image_url.split('/')[-1], 'wb') as f:
        f.write(response.content)
        print('Image downloaded')

def download_images(url):
    img_urls = get_img_list(url)
    for img in img_urls:
        if img[0].endswith('.gif'):
            continue
        download_image2(img[0], './lofter')

下载完成之后,我们通过依葫芦画瓢的方式,将图片路径插入到html文件中去:

def generate_html2():
    folder_path = './lofter'
    file_list = os.listdir(folder_path)
    file_list.sort(key=lambda fn: os.path.getctime(folder_path + '/' + fn))
    html_text = []
    for i in range(len(file_list)):
        html_text.append('<img src="{}"/>'.format(folder_path + '/' + file_list[i]))
    html_file = './lofter/lofter.html'
    with open(html_file, 'w') as f:
        f.write(''.join(html_text))

当然在获取图片链接之后,你也可以选择使用异步协程的方式去下载图片。

以上就是通过python实现批量下载对路网图片并生成html的实现攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:批量下载对路网图片并生成html的实现方法 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • PHP小偷程序的设计与实现方法详解

    下面是PHP小偷程序的设计与实现方法详解的攻略: 1. 了解需求 首先需要明确需求,也就是设计PHP小偷程序的目的。一般而言,PHP小偷程序是用来爬取网站数据,如文章、图片等。所以,在设计PHP小偷程序之前,需要明确需要爬取哪些数据,以及如何存储这些数据。 2. 写出爬虫脚本 在明确需求后,需要编写爬虫脚本。爬虫脚本分为两个部分:第一部分是获取网页源代码(H…

    PHP 2023年5月23日
    00
  • php脚本守护进程原理与实现方法详解

    PHP脚本守护进程原理与实现方法详解 背景 要想实现持续运行某个 PHP 程序,一般常见的方式是在终端执行 php your-script.php 命令,但是这种方式不够优雅,因为无法后台运行,当终端连接关闭时,该 PHP 程序也会随之退出。而守护进程是一种让后台程序持续运行的方式,我们可以借助它来实现 PHP 脚本目标。 原理 守护进程是指一种在操作系统后…

    PHP 2023年5月23日
    00
  • 手机怎么自测血氧? 微信小程序自测血氧的技巧

    下面来详细讲解一下如何通过微信小程序自测血氧的技巧。 准备工作 手机系统版本需要在iOS13.4以上或者安卓5.0以上; 手机需要安装微信官方客户端; 手机需要配备血氧传感器,比较新的手机一般都会配备; 打开微信,并进入“发现-小程序”页面。 操作步骤 进入小程序页面后,搜索并进入微信商城,然后搜索并下载“健康之路”小程序; 打开“健康之路”小程序后,进入“…

    PHP 2023年5月23日
    00
  • 跨浏览器PHP下载文件名中的中文乱码问题解决方法

    跨浏览器PHP下载文件名中的中文乱码问题一直是一个头疼的问题,本文将介绍一种常见的解决方法。 问题描述 当我们用PHP代码下载文件时,如果文件名包含中文字符,就有可能在不同的浏览器中出现乱码。例如,在火狐浏览器中,文件名可能显示为乱码;而在谷歌浏览器中,文件名可能显示为可读的中文字符。 解决方案 解决这个问题的方法是在HTTP响应头中设置Content-Di…

    PHP 2023年5月26日
    00
  • php实现映射操作实例详解

    PHP实现映射操作实例详解 映射(Map)是一种在PHP中常见的数据类型,其实就是一种键值对的集合。我们可以使用PHP的关联数组来直接实现映射操作。 创建映射 我们可以使用以下语法创建一个空的映射: $map = array(); 也可以在创建映射的同时指定键值对: $map = array("key1" => "valu…

    PHP 2023年5月27日
    00
  • PHP执行普通shell命令流程解析

    下面是PHP执行普通shell命令流程解析的完整攻略。 流程解析 PHP执行普通shell命令的流程分为以下几步: 使用PHP的系统调用函数system、exec、shell_exec、passthru或popen来执行shell命令,如:system(‘ls’)。 程序调用系统内核中的execve函数,该函数用于执行指定的可执行文件或shell命令,并将其…

    PHP 2023年5月26日
    00
  • 骁龙8gen2和骁龙888性能相差多大 骁龙8gen2和骁龙888对比详解

    骁龙8gen2和骁龙888性能对比 近年来,手机处理器的高速发展使得消费者对高性能处理器的需求越来越大。目前市面上较为知名的处理器品牌为高通,其骁龙系列处理器备受用户青睐。其中骁龙8gen2和骁龙888都是其较为出色的产品。那么,骁龙8gen2和骁龙888的性能相差多大呢?接下来我们将对两者的性能进行详细对比分析。 骁龙8gen2和骁龙888的处理器架构 首…

    PHP 2023年5月27日
    00
  • PHP实现linux命令tail -f

    我来详细讲解一下如何用PHP实现Linux命令tail -f的攻略。具体内容如下: 什么是tail -f命令 Linux系统的tail命令可以查看文件的末尾几行或者追踪一个正在增长的文件。其中,tail -f命令会不断监控文件,将文件的新增内容实时输出到屏幕上。 我们的目标是通过PHP实现这一功能。 实现方法 在PHP中,读取文件时需要注意到文件锁、缓存等问…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部