1. 实现的需求:
- 用户提供一系列关键词。
- 使用selenium自动化工具,打开浏览器,然后在
huaban.com上搜索这些关键词。
- 滚动页面以获取更多的结果。
- 获取并保存与关键词相关的链接。
- 将这些链接保存到指定的目录下的
.txt文件中。
2. 代码的功能:
search_and_save_links: 用于在huaban.com上搜索指定关键词,并保存链接。
main: 代码的主入口,获取用户输入的关键词和保存路径,然后调用search_and_save_links函数。
3. 用了什么大致的语法实现需求:
- 模块导入:使用了selenium(一个流行的Web自动化库)以及os和time标准库。
- 字符串格式化:使用
BASE_URL.format(keyword=keyword)来将关键词插入到URL中。
- Selenium方法:
driver.get(): 打开一个指定的URL。
driver.find_elements(): 根据XPath查找页面中的元素。
driver.execute_script(): 执行JavaScript代码。
- 文件操作:使用
with open()来创建和写入文件。
- 异常处理:
try-except用于捕获和处理过程中可能出现的错误。
4. 使用时的格式和注意事项:
- 使用格式:
- 执行此代码。
- 当提示时,输入用逗号分隔的关键词。
- 输入保存链接的地址。
- 注意事项:
- 为了运行这段代码,您需要安装
selenium库以及合适版本的WebDriver(例如ChromeDriver)。
- 页面结构或类名可能会随着时间而改变。如果huaban.com更改了其页面结构或样式,代码可能需要进行相应的调整。
- 滚动等待时间(
time.sleep(5))可以根据需要调整。过短的等待时间可能导致某些链接未被抓取,而过长的等待时间则可能导致程序运行缓慢。
- 为了避免被认为是机器人或恶意活动,不要频繁或大量地运行这个程序。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
BASE_URL = "https://huaban.com/search?q={keyword}&sort=all&type=board&category=industrial_design"
def search_and_save_links(driver, keyword, save_dir):
driver.get(BASE_URL.format(keyword=keyword))
fetched_links = set()
prev_num_links = -1
# 滚动页面直到没有新的链接为止
while len(fetched_links) > prev_num_links:
prev_num_links = len(fetched_links)
# 获取所有符合条件的链接
elements = driver.find_elements(By.XPATH, '//a[contains(@class, "UwLo0Up5") and starts-with(@href, "/boards/")]')
for ele in elements:
link = ele.get_attribute('href')
fetched_links.add(link)
# 滚动
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5) # 增加等待时间
# 保存链接到txt文件
with open(os.path.join(save_dir, f"{keyword}.txt"), "w", encoding="utf-8") as file:
for link in fetched_links:
file.write(link + "\n")
def main():
# 获取关键词、保存地址
keywords = input("请输入搜索关键词,用','隔开:").split(",")
save_dir = input("请输入保存地址,例如:C:\\Users\\皮皮\\Desktop:")
if not os.path.exists(save_dir):
os.makedirs(save_dir)
# 统一浏览器初始化
driver = webdriver.Chrome()
for keyword in keywords:
keyword = keyword.strip()
try:
search_and_save_links(driver, keyword, save_dir)
except Exception as e:
print(f"Error occurred while fetching links for keyword {keyword}: {e}")
driver.quit()
if __name__ == "__main__":
main()