spiderMain.py
class spider(object):
# 定义一个名为spider的类,用于爬取去哪儿网的景点数据
# 类名通常首字母大写,这里用小写也是可以的
def __init__(self):
# 类的初始化方法(构造函数)
# 当创建spider类的实例时,这个方法会自动执行
# 用于初始化对象的属性
self.url = \’https://piao.qunar.com/ticket/list.json?keyword=%s&page=%s\’
# 定义景点列表的API接口URL
# %s是占位符,后面会用具体值替换
# keyword参数:搜索关键词(如城市名)
# page参数:页码,用于分页获取数据
# 这个接口返回的是JSON格式的景点列表数据
self.detailUrl = \’https://piao.qunar.com/ticket/detail_%s.html\’
# 定义景点详情页的URL模板
# %s会被具体的景点ID替换
# 这个URL指向的是HTML页面,包含景点的详细介绍
self.commentUrl = \’https://piao.qunar.com/ticket/detailLight/sightCommentList.json?sightId=%s&pageSize=10&index=1\’
# 定义获取景点评论的API接口URL
# sightId参数:景点ID
# pageSize参数:每页返回的评论数量,这里设置为10条
# index参数:页码,这里固定为第1页
# 这个接口返回的是JSON格式的评论数据
self.headers = {
# 定义请求头信息,模拟真实浏览器访问
# 这是反爬虫的关键,让服务器认为请求来自真实用户
\’User-Agent\’:\’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\’,
# User-Agent:标识客户端浏览器类型
# 这里模拟的是Windows 10系统上的Chrome 117浏览器
\’Cookie\’:\’\’\’SECKEY_ABVK=b8IEmp75ejdwwDS1iK8GDzyH8xYTozHqQCcPpdTNsZM%3D; BMAP_SECKEY=R78tGbCTliH_UKforEFG6bkPu3YN2-OoHSZPBXBiN0pdWrDSzpYdzYjZ3u3gP2Xe26KVixeMVFejwgBR9CJ-w7ILBXooFVP75TGFGpEAJ2ShojKZ1DBu8BsGZ9WeUnWe3y1pszhfHjE-Dh2UTbV5NjBvXp99zmMbDBqLHoLYoKoxwRBDKt2wxwfwbUOuJ7ei; QN1=00006300306c49a231301a3f; QN300=s%3Dbaidu; QN99=3425; QunarGlobal=10.67.197.57_-315863c_184a309bb38_-1d6c|1669185576668; fid=d2274349-f1bd-4865-9f33-2d14799ef8d2; ctt_june=1654604625968
def init(self):
# 定义初始化方法,用于创建CSV文件并写入表头
# 注意:方法名应该是__init__才是构造函数,这里写成了init,是一个普通方法
if not os.path.exists(\’tempData.csv\’):
# 检查当前目录下是否存在\’tempData.csv\’文件
# os.path.exists()是Python的os模块方法,用于判断文件或文件夹是否存在
# 如果文件不存在,则执行下面的代码创建文件并写入表头
with open(\’tempData.csv\’, \’w\’, encoding=\’utf8\’, newline=\’\’) as csvfile:
# 使用with语句打开文件,可以自动管理文件资源的释放
# \’w\’参数表示以写入模式打开,如果文件不存在会创建,如果存在会覆盖
# encoding=\’utf8\’指定文件编码为UTF-8,支持中文
# newline=\’\’参数防止在Windows系统中写入多余的空行
wirter = csv.writer(csvfile)
# 创建一个CSV写入器对象,用于向CSV文件写入数据
# 注意:变量名拼写错误,应该是writer,这里写成了wirter
wirter.writerow([
# 写入一行数据,这里是CSV文件的表头(列名)
# 每个字符串代表一列的名称
\’title\’, # 景点标题/名称
\’level\’, # 景点等级(如5A景区、4A景区等)
\’province\’, # 景点所在省份
\’star\’, # 星级评分(通常是0-50分,对应0-5星)
\’detailAddress\’, # 详细地址
\’shortIntro\’, # 简短介绍
\’detailUrl\’, # 详情页URL
\’score\’, # 评分(通常是0-5分)
\’price\’, # 价格
\’commentsTotal\’, # 评论总数
\’detailIntro\’, # 详细介绍
\’img_list\’, # 图片列表(JSON格式存储)
\’comments\’, # 评论列表(JSON格式存储)
\’cover\’, # 封面图片URL
\’discount\’, # 折扣信息
\’saleCount\’ # 销售数量
])
# ============================================================================
def send_request(self, url):
# 定义发送HTTP请求的方法,参数url是要请求的地址
response = requests.get(url, headers=self.headers)
# 使用requests库发送GET请求
# headers=self.headers使用初始化时设置的请求头(包含User-Agent和Cookie)




