任务:批量爬取抖音视频的搜索结果内容,包括视频标题,视频地址和视频创作者等信息。
定位到元素位置:
href="//http://www.douyin.com/video/7340197363010637093"
在ChatGPT中输入提示词:
你是一个Python爬虫专家,一步步的思考,完成以下网页爬取的Python脚本任务:
在F:\aivideo文件夹里面新建一个Excel文件:douyinchatgpt.xlsx
设置chromedriver的路径为:"D:\Program Files\chromedriver125\chromedriver.exe"
设置网页编码为:charset=utf-8
用selenium打开网页:https://www.douyin.com/search/ChatGPT?type=video;
等待网页加载,延迟50秒;
解析源代码,并打印输出;
selenium控制滚动条滚动到网页最底部,使数据全加载出来:使用一个无限循环来模拟滚动条的滚动,直到滚动条到达页面底部。在每个循环迭代中,都记录前一个页面高度(prev_height),然后使用JavaScript滚动到页面底部。停顿10秒钟,以便页面可以加载更多内容。然后,再次使用JavaScript来获取新页面高度,并检查它是否等于以前的高度。如果它们相等,说明已经滚动到了页面底部,可以退出循环。
定位class="HN50D2ec Z3LKqldT"的li 标签;
在li 标签中定位css选择器=#search-content-area > div > div.aS8_s2bj > div.fSYtCCtg > div:nth-child(2) > ul > li:nth-child(titlenumber) > div > a > div > div.d2yYYhwo > div > div.ILGAlGLX的div标签(titlenumber从1开始,并以1 为增量增加),作为视频标题,保存到douyinchatgpt.xlsx的第1列;
在li 标签中定位css选择器=#search-content-area > div > div.aS8_s2bj > div.fSYtCCtg > div:nth-child(2) > ul > li:nth-child(pnumer) > div > a > div > div.d2yYYhwo > div > div.oBbvFsS9 > span.ehgTdQCP > span.k7fHrf54的span标签(pnumer从1开始,并以1 为增量增加),作为视频博主,保存到douyinchatgpt.xlsx的第2列;
在li 标签中定位#search-content-area > div > div.aS8_s2bj > div.fSYtCCtg > div:nth-child(2) > ul > li:nth-child(tnumber) > div > a > div > div.d2yYYhwo > div > div.oBbvFsS9 > span.H_OXalNs的span标签(tnumer从1开始,并以1 为增量增加),作为视频发布时间,保存到douyinchatgpt.xlsx的第3列;
在li 标签中定位css选择器=#search-content-area > div > div.aS8_s2bj > div.fSYtCCtg > div:nth-child(2) > ul > li:nth-child(urlnumber) > div > a的a标签(urlnumber从1开始,并以1 为增量增加),提取其href属性值,作为视频链接,保存到douyinchatgpt.xlsx的第4列;
数据写入Excel时,要注意DataFrame.append 方法在 pandas 1.4.0 版本中已经被弃用,并且在后续版本中被移除。为了解决这个问题,我们可以使用 concat 函数来代替 append
注意:
每一步都要输出相关信息到屏幕;
每爬取一个li 标签里面的内容,就随机暂停5-10秒;
设置请求头,来应对反爬虫机制;
代码不要分成一段一段的,整合在一起;
不要开启无头模式;
在Selenium 4中,executable_path参数已经被弃用,取而代之的是service参数;
DataFrame.append 方法在 pandas 1.4.0 版本中已经被弃用,并且在后续版本中被移除。为了解决这个问题,我们可以使用 concat 函数来代替 append
ChatGPT生成的源代码:
import os
import time
import random
import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
chrome_service = Service("D:\Program Files\chromedriver125\chromedriver.exe")
chrome_options = Options()
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36")
driver = webdriver.Chrome(service=chrome_service, options=chrome_options)
driver.get("https://www.douyin.com/search/ChatGPT?type=video")
time.sleep(50)
print(driver.page_source)
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(random.randint(1, 5))
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
df = pd.DataFrame(columns=['视频标题', '视频博主', '视频发布时间', '视频链接'])
video_elements = driver.find_elements(By.CLASS_NAME, "HN50D2ec.Z3LKqldT")
print(f"找到 {len(video_elements)} 个视频元素")
for i in range(len(video_elements)):
time.sleep(random.randint(5, 10))
try:
title = driver.find_element(By.CSS_SELECTOR, f"#search-content-area > div > div.aS8_s2bj > div.fSYtCCtg > div:nth-child(2) > ul > li:nth-child({i+1}) > div > a > div > div.d2yYYhwo > div > div.ILGAlGLX").text
except:
title = ''
try:
author = driver.find_element(By.CSS_SELECTOR, f"#search-content-area > div > div.aS8_s2bj > div.fSYtCCtg > div:nth-child(2) > ul > li:nth-child({i+1}) > div > a > div > div.d2yYYhwo > div > div.oBbvFsS9 > span.ehgTdQCP > span.k7fHrf54").text
except:
author = ''
try:
publish_time = driver.find_element(By.CSS_SELECTOR, f"#search-content-area > div > div.aS8_s2bj > div.fSYtCCtg > div:nth-child(2) > ul > li:nth-child({i+1}) > div > a > div > div.d2yYYhwo > div > div.oBbvFsS9 > span.H_OXalNs").text
except:
publish_time = ''
try:
video_link = driver.find_element(By.CSS_SELECTOR, f"#search-content-area > div > div.aS8_s2bj > div.fSYtCCtg > div:nth-child(2) > ul > li:nth-child({i+1}) > div > a").get_attribute("href")
except:
video_link = ''
print(f"视频标题: {title}")
print(f"视频博主: {author}")
print(f"视频发布时间: {publish_time}")
print(f"视频链接: {video_link}")
df = pd.concat([df, pd.DataFrame({'视频标题': [title], '视频博主': [author], '视频发布时间': [publish_time], '视频链接': [video_link]})], ignore_index=True)
excel_path = "F:\aivideo\douyinchatgpt.xlsx"
os.makedirs(os.path.dirname(excel_path), exist_ok=True)
df.to_excel(excel_path, index=False)
driver.quit()
print(f"数据已保存到 {excel_path}")
程序运行结果如上。