我来为你详细讲解“批量下载对路网图片并生成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技术站