轻松爬取动态网页内的图片,只需使用网页链接即可

发布时间:2024年01月04日

起因

这几天在收集模拟电路的图片,需要爬取百度,Google上面的图片,但是在网上找的代码或者博客大多数都是静态网页爬取,动态网页的爬取教程很少而且实际操作复杂,于是自己写了一个脚本,经过本人实践,可以一键爬取百度,Google的图片,轻松高效。

?

代码

话不多说直接上代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time
import requests
import os

save_folder = 'downloaded_images'
if not os.path.exists(save_folder):
    os.makedirs(save_folder)

options = Options()
# options.add_argument('--headless')  # 如果你不需要浏览器界面,可以取消注释这行

service = Service(executable_path="E://chromedriver-win64//chromedriver.exe")
driver = webdriver.Chrome(service=service, options=options)
driver.get('www.baidu.com') #这里以www.baidu.com为例,大家可以手动替换成自己所需要爬取的网站链接

# 新增部分: 模拟滚动以加载更多内容
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    # 向下滚动到页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(5)  # 等待新内容加载

    # 计算新的滚动高度并比较与上次滚动后的高度
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

images = driver.find_elements(By.TAG_NAME, 'img')
image_urls = [image.get_attribute('src') for image in images]

driver.quit()

for i, url in enumerate(image_urls):
    # 跳过空字符串或非 HTTP/HTTPS 开头的 URL
    if not url or not url.startswith(('http://', 'https://')):
        continue

    try:
        response = requests.get(url)
        if response.status_code == 200:
            file_path = os.path.join(save_folder, f'image_{i}.jpg')
            with open(file_path, 'wb') as file:
                file.write(response.content)
    except Exception as e:
        print(f"无法下载图片 {url},错误: {e}")

chromedriver

`ChromeDriver` 是一个专为 Google Chrome 浏览器设计的独立服务器,它实现了 WebDriver 协议。WebDriver 是一个用于自动化网络应用测试的工具,它提供了与浏览器交互的编程接口。

没有的话需要自己去chromedriver官网下载与自己Google相匹配的chromedriver,这很重要。

需要科学上网,下载网站如下:

ChromeDriver - WebDriver for Chrome - Downloads


service = Service(executable_path="E://chromedriver-win64//chromedriver.exe")

下载成功后只需将"E://chromedriver-win64//chromedriver.exe"这一部分修改为自己的安装路径

遇到的问题

在写这个代码的时候遇到几个问题,都已解决:

1.动态加载网页

针对动态加载网页的问题,通过模拟滚动来加载更多的内容。在 Selenium 中执行JavaScript 实现,以便处理动态加载的网页内容。这个脚本将滚动页面直到没有更多的新内容加载为止。需要注意的是,滚动频率和等待时间可能需要根据目标网站的具体情况进行调整,以确保内容能够成功加载。同时,请确保遵守网站的使用条款和抓取政策。

2.提取的图片 URL 可能是一个空字符串或者不完整

通过这一部分解决了该问题

for i, url in enumerate(image_urls):
    # 跳过空字符串或非 HTTP/HTTPS 开头的 URL
    if not url or not url.startswith(('http://', 'https://')):
        continue

    try:
        response = requests.get(url)
        if response.status_code == 200:
            file_path = os.path.join(save_folder, f'image_{i}.jpg')
            with open(file_path, 'wb') as file:
                file.write(response.content)
    except Exception as e:
        print(f"无法下载图片 {url},错误: {e}")

不足

在实际操作过程中,最多爬取1500张图片左右,不知道是被反爬虫了还是怎么样,尝试记录每次爬取的进度,从断了的部分重新爬取,但没成功,如果有大佬能解决,菜菜捞捞。

总结

第一次分享,希望可以帮助到大家,不足之处多多指正。感谢看完的小伙伴。

文章来源:https://blog.csdn.net/weixin_73902638/article/details/135357741
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。