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

我来为你详细讲解“批量下载对路网图片并生成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通过排列组合实现1到9数字相加都等于20的方法

    当1到9数字相加都等于20时,可以通过排列组合的方式: 将1到9的数字进行全排列,也就是将这9个数字按照所有的可能排列顺序都列举出来,然后对每一种排列情况计算其数字相加的和值。 对于每一种可能的排列情况,只需要计算其数字相加的和值是否等于20,如果等于20,在页面上输出这一组数字的排列情况。 使用 PHP 实现这个功能可以分两步进行: 实现全排列 可以使用 …

    PHP 2023年5月26日
    00
  • 老生常谈PHP 文件写入和读取(必看篇)

    首先我们来介绍一下“老生常谈PHP 文件写入和读取(必看篇)”。 1. 简介 在PHP开发中,文件读写操作是非常常见的操作之一。而文件操作又分为文件读取和文件写入两种。这两种操作对于PHP开发人员来说都是必不可少的操作。本篇攻略旨在帮助初学者了解PHP中的文件读写操作的基本原理以及详细的操作步骤。 2. 文件写入 文件写入指的是将数据写入到某个指定的文件中。…

    PHP 2023年5月26日
    00
  • PHP 开发环境配置(测试开发环境)

    PHP 开发环境配置主要包括 PHP 解释器、Web 服务器和数据库三个部分的安装和配置。下面是一份详细的攻略,以 Windows 操作系统为例。 安装 PHP 解释器 下载 PHP 解释器安装包,建议下载 ZIP 包格式,解压缩到 C 盘根目录下。 修改 PHP 配置文件 php.ini。找到并打开 C:\php\php.ini,找到以下几个选项进行修改:…

    PHP 2023年5月26日
    00
  • PHP框架的选择及几款主流框架的性能基本评测

    PHP框架的选择及几款主流框架的性能基本评测 选择PHP框架的原则 选择一个适合自己的PHP框架很重要,以下是选择PHP框架时的一些原则: 框架越流行,支持越好,社区较大,遇到的问题可以在社区中很快得到解决。 框架性能优良,能够支持高并发,对内存占用低。 框架的文档详细、规范,易于上手和维护。 框架的特点和优势要符合项目需求,确定应用场景和架构需求。 主流P…

    PHP 2023年5月30日
    00
  • php获取数组长度的方法(有实例)

    当我们使用PHP编程时,经常会遇到一个问题,那就是获取数组的长度。本文将详细讲解PHP获取数组长度的方法,并给出两个实例。 获取数组长度的方法 在PHP中,获取数组长度有三种方法:count()、sizeof()和使用循环计数器。其中最常用的是count()和sizeof()方法。具体用法如下: 使用count()函数 count()函数是PHP自带的函数之…

    PHP 2023年5月26日
    00
  • PHP入门学习之字符串操作

    PHP入门学习之字符串操作 本文将向您介绍在PHP中如何对字符串进行操作,包括字符串的拼接、替换、截取、转换等常用操作。 字符串的拼接 在PHP中,可以使用 . 运算符将两个字符串连接起来。例如: $string1 = "Hello"; $string2 = "world!"; $string3 = $string1 …

    PHP 2023年5月23日
    00
  • 微信开发 使用picker封装省市区三级联动模板

    第一部分:整体思路 在微信小程序中使用picker封装省市区三级联动模板的主要思路如下: 引入三个js文件或使用小程序提供的city-data数据源; 定义三个picker组件; 定义三个数据变量,分别存储省、市、区的信息; 根据已选择的省市区信息,筛选对应的城市和地区信息; 监听picker变化事件,更新已选中的省市区信息。 第二部分:具体步骤 引入cit…

    PHP 2023年5月30日
    00
  • php实现的简单压缩英文字符串的代码

    实现压缩英文字符串的代码最常见的方法是使用 Run-length encoding(即 RLE 算法)。该算法基于将一个字符序列转换为一个新的字符序列,并且仅记录相邻重复符号的计数。例如,在字符串 AAABBC 上进行 RLE 编码后,得到的结果将是 A3B2C1。 下面是一个 PHP 实现的简单压缩英文字符串的代码: function compressSt…

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