这几天在收集模拟电路的图片,需要爬取百度,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` 是一个专为 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张图片左右,不知道是被反爬虫了还是怎么样,尝试记录每次爬取的进度,从断了的部分重新爬取,但没成功,如果有大佬能解决,菜菜捞捞。
第一次分享,希望可以帮助到大家,不足之处多多指正。感谢看完的小伙伴。