Python爬虫|获取大麦网演出信息

使用Selenium库自动化浏览器操作,从大麦网的搜索结果页面抓取演唱会信息,并将这些信息保存到一个CSV文件中

代码的主要步骤包括:
1. 初始化WebDriver。
2. 打开指定的URL。
3. 模拟点击“全部”按钮。
4. 循环抓取每一页的演唱会信息,并写入CSV文件。
5. 关闭WebDriver。

代码拆分讲解

1. 导入相关库

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文件。

 2. 设置Chrome选项

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版本一致

 3. 定义爬取信息的函数

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文件。

4. 使用WebDriver打开指定的URL

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打开大麦网的搜索结果页面,搜索条件为“演唱会”,并且地点为“北京”。

网址对应页面图片如下:

Python爬虫|获取大麦网演出信息_第1张图片

 也可以修改网址,爬取其它页面的信息,但要确保元素对应,打开网页控制台可以查看到对应div

5. 模拟点击“全部”按钮

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("无法找到或点击“全部”按钮")

- 等待“全部”按钮可点击,并模拟点击该按钮。
- 如果无法找到或点击该按钮,打印错误信息。

 6. 循环爬取所有页面

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`循环,不断滚动页面并抓取信息。
- 等待“下一页”按钮可点击,并模拟点击该按钮。
- 如果没有“下一页”按钮,退出循环。

7. 关闭WebDriver

driver.quit()  # 关闭WebDriver,结束浏览器进程
print("ending...")

- 关闭WebDriver,结束浏览器进程。
- 打印结束信息。

你可能感兴趣的:(python,爬虫,开发语言)