大麦网爬取案例#Python
1.需求:
- 模拟鼠标选择城市名称,例如“长沙”
- 模拟鼠标选择音乐会,演唱会,话剧歌剧,曲苑杂坛,分类采集相关信息
- 数据信息包含剧照图片地址,标题,艺人名称,地址,售票价格,售票状态
- 将数据分类存储到csv表格中
-
拓展:实现分页数据采集
2.设计思路:
-
目标定义:明确你想要爬取的数据类型,比如演出的标题、时间、地点、票价、售票状态等。
-
技术选型:根据大麦网的反爬虫机制和技术栈选择合适的爬虫技术。如果页面数据可以通过API获取,可以使用
requests
库;如果需要模拟浏览器行为,可以使用Selenium
。 -
数据获取:使用
requests
或Selenium
获取页面内容。如果是动态加载的数据,可能需要分析网络请求或使用Selenium
来获取。 -
数据解析:利用
BeautifulSoup
或lxml
等库解析HTML,提取所需数据。 -
数据存储:将提取的数据存储到合适的格式,如CSV、数据库等。
-
异常处理:设计异常处理机制,确保在遇到错误时能够记录日志并优雅地处理。
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)
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()
driver
控制网页,选择城市与演出类型,抓取页面中的数据。3.4主程序
get_data
函数来抓取数据。save_data
函数保存到 CSV 文件。4.总结
此代码的主要功能是实现从一个在线演出门票网站抓取指定城市和演出类型的演出信息, 并将结果保存到 CSV 文件中。代码使用了 Selenium 进行网页操作,Pandas 进行数据处理,并支持根据用户输入动态选择数据。最终得到的数据包括剧照图片地址、标题、地址、演出时间、售票价格和售票状态,便于用户进行后续分析或查询。
作者:Eliauk78