通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python如何获取js动态获取的图片

python如何获取js动态获取的图片

在Python中获取由JavaScript动态加载的图片,通常需要使用能够执行JavaScript代码的工具或库。使用Selenium、使用Requests-HTML库、使用Scrapy-Splash、使用Pyppeteer 等方法是常见的解决方案。下面将详细介绍其中一种方法:使用Selenium来获取动态加载的图片。

Selenium 是一个用于自动化 Web 浏览器操作的工具。它支持多种浏览器,并且可以执行 JavaScript 代码,这使得它能够处理由 JavaScript 动态加载的内容。

一、安装和设置Selenium

首先,我们需要安装Selenium库和浏览器驱动程序。以Chrome浏览器为例:

pip install selenium

然后下载ChromeDriver,并将其放置在系统的PATH中。你可以从以下链接下载相应版本的ChromeDriver:

ChromeDriver下载链接

二、使用Selenium加载页面并获取图片链接

接下来,我们将使用Selenium加载网页,并提取动态加载的图片链接。

from selenium import webdriver

from selenium.webdriver.chrome.service import Service

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

def get_dynamic_images(url):

# 设置Chrome浏览器驱动程序路径

chrome_service = Service('/path/to/chromedriver')

# 初始化Chrome浏览器

driver = webdriver.Chrome(service=chrome_service)

try:

# 访问目标网页

driver.get(url)

# 等待页面中的图片元素加载完毕

wait = WebDriverWait(driver, 10)

images = wait.until(EC.presence_of_all_elements_located((By.TAG_NAME, 'img')))

# 提取图片链接

image_urls = [image.get_attribute('src') for image in images]

return image_urls

finally:

# 关闭浏览器

driver.quit()

示例使用

url = 'https://example.com'

image_urls = get_dynamic_images(url)

for img_url in image_urls:

print(img_url)

在这个例子中,我们使用Selenium加载目标网页,并等待页面中的所有图片元素加载完毕。然后,我们提取这些图片元素的链接,并将其打印出来。

三、深入解析

  1. 设置浏览器选项

    为了提高性能和隐私保护,您可以禁用一些不必要的选项:

from selenium.webdriver.chrome.options import Options

chrome_options = Options()

chrome_options.add_argument("--headless") # 无头模式

chrome_options.add_argument("--disable-gpu") # 禁用GPU加速

chrome_options.add_argument("--no-sandbox") # 解决DevToolsActivePort文件不存在的报错

chrome_options.add_argument("--disable-dev-shm-usage") # 解决资源不足的问题

driver = webdriver.Chrome(service=chrome_service, options=chrome_options)

  1. 处理异步加载

    某些图片可能是通过异步请求加载的。您可以等待特定的JavaScript事件或检查特定的DOM变化:

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

等待特定的JavaScript事件或DOM变化

wait = WebDriverWait(driver, 20)

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'img.some-specific-class')))

  1. 处理懒加载

    有些网站使用懒加载技术,图片只有在滚动到视口内才会加载。您可以模拟滚动操作:

# 模拟滚动到底部

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

四、使用Requests-HTML库

Requests-HTML库也是一个强大的工具,它不仅可以发起HTTP请求,还可以渲染JavaScript代码。以下是一个使用Requests-HTML库的示例:

from requests_html import HTMLSession

def get_dynamic_images_with_requests_html(url):

session = HTMLSession()

response = session.get(url)

# 渲染JavaScript

response.html.render()

# 提取图片链接

image_urls = [img.attrs['src'] for img in response.html.find('img')]

return image_urls

示例使用

url = 'https://example.com'

image_urls = get_dynamic_images_with_requests_html(url)

for img_url in image_urls:

print(img_url)

五、使用Scrapy-Splash

如果您需要在Scrapy中处理动态加载的内容,可以使用Scrapy-Splash。Splash是一个JavaScript渲染服务,可以与Scrapy集成,以便处理动态内容。

# 在Scrapy项目的settings.py中添加以下配置

SPLASH_URL = 'http://localhost:8050'

DOWNLOADER_MIDDLEWARES = {

'scrapy_splash.SplashCookiesMiddleware': 723,

'scrapy_splash.SplashMiddleware': 725,

'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,

}

SPIDER_MIDDLEWARES = {

'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,

}

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

在爬虫中使用SplashRequest

from scrapy_splash import SplashRequest

class MySpider(scrapy.Spider):

name = 'my_spider'

def start_requests(self):

yield SplashRequest(url='https://example.com', callback=self.parse)

def parse(self, response):

image_urls = response.css('img::attr(src)').getall()

for img_url in image_urls:

yield {'image_url': img_url}

六、使用Pyppeteer

Pyppeteer是Puppeteer的Python版本,它允许您控制无头浏览器并执行JavaScript代码。

import asyncio

from pyppeteer import launch

async def get_dynamic_images_with_pyppeteer(url):

browser = await launch()

page = await browser.newPage()

await page.goto(url)

# 等待图片元素加载完毕

await page.waitForSelector('img')

# 提取图片链接

image_urls = await page.evaluate('''() => {

const images = document.querySelectorAll('img');

return Array.from(images).map(img => img.src);

}''')

await browser.close()

return image_urls

示例使用

url = 'https://example.com'

image_urls = asyncio.get_event_loop().run_until_complete(get_dynamic_images_with_pyppeteer(url))

for img_url in image_urls:

print(img_url)

总结

在Python中获取由JavaScript动态加载的图片,可以使用多种工具和库。Selenium、Requests-HTML、Scrapy-Splash和Pyppeteer都是强大的选择。根据具体需求和使用场景,选择合适的方法来处理动态内容,能够更高效地完成任务。

相关问答FAQs:

如何判断一个网页是否使用JavaScript动态加载图片?
在许多现代网页中,图片可能是通过JavaScript动态加载的。可以通过查看网页源代码,检查是否有<img>标签,或者使用开发者工具(F12)观察网络请求。搜索网络面板中的“img”请求可以帮助确认图片是何时加载的。如果在页面加载时没有找到图片链接,很可能是通过JavaScript动态生成的。

使用Python爬虫时,如何处理动态加载的内容?
在处理动态加载内容时,使用传统的爬虫库如requests可能无法直接获取所需数据。可以考虑使用SeleniumPlaywright等工具,这些工具能够模拟浏览器行为,执行JavaScript,从而加载完整页面及其内容。通过设置适当的等待时间,确保页面加载完成后再提取所需的图片链接。

获取动态加载图片后,如何保存这些图片?
一旦获取了图片的URL,可以使用Python的requests库下载这些图片。通过发送GET请求到每个图片的URL,获取响应内容,并将其写入文件。确保使用合适的文件名和扩展名保存图片,以便后续访问和使用。为防止下载失败,可以实现重试机制,以确保所有图片都能成功保存到本地。

相关文章