爬取单个商品链接的所有图片链接,视频链接,标题,店铺名
import time
from DrissionPage import ChromiumPage
import csv
from lxml import etree
import json
# 爬取单个链接详情数据【函数】
# 爬取 单个链接 详情数据
def sigle_link(url): # url:单个商品链接的详情网址
# 实例化浏览器对象
chrom=ChromiumPage()
# 监听数据包 https://h5api.m.tmall.com/h5/mtop.taobao.pcdetail.data.get/1.0/ 商品详情
# 先监测数据包目的是因为第一次运行可能需求手动登录,配合chrom.listen.wait(), 若数据包一直没有出现,则会一直等待,直至数据包出现, 提高容错率
data_bag = f"https://h5api.m.tmall.com/h5/mtop.taobao.pcdetail.data.get/1.0/"
chrom.listen.start(data_bag)
# 打开网页【商品链接详情页】
chrom.get(url)
print("如需求登录或验证,请手动登陆!!!")
# 等待数据包加载
# 在 DrissionPage 的监听功能中,默认情况下,chrom.listen.wait() 方法如果没有指定 timeout 参数,它会永久等待,直到捕获到目标数据包为止。
resp = chrom.listen.wait() # 第一次运行时,可能需要你手动登录, 登录完成后才能获取数据
print("成功跳转到:\n"+url)
print("获取到数据包!!!开始尝试解析!!!")
# 获取响应数据
response_data = resp.response.body
# print("处理前:")
# print(response_data)
# 检查response_data是否为字节类型。在网络请求中,从服务器获取的响应数据有时会以字节类型返回,而后续处理 JSON 数据需要字符串类型,所以需要进行检查和转换
if isinstance(response_data, bytes):
print("response_data是字节类型,使用decode('utf-8')方法将其解码为 UTF - 8 编码的字符串")
response_data = response_data.decode('utf-8')
try:
# 处理JSONP格式,去掉外层包裹
start_index = response_data.find('{') # 查找字符串response_data中第一个{的位置,这是 JSON 数据的起始位置
end_index = response_data.rfind('}') # 查找字符串response_data中最后一个}的位置,这是 JSON 数据的结束位置
# 通过切片操作,提取出完整的 JSON 字符串部分。
# 有些接口返回的数据可能是 JSONP 格式,即数据被包裹在一个函数调用中
# 例如mtopjsonp5({"key": "value"}),这一步是去除包裹部分,只保留 JSON 数据本身
json_str = response_data[start_index:end_index + 1]
response_json_data = json.loads(json_str) # 使用json.loads()函数将提取的 JSON 字符串转换为 Python 字典
# print("处理后:")
# print(response_json_data)
except json.JSONDecodeError as e:
print(f"解析JSON数据时出错: {e}")
# 解析数据
# 初始化默认值,避免数据缺失时出现错误
sigle_link_data = {
'店铺': '未找到店铺信息',
'商品标题': '未找到商品标题',
'图片': [],
'视频': []
}
sigle_link_data['商品链接'] = url
# 获取 response_json_data 中的 data 部分
data = response_json_data.get('data')
if data:
seller = data.get('seller')
if seller == None: # 应对反爬的措施之一, 检查数据是否为空,若为空说明被反爬,需要人工介入检查!!!
print("数据为空!!!")
print("请检查是否需要真人验证!!!")
print("人工检验中.....................................................")
errno_information = input("若检验完成,请输入 1:\n")
if errno_information == 1:
print("检验完成!!!即将重新继续获取该链接的数据!!!")
sigle_link_data = sigle_link(url)
print("该链接的数据重新获取成功!!!")
print("重新获取的商品链接详情数据如下:")
print(sigle_link_data)
print("即将把重新获取的数据返回,并写入csv文件!!!")
return sigle_link_data # 返回重新获取的该链接详情数据
if seller:
# 店铺信息
store = seller.get('shopName')
if store:
sigle_link_data['店铺'] = store
item = data.get('item')
if item:
# 商品标题信息
shop_title = item.get('title')
if shop_title:
sigle_link_data['商品标题'] = shop_title
# 图片信息
images = item.get('images', [])
for image in images:
sigle_link_data['图片'].append(image)
# 视频信息
videos = item.get('videos', [])
for video in videos:
video_url = video.get('url')
if video_url:
sigle_link_data['视频'].append(video_url)
# print(sigle_link_data)
return sigle_link_data # 返回单个链接的详情数据
# 写入csv文件【函数】
# 将单个链接的数据写入csv文件
def sigle_link_data_writer_to_csv(data,csv_writer): # data:单个链接的详情数据
for image in data['图片']:
csv_writer.writerow({
'店铺': data['店铺'],
'商品链接': data['商品链接'],
'商品标题': data['商品标题'],
'图片': image,
'视频': ''
})
for video in data['视频']:
csv_writer.writerow({
'店铺': data['店铺'],
'商品链接': data['商品链接'],
'商品标题': data['商品标题'],
'图片': '',
'视频': video
})
# 测试函数
def text():
url='http://click.simba.taobao.com/cc_im?p=%CD%B6%D3%B0%BB%FA%B0%EC%B9%AB&s=2023495167&k=1977&e=qEscFPqUo0EvxTNePaNIcB%2Bz%2F76h5XVWPXAumbtCMNRHVq4WSGi0ueVvi7MBsIlbh%2Bdell%2F0T%2BxsRodrsPT3GymPaw%2BDI0qEuKKUVp9savhpypaynkwwSqB0l3veIaAt5sHHRcb%2Bnvg9lxyJB4%2BY0IriPa4U89UPqunYUDECSP%2FmjH66ahRMapkc4bzSQaQj%2FUM0fDfajXS5BLa03tHOtCWMebFOcBBTs%2BKuO1hLBTa3G00G6hFE7bY9pkW0LK6FZbCe7oO%2BqHIAEeOsF2r6MtmK5XbMpd1vipRSFaEfnx%2Ba5Hl86jaNZP8uEriplDD%2FLsodMldtYDG64UzfK7ToFqv4uz%2FxcRKssSlzRSxo%2BTQpfDhCAj5q7EatVB2TYUtC2J1rZaWwYJrfdfuC9KmLq8stKuf9fwFCBauuq13wPhmL5QhucoL0RxPI7L58B3AHzylQ86ezh7vB5NSG1ccVbj7997D%2FdJN50pz%2FnuknO1KO%2FZnqgCQM%2Ffnkd%2BXlNbyNAYC0bQ1vcVVb%2FEgs6vMYIdq3S9R0h1OOVUS5bwNQ0Nv7bzW0zjEYc1O9ikwWCTmcN4WhhrJuiUweYcCBLc0Za%2FsaRz8R0if5xGoEZjXGXpkLC040medQc8jYqGf8jjy%2FSErvSS84%2B%2BcFHcWh4EiHqM7fPmICj6Ku%2FfeIeJonGeFp1bGxubXHvTNgEY4wra7oQGhS4sbdCxWLekWoKtALLwZbKIwKbjSRrEPGtZyzTMek8f66LjUjWB%2BvL3SzVurz%2BwBkpZY08I6J8TpEGBd%2BeTGT%2Bplh9xPexZkrdHnw5K%2FnjZ0QmEq5ade1DJdMUQJc33O8uMto%2BbjOxh%2Bws1jX6zRK7O8nGkXvD0899U3gjUJM3TEcpysDDCm5WlrdSET7UUi5vlCwuq6DUZ%2F1%2FNxFrpWr2ZBGvvBQtlKs6t8nUzuN50mSHDj4hRAqRyv2PkaMRP6GvNzLdEE6XPO3R4ZOsbNqB6Am942aRPmnLqADbyvZ4%2BMcTgz5umI79c9tsiceukhKdHA%2B35OYrF%2Bmr8S5Re5WpYKWM3b82%2FpNLBGNgJKr0HpMQo3Ei5a8odK6%2FKrFvjj1i61K1Ptj%2FIpnYPLxitxaQ1WM2ye37ugizNo%2Bev5Xn%2FQYrOST5ZUtZ41vZ5bvagAcsRhvnmiUoyfUN0c3LNUpFdo%2Fie5oKHDxbkc1Nvb6AYSSIOJMNfpp3acBX90e%2Bko2k4%2FO77%2FbXPaOM4S43bdcFmOu6uODCsuskS7A5fMA1%2BfnOO6grDQGAeYL44sb8k5Fln6AqfVi%2BAjIApsfNUudFqYabaWX3HcwY07dBUADrEMeb72UsvkKQ5wqyxse14l9bJcUnBApHtEjGM8d7YYTVxXrtqmpQE2HHqrXAsqo8iiSxpt8tFJjLsMRzRhZbUvZxXpx%2FW%2BXzc%2FCqo4zwXSWTCCreV9IKxFOsQbnIIAnEYsPuXfBR4AsYhCWBBKpCaeCCXXQ4KUrEU6xBucggL3TDfJoCkYbRSg%2BjtMqrQvUqmu2QEHXnB1e%2FXU0Dfp8H%2FbAU1gH3K2V0kjtdFxp8TyMW5u4TI1R%2Ft48UM8nMAy71noeVyoWb7WosA6be0XxDG7t%2FI22Ju%2FVqMn7qaoUgaeWpcmIgc7aV3QS3Xm0hzMyw2IZwR%2F0fVMHYbjmmbf789sbM94E38SrE%2FGnNE%2BkWcMP8RV53PtJQdD6fFP8v3o5YBOW3BqWK25gzd7h%2Bv3a%2BOJxjFpcttGMLyMeFLbmUl%2FIhHHoVvoTTzyl7Ndiw47dsNAiIO%2FqEFs6IWYa2K5xeCPgaAhL10p04ZxlphrNcIm8gTfjtK7omDUBZpgMdVdLYQ8crIj%2BnvwUdJQ1%2B5cNzyDN0iAKWpqvCg2Sp41QWG6xL0d0MGPw%2F1WDI1FWRufng5LozlKvKlkrsPyo7M98Pv33sP90k3n%2B6OzuLnFLpSTAR22S6C7FlGYBzKU0kUJuv4hy1rBU3A%3D%3D'
# 文件路径 【保存多个商品详情数据的csv文件】
file = r".\data\自动化天猫商品链接详情数据.csv"
# 创建文件对象,用于保存数据
csv_file=open(file,mode='w',encoding='utf-8-sig',newline='')
# 字典写入的方法
csv_writer=csv.DictWriter(
csv_file,
fieldnames=['店铺','商品链接','商品标题','图片','视频']
)
# 写入表头
csv_writer.writeheader()
# 获取单个链接的数据
sigle_link_data = sigle_link(url)
print(sigle_link_data)
# 写入单个链接的数据
sigle_link_data_writer_to_csv(sigle_link_data,csv_writer)
csv_file.close()
if __name__ == '__main__':
text()