批量下载对路网图片并生成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数组声明、遍历、数组全局变量使用小结

    PHP数组声明 在 PHP 中,数组(Array)是一种用于储存多个值的变量。数组可包含多个值,每个值有一个对应的键(key,也可称为索引)。在 PHP 中,数组使用 array() 函数来创建,每个键和值之间用箭头(=>)分隔开。 以下是创建数组的基本语法: $arrayName = array( key => value, key =>…

    PHP 2023年5月26日
    00
  • 升级iOS14后bug连奶茶都点不了?iOS14降级刷回到iOS13的详细教程(含视频)

    升级iOS14后bug连奶茶都点不了?iOS14降级刷回到iOS13的详细教程(含视频) 问题描述 iOS14更新后,一些用户反馈在使用某些应用程序时会出现各种bug,操作不顺畅或者app直接崩溃。而有些用户在升级到iOS14之后,发现连购买奶茶的App都无法正常使用。这个问题困扰了很多用户。 解决方法 降级到iOS13是一种解决问题的方法。下面是步骤: 步…

    PHP 2023年5月30日
    00
  • PHP生成随机数的方法总结

    PHP生成随机数的方法总结 生成随机数是程序设计中经常用到的一个基本操作,PHP语言提供了多种方法生成随机数。下面将对一些常见的方法进行总结,并给出相应的示例说明。 1. 使用rand()函数 PHP内置的rand()函数用于生成指定范围内的随机数。可以使用该函数生成一个随机整数,例如: // 生成1-100之间的随机整数 $rand_num = rand(…

    PHP 2023年5月26日
    00
  • php二维数组转成字符串示例

    下面是“php二维数组转成字符串示例”的完整攻略: 1. 使用implode函数 在PHP中,可以使用implode函数来将数组转化成字符串,如果数组是二维的,则需要先将其转化为一维数组,再使用implode函数。下面是使用implode函数将二维数组转化为字符串的示例代码: <?php $array = array( array("name…

    PHP 2023年5月23日
    00
  • 学习php设计模式 php实现观察者模式(Observer)

    学习PHP设计模式中的观察者模式需要掌握以下知识点: 观察者模式是怎样的一种设计模式,以及它的应用场景和作用; 观察者模式中的关键角色:被观察者(Subject)和观察者(Observer); 实现观察者模式的具体步骤:定义被观察者和观察者的接口,实现被观察者和观察者的类及其方法。 以下是实现观察者模式的完整攻略: 观察者模式概述 观察者模式是一种常见的行为…

    PHP 2023年5月27日
    00
  • 学习PHP的数组总结【经验】

    下面是学习PHP数组攻略的详细讲解: 一、介绍 本篇攻略主要介绍PHP中数组的相关知识,包括数组的定义、创建、遍历、数组的常用函数等内容。通过本文的学习,您将能够掌握PHP中数组的使用方法。 二、数组的定义 PHP中的数组是一种有序、可重复、可变的集合数据类型。数组元素可以是任何类型的数据,例如整数、浮点数、字符串、对象等等。数组可以通过键值对的方式访问元素…

    PHP 2023年5月26日
    00
  • PHP实现将多个文件中的内容合并为新文件的方法示例

    要将多个文件中的内容合并为新文件,可以使用PHP的文件操作函数和字符串处理函数来实现。下面是实现方法的完整攻略: 使用PHP的文件操作函数打开要读取内容的原始文件,并将文件内容作为字符串储存在变量中。例如,要读取文件1.txt的内容,可以使用以下代码: $myfile1 = fopen("1.txt", "r") or…

    PHP 2023年5月26日
    00
  • Linux系统下php获得系统分区信息的方法

    在Linux系统上,可以使用以下方法获得系统分区信息: 使用df命令 df命令可以列出文件系统的磁盘使用情况,通过解析df的输出信息,可以获得系统分区信息。 使用命令: df -h 可以列出系统中所有分区的信息(包括挂载路径、总容量、已用空间、剩余空间等)。 在php中,可以使用exec函数执行该命令,例如: <?php $result = array…

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