如何运用python爬虫爬取百度贴吧动态加载的图片?

动态加载的图片通常是在页面加载后通过JavaScript异步请求获取的,而requests和BeautifulSoup只能获取页面的初始HTML内容,无法执行JavaScript代码。

要处理动态加载的图片,可以使用以下方法:

1. 使用Selenium

Selenium是一个用于自动化Web浏览器的工具,可以模拟用户浏览网页的行为,包括点击、滚动等操作,从而获取动态加载的内容。

安装依赖

bash复制

bash 复制代码
pip install selenium
示例代码

Python复制

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
import requests

# 初始化WebDriver
driver = webdriver.Chrome()

# 打开目标网页
url = 'https://tieba.baidu.com/p/1234567890'  # 替换为目标帖子的URL
driver.get(url)

# 等待页面加载
time.sleep(3)

# 滚动页面以加载更多图片
for _ in range(5):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)

# 获取页面源码
html_content = driver.page_source

# 关闭浏览器
driver.quit()

# 解析HTML内容,提取图片URL
def extract_image_urls(html_content):
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html_content, 'html.parser')
    images = soup.find_all('img')  # 查找所有图片标签
    image_urls = []
    for img in images:
        img_url = img.get('src')  # 获取图片的src属性
        if img_url and img_url.startswith('http'):  # 确保是完整的URL
            image_urls.append(img_url)
    return image_urls

# 下载并保存图片
def download_images(image_urls, save_dir='images'):
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)  # 创建保存图片的文件夹
    for i, img_url in enumerate(image_urls):
        img_name = os.path.basename(img_url)  # 从URL中提取文件名
        save_path = os.path.join(save_dir, img_name)
        if os.path.exists(save_path):
            print(f"{img_name} already exists. Skipping...")
            continue
        try:
            response = requests.get(img_url, timeout=10)
            response.raise_for_status()  # 确保请求成功
            with open(save_path, 'wb') as img_file:
                img_file.write(response.content)  # 保存图片
            print(f"Downloaded {img_name}")
        except requests.RequestException as e:
            print(f"Failed to download {img_url}. Error: {e}")
        time.sleep(1)  # 随机延时,避免被封禁

# 主函数
def main():
    image_urls = extract_image_urls(html_content)
    download_images(image_urls)

if __name__ == "__main__":
    main()

2. 使用Playwright

Playwright是一个用于自动化Web浏览器的工具,支持多种浏览器(如Chrome、Firefox、Safari等),可以模拟用户浏览网页的行为,从而获取动态加载的内容。

安装依赖

bash复制

bash 复制代码
pip install playwright
playwright install
示例代码

Python复制

python 复制代码
from playwright.sync_api import sync_playwright
import os
import requests

# 使用Playwright获取动态加载的图片
def get_dynamic_images(url, save_dir='images'):
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)  # 创建保存图片的文件夹

    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)  # 启动浏览器
        page = browser.new_page()  # 打开新页面
        page.goto(url)  # 打开目标网页

        # 等待页面加载
        page.wait_for_load_state('networkidle')

        # 滚动页面以加载更多图片
        for _ in range(5):
            page.evaluate("window.scrollTo(0, document.body.scrollHeight);")
            page.wait_for_load_state('networkidle')

        # 获取所有图片
        images = page.query_selector_all('img')
        image_urls = [img.get_attribute('src') for img in images if img.get_attribute('src')]

        # 下载并保存图片
        for i, img_url in enumerate(image_urls):
            img_name = os.path.basename(img_url)  # 从URL中提取文件名
            save_path = os.path.join(save_dir, img_name)
            if os.path.exists(save_path):
                print(f"{img_name} already exists. Skipping...")
                continue
            try:
                response = requests.get(img_url, timeout=10)
                response.raise_for_status()  # 确保请求成功
                with open(save_path, 'wb') as img_file:
                    img_file.write(response.content)  # 保存图片
                print(f"Downloaded {img_name}")
            except requests.RequestException as e:
                print(f"Failed to download {img_url}. Error: {e}")
            time.sleep(1)  # 随机延时,避免被封禁

        browser.close()  # 关闭浏览器

# 主函数
def main():
    url = 'https://tieba.baidu.com/p/1234567890'  # 替换为目标帖子的URL
    get_dynamic_images(url)

if __name__ == "__main__":
    main()

注意事项

  1. 遵守法律法规:在爬取网站内容时,务必遵守相关法律法规和网站的使用条款。
  2. 合理设置爬取频率:过于频繁的爬取请求可能会对目标网站造成压力,甚至导致你的IP被封禁。请合理设置爬取频率。
  3. 处理反爬虫机制:如果遇到反爬虫机制(如验证码、IP封禁等),可以尝试设置请求头、使用代理IP等方法。

通过上述方法,你可以成功爬取百度贴吧的动态加载图片。希望这些内容对你有所帮助。

相关推荐
吃饱了得干活6 小时前
Agent 的记忆与工具:从上下文窗口到 MCP
python·agent·mcp
燐妤6 小时前
LangGraph-复习总览
python·ai·面试·agent·学习方法·langgraph
尹人入圣6 小时前
市面上IP驱动产业新场景新工具
运维·网络·python·tcp/ip
打工仔折腾 AI7 小时前
从BPE到SentencePiece:Transformer分词原理与Python实战对比
android·人工智能·python·深度学习·langchain·transformer·ai agent 实战
骑着蜗牛撵大象3277 小时前
Qt 事件机制详解:从 QEvent 派生类到事件过滤器的全景指南
前端·python
流形填表7 小时前
题库迁移实战:Excel中间格式与列映射
python·excel
东方芷兰7 小时前
Agent 技术摘要 06 —— Harness、原生视觉、Jev、mmproj、dsh
人工智能·笔记·python·ai·langchain·ai编程
qq_2518364577 小时前
理发管理系统 —— 会员模块
开发语言·前端·python·flask
郝学胜-神的一滴7 小时前
AI 编程智能体 03:拆解当下主流智能体能力
开发语言·c++·人工智能·python·程序人生·游戏
言乐67 小时前
Python文字审核模型
开发语言·windows·python·django·pygame