爬取behance搜索结果图片背后详情页的链接

发布时间 2023-10-04 16:04:48作者: 不上火星不改名
目的:我需要搜索多个behance结果,如“washing machine","refrigerator"等,把结果下详情页高清大图都下载到本地。这样我就获得了“冰箱”的大量高清图。
程序作用:爬取多个搜索结果下的详情页链接,并新建文件后保存在桌面txt文件中,如“washing machine.txt”中。后期把txt中的文本可以放进“豆皮文件下载器”中下载。
程序概述:
  1. 导入必要的库:

    • webdriver:控制浏览器的操作。
    • By:用于定位页面元素。
    • time:用于添加延迟,保证页面加载完毕。
    • threading:用于并发操作,实现同时监听用户输入和爬取内容。
  2. 全局变量:

    • stop_current_keyword:用于标志是否需要停止当前关键词的爬取操作。
  3. 函数:

    • input_thread:一个后台线程,不断监听用户输入。当用户输入'stop'时,将全局变量stop_current_keyword设为True。
    • get_behance_links:核心爬虫函数。给定一个 URL 和目标链接数量,它会返回一个链接列表。
  4. 主程序:

    • 定义了一个关键词列表 keywords。该列表包含了需要在 Behance 上搜索的关键词。
    • 提示用户输入希望爬取的链接数量。
    • 启动一个后台线程,该线程用于监听用户输入。
    • 启动 Chrome 浏览器。
    • 对于 keywords 列表中的每一个关键词,生成对应的 Behance 搜索 URL,并使用上述的 get_behance_links 函数获取链接。
    • 获取到链接后,将它们保存到一个以关键词命名的文本文件中。
    • 最后,关闭 Chrome 浏览器


# 导入必要的库
from selenium import webdriver # 用于控制浏览器
from selenium.webdriver.common.by import By # 用于定位元素
import time # 用于添加延迟
import threading # 用于并发操作

stop_current_keyword = False # 用于控制是否停止当前关键词的爬取


# 一个后台线程,监听用户输入
def input_thread():
global stop_current_keyword
while True:
cmd = input("Type 'stop' to skip current keyword: ")
if cmd == 'stop':
stop_current_keyword = True


# 这个函数用于爬取Behance网站上的链接
def get_behance_links(driver, url, target_count):
links = set()
driver.get(url)
time.sleep(5) # 等待页面加载

try:
# 当链接数量未达到目标数量,并且用户未停止当前关键词的爬取时
while len(links) < target_count and not stop_current_keyword:
# 查找页面上的所有链接元素
a_elements = driver.find_elements(By.CSS_SELECTOR,
".ProjectCoverNeue-coverLink-U39.e2e-ProjectCoverNeue-link")
for a in a_elements:
href = a.get_attribute("href")
if href:
links.add(href)

# 如果链接数量还未达到目标,并且用户还未输入'stop',则滚动页面以加载更多链接
if len(links) < target_count:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5) # 等待页面加载新的内容
except Exception as e:
print(f"Error: {e}")

return list(links)


if __name__ == "__main__":
keywords = [
"washing machine",
"refrigerator",
# ... 更多关键词 ...
]

target_links_count = int(input("请输入您想要爬取的链接数量:"))

# 开启监听用户输入的线程
thread = threading.Thread(target=input_thread)
thread.start()

driver = webdriver.Chrome() # 启动Chrome浏览器

try:
for keyword in keywords:
stop_current_keyword = False # 对于每一个关键词,都将标志位重置
search_url = f"https://www.behance.net/search/projects?search={keyword}&field=industrial+design"
links = get_behance_links(driver, search_url, target_links_count)

filename = f"{keyword}.txt"
with open(filename, 'w', encoding='utf-8') as f:
for link in links:
f.write(link + '\n')

print(f"已找到 {len(links)} 个链接并保存到 '{filename}'.")

if stop_current_keyword:
print(f"Skipped the rest of '{keyword}' on user command.")
finally:
driver.quit() # 关闭浏览器