1.需求:

  1. 模拟鼠标选择城市名称,例如“长沙”
  2. 模拟鼠标选择音乐会,演唱会,话剧歌剧,曲苑杂坛,分类采集相关信息
  3. 数据信息包含剧照图片地址,标题,艺人名称,地址,售票价格,售票状态
  4. 将数据分类存储到csv表格中
  5. 拓展:实现分页数据采集

2.设计思路:

  1. 目标定义:明确你想要爬取的数据类型,比如演出的标题、时间、地点、票价、售票状态等。

  2. 技术选型:根据大麦网的反爬虫机制和技术栈选择合适的爬虫技术。如果页面数据可以通过API获取,可以使用requests库;如果需要模拟浏览器行为,可以使用Selenium

  3. 数据获取:使用requestsSelenium获取页面内容。如果是动态加载的数据,可能需要分析网络请求或使用Selenium来获取。

  4. 数据解析:利用BeautifulSouplxml等库解析HTML,提取所需数据。

  5. 数据存储:将提取的数据存储到合适的格式,如CSV、数据库等。

  6. 异常处理:设计异常处理机制,确保在遇到错误时能够记录日志并优雅地处理。

3.主要代码:

3.1 导包

import os.path
import time
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
  • os.path用来处理文件路径。
  • time用于控制延迟。
  • pandas用于数据处理和保存。
  • selenium用于网页自动化操作。
  • 3.2  定义save_data函数

    def save_data(data, mode='w'):
        """
        保存数据到CSV文件。
    
        参数:
        data: 要保存的数据,格式为列表或字典。
        mode: 写入模式,'w'为覆盖写入,'a'为追加写入,默认为'w'。
        """
        df = pd.DataFrame(data)
        try:
            # 检查文件是否存在,决定是写入还是追加
            if not os.path.exists('damai.csv'):
                df.to_csv('damai.csv', mode=mode, encoding='utf-8-sig', index=False)
            else:
                df.to_csv('damai.csv', mode='a', encoding='utf-8-sig', index=False)
            print('数据保存成功!')
        except Exception as e:
            print('数据保存失败!')
            print(e)
  • 此函数用于将抓取到的数据保存到CSV文件中。
  • 如果文件不存在则创建新文件,如果文件已存在则追加数据。
  • 3.3 定义get_data函数 

    def get_data(url, city_num, type_num):
        """
        使用Selenium从网页抓取数据。
    
        参数:
        url: 目标网页的URL。
        city_num: 城市选择的序号。
        type_num: 演出类型选择的序号。
    
        返回:
        数据字典,包含剧照图片地址、标题、地址、演出时间、售票价格和售票状态。
        """
        data = {
            '剧照图片地址': [],
            '标题': [],
            '地址': [],
            '演出时间': [],
            '售票价格': [],
            '售票状态': []
        }
    
        driver = webdriver.Edge()
        driver.get(url)
        driver.implicitly_wait(10)
        # 选择城市和演出类型
        driver.find_element(By.XPATH, f'/html/body/div[2]/div[2]/div[1]/div[1]/div[1]/div/div[2]/div[1]/span[{city_num+1}]').click()
        time.sleep(1)
        driver.find_element(By.XPATH, f'/html/body/div[2]/div[2]/div[1]/div[1]/div[2]/div/div/div/span[{type_num+1}]').click()
        time.sleep(1)
    
        # 抓取页面数据
        img_urls = driver.find_elements(By.XPATH, '//div[2]/div[1]/div[3]/div[1]/div/div/a/img')
        titles = driver.find_elements(By.XPATH, '//div[3]/div[1]/div/div/div/div/a')
        addresses = driver.find_elements(By.XPATH, '//div[@class="items"]/div/div[last()-3]')
        times = driver.find_elements(By.XPATH, '//div[3]/div[1]/div/div/div/div[last()-2]')
        prices = driver.find_elements(By.XPATH,'//div[3]/div[1]/div/div/div/div[last()]/span')
        prices_status = driver.find_elements(By.XPATH, '//div[3]/div[1]/div/div/div/div[last()]')
    
        # 提取数据到列表
        img_url = [item.get_attribute('src') for item in img_urls]
        title = [item.text for item in titles if item.text != '' and item.text != '\n']
        address = [item.text for item in addresses]
        t_ime = [item.text for item in times]
        price = [item.text for item in prices]
        price_status = [item.text.split(' ')[-1] for item in prices_status]
        time.sleep(1)
        # 将数据添加到字典中
        for img, tit, add, tim, p, p_status in zip(img_url, title, address, t_ime, price, price_status):
            data['剧照图片地址'].append(img)
            data['标题'].append(tit)
            data['地址'].append(add)
            data['演出时间'].append(tim)
            data['售票价格'].append(p)
            data['售票状态'].append(p_status)
    
        time.sleep(2)
        save_data(data)
    
    
        time.sleep(3)
        driver.quit()
  • 此函数通过 Selenium 从给定的 URL 抓取数据。
  • 使用driver控制网页,选择城市与演出类型,抓取页面中的数据。
  • 通过不同的 XPath 表达式获取剧照图片地址、标题、地址、演出时间、售票价格及状态等信息。
  • 3.4主程序

  • 主程序部分获取用户输入的城市和演出类型,并确定其在页面中的索引,然后调用 get_data 函数来抓取数据。
  • 将抓取的数据整理到一个字典中,然后调用 save_data 函数保存到 CSV 文件。
  • 4.总结

    此代码的主要功能是实现从一个在线演出门票网站抓取指定城市和演出类型的演出信息, 并将结果保存到 CSV 文件中。代码使用了 Selenium 进行网页操作,Pandas 进行数据处理,并支持根据用户输入动态选择数据。最终得到的数据包括剧照图片地址、标题、地址、演出时间、售票价格和售票状态,便于用户进行后续分析或查询。

     

     

    作者:Eliauk78

    物联沃分享整理
    物联沃-IOTWORD物联网 » 大麦网爬取案例#Python

    发表回复