Lengxiy 发表于 2024-5-27 13:12

Python批量下载指定链接页面内的所有图片

本帖最后由 Lengxiy 于 2024-5-27 15:03 编辑

前言
这里是直接读取txt文本内的json数据,没有太过高深的技术之类的,至于这些链接哪儿来的是通过浏览器F12找到对应的数据包找到的
这个txt里面的数据来自该链接:https://mp.weixin.qq.com/s/4qlRBicxn2cXPqJLxR4_TQ?from=industrynews&version=4.1.22.8031&platform=win&nwr_flag=1#wechat_redirect
然后里面有个数据包,都是页面上面的超链接

我这里只是单纯的将这些全都复制到了txt文本内再用python读取的,当然也可以通过python直接访问该链接,找到这个数据包获取里面json数据即网址再通过下面的代码下载图片
可以简单修改就可以用在其他地方了
至于为啥只下载图片,因为我随便瞅了几眼,全是图片的内容,然后也没几个文字,就直接下载了
领导反正也没说让我筛选,就偷懒没写筛选的相关代码了



运行模式:
1.读取txt文本内的所有链接
2.根据每个链接建立一个文件夹,将访问后的页面的所有图片下载下来存在对应的文件夹内
3.图片名称按照数字顺序命名
4.用的selenium按照固定的滑动距离快速滑动滑动至底部以确保页面加载完毕下面是txt文本内的格式数据参考


代码
import json
import os
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import time

# 设置Chrome选项
chrome_options = Options()
# chrome_options.add_argument("--headless")# 无头模式
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-sandbox")

# 初始化webdriver
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)

# 假设txt文件名为"urls.txt",并且位于当前工作目录中
txt_file_path = "{.txt"

# 读取txt文件中的内容
with open(txt_file_path, 'r', encoding='utf-8') as file:
    content = file.read()

# 解析JSON内容
urls = json.loads(content)
urls1 = urls["url"]

# 创建一个主文件夹来保存所有下载的图片
os.makedirs('downloaded_images', exist_ok=True)

# 遍历URL列表,下载每个网页上的所有图片
for idx, url in enumerate(urls1):
    print(f"正在处理URL {idx+1}: {url}")
    driver.get(url)
   
    # 模拟缓慢滚动行为
    SCROLL_PAUSE_TIME = 0.1
    scroll_increment = 500

    last_height = driver.execute_script("return document.body.scrollHeight")
    current_position = 0

    while current_position < last_height:
      driver.execute_script(f"window.scrollTo(0, {current_position});")
      current_position += scroll_increment
      time.sleep(SCROLL_PAUSE_TIME)
      last_height = driver.execute_script("return document.body.scrollHeight")

    # 确保已滚动到页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(SCROLL_PAUSE_TIME)

    soup = BeautifulSoup(driver.page_source, 'html.parser')
    images = soup.find_all('img')# 查找指定类名的图片 , class_='rich_pages wxw-img'

    # 为每个URL创建一个独立的文件夹
    folder_name = f"url_{idx+1}"
    folder_path = os.path.join('downloaded_images', folder_name)
    os.makedirs(folder_path, exist_ok=True)

    for img_idx, img in enumerate(images):
      img_url = img.get('data-src')
      if not img_url:
            img_url = img.get('src')# 尝试获取src属性

      if img_url and not img_url.startswith('data:'):
            # 检查URL是否完整
            if not img_url.startswith(('http:', 'https:')):
                img_url = requests.compat.urljoin(url, img_url)

            # 获取图片内容的响应
            img_response = requests.get(img_url)
            if img_response.status_code == 200:
                # 按顺序命名图片
                img_name = f"{img_idx+1}.png"
                img_path = os.path.join(folder_path, img_name)

                # 保存图片
                with open(img_path, 'wb') as f:
                  f.write(img_response.content)
                  print(f"图片已下载: {img_path}")
            else:
                print(f"无法下载图片: {img_url}")
      else:
            print(f"无效的图片URL: {img_url}")

driver.quit()
print("所有图片下载完成。")

52zct 发表于 2024-5-27 20:13

Lengxiy 发表于 2024-5-27 14:57
举个例子
https://mp.weixin.qq.com/s/4qlRBicxn2cXPqJLxR4_TQ?from=industrynews&version=4.1.22.8031& ...
学会了,感谢老哥分享,不过,如果是下载这些链接内容以及图片的话,我有一个程序,可以一键实现
https://www.123pan.com/s/tW78Vv-rZzJH.html
https://s21.ax1x.com/2024/05/27/pk1Zt3Q.png

Lengxiy 发表于 2024-5-27 14:57

52zct 发表于 2024-5-27 14:40
这个需要我们先按F12,然后手动整理图片链接吗?
还是说可以直接把网页链接放到txt中,自动获取该url中所 ...

举个例子
https://mp.weixin.qq.com/s/4qlRBicxn2cXPqJLxR4_TQ?from=industrynews&version=4.1.22.8031&platform=win&nwr_flag=1#wechat_redirect
这个页面里面有很多超链接,领导要求把这个里面的报告全下载下来(意思就是访问每个连接里面的页面,下载里面所有的内容)
然后访问这个链接的时候,里面有个数据包就是直接以json格式传所有的超链接的
https://img.zymys.cn/i/2024/05/27/66542ed3030fc.png

qjlfl 发表于 2024-5-27 13:22

学习了,感谢分享!{:1_893:}

wulaiye 发表于 2024-5-27 14:40

感谢分享{:1_893:}

52zct 发表于 2024-5-27 14:40

这个需要我们先按F12,然后手动整理图片链接吗?
还是说可以直接把网页链接放到txt中,自动获取该url中所有链接

dhwl9899 发表于 2024-5-27 19:50

谢谢,学习学习了。

xinxiu 发表于 2024-5-27 22:23

52zct 发表于 2024-5-27 20:13
学会了,感谢老哥分享,不过,如果是下载这些链接内容以及图片的话,我有一个程序,可以一键实现
https: ...

这个箭头怎么做得这么丝滑的?:lol

52zct 发表于 2024-5-28 08:51

xinxiu 发表于 2024-5-27 22:23
这个箭头怎么做得这么丝滑的?
因为昨天北京的天空很好看!{:1_918:}

https://s21.ax1x.com/2024/05/28/pk13Eqg.jpg

hllolyl 发表于 2024-5-28 10:00

学习学习,感谢分享
页: [1] 2
查看完整版本: Python批量下载指定链接页面内的所有图片