使用Selenium库自动化浏览器操作,从大麦网的搜索结果页面抓取演唱会信息,并将这些信息保存到一个CSV文件中
代码的主要步骤包括:
1. 初始化WebDriver。
2. 打开指定的URL。
3. 模拟点击“全部”按钮。
4. 循环抓取每一页的演唱会信息,并写入CSV文件。
5. 关闭WebDriver。
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver # 用于网页自动化操作
from selenium.webdriver.common.by import By # 用于定位元素
import os # 用于操作系统相关的功能
import time # 用于控制代码的运行和等待时间
import csv
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait
- `selenium`:用于自动化浏览器操作。
- `os`:用于获取当前工作目录。
- `time`:用于控制代码的运行和等待时间。
- `csv`:用于将数据写入CSV文件。
chrome_options = Options()
# chrome_options.add_argument("--headless") # 无头模式,可选
service = Service(r"D:\selenium\chromedriver-win64\chromedriver.exe")
driver = webdriver.Chrome(service=service, options=chrome_options)
- 创建Chrome选项对象,可以选择是否启用无头模式(不打开浏览器窗口)。
- 设置ChromeDriver的路径,并初始化WebDriver。
!注意:
WebDriver路径需要修改为自己的下载路径
WebDriver下载地址:chromedriver.storage.googleapis.com/index.html
此外需保证WebDriver版本与Google版本一致
def scrape_page(driver, items):
i = 0 # 初始化变量i,用于后续循环计数
for j in range(1, 31):
flag = None
artist_element = driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(i + 1) + "]/div/div[2]")
if artist_element.text[0] != '艺':
flag = [3, 2, 5]
artist = 'null' # 如果没有艺人信息,设置为null
else:
flag = [4, 3, 6]
artist = artist_element.text.replace('艺人:', '') # 删除“艺人:”字样
item = {
'title': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(i + 1) + "]/div/div[1]/a").text,
'artist': artist,
'time': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(i + 1) + "]/div/div[" + str(flag[0]) + "]").text,
'place': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(i + 1) + "]/div/div[" + str(flag[1]) + "]").text,
'price': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(i + 1) + "]/div/div[" + str(flag[2]) + "]/span").text,
}
i += 1 # 序号计数器
items.append(item) # 将抓取的演唱会数据项添加到总信息列表中
base_dir = os.getcwd() # 获取当前工作目录的路径
filename = base_dir + r'\damai.csv' # 获取当前工作目录的路径
with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = ['title', 'artist','time', 'place', 'price']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for item in items:
writer.writerow(item)
- `scrape_page`函数用于从当前页面抓取演唱会信息。
- 通过XPath定位元素,获取演唱会标题、艺人、时间、地点和价格等信息。
- 将抓取的信息存储到字典中,并追加到`items`列表中。
- 最后,将所有抓取的信息写入CSV文件。
driver.get("https://search.damai.cn/search.htm?ctl=%E6%BC%94%E5%94%B1%E4%BC%9A&order=1&cty=%E5%8C%97%E4%BA%AC")
- 使用WebDriver打开大麦网的搜索结果页面,搜索条件为“演唱会”,并且地点为“北京”。
网址对应页面图片如下:
也可以修改网址,爬取其它页面的信息,但要确保元素对应,打开网页控制台可以查看到对应div
try:
all_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "span.factor-content-item.factor-content-item-default"))
)
all_button.click()
time.sleep(1) # 等待页面加载
except:
print("无法找到或点击“全部”按钮")
- 等待“全部”按钮可点击,并模拟点击该按钮。
- 如果无法找到或点击该按钮,打印错误信息。
items = [] # 存放演唱会对象数据
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")# 滚动页面以加载更多内容
time.sleep(1) # 减少等待时间
scrape_page(driver, items)
try:
next_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btn-next"))
)
next_button.click()
time.sleep(1) # 等待页面加载
except:
print("这是最后一页")
break
- 初始化一个空列表`items`,用于存储抓取的演唱会信息。
- 使用`while True`循环,不断滚动页面并抓取信息。
- 等待“下一页”按钮可点击,并模拟点击该按钮。
- 如果没有“下一页”按钮,退出循环。
driver.quit() # 关闭WebDriver,结束浏览器进程
print("ending...")
- 关闭WebDriver,结束浏览器进程。
- 打印结束信息。