基于DrissionPage的某海鲜问价脚本,需自行编辑sku文件
本帖最后由 苏紫方璇 于 2024-11-17 21:47 编辑"""
使用前需修改sku内容
todo: 文件输入路径:sku_path
"""
import csv
import json
import os
import random
import time
from DrissionPage import WebPage
from DrissionPage.common import Settings
Settings.singleton_tab_obj = False
class IdlefishPCWeb:
"""问价pc端web"""
# 类属性
sku_path = r'.\sku.json'
"""
sku.json格式:
{
"产品关键字1": {
"lowest_price": 0,
"highest_price": 9999
},
"产品关键字2": {
"lowest_price": 500,
"highest_price": 2000
},
"产品关键字3": {
"lowest_price": 666,
"highest_price": 8888
}
}
"""
def __init__(self):
"""初始化实例属性"""
pass
# 不依赖于类的状态或实例变量,仅根据传入的参数执行操作时使用静态方法。
@staticmethod
def create_file(path):
"""创建目录或文件"""
result = open(path, 'w', encoding='utf-8')
return result
@staticmethod
def delete_file(filename):
"""删除文件"""
os.remove(filename)
@staticmethod
def read_json_file(path):
"""逐行读取json文件"""
try:
with open(path, 'r', encoding='utf-8') as file:
data = json.load(file)
return data
except FileNotFoundError:
print('文件不存在')
@staticmethod
def writer_csv(file_path, data):
"""写入csv文件"""
with open(file=file_path, mode='a', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerow(data)
@staticmethod
def read_csv(file_path):
"""读取csv文件"""
with open(file=file_path, mode='r', encoding='utf-8') as f:
reader = csv.reader(f)
data = []
for row in reader:
data.extend(row)# 使用 extend 方法将每一行的数据添加到 data 列表中
return data
@staticmethod
def launch_page(url):
"""启动浏览器"""
page = WebPage('d')
# page = WebPage('s')
# page.set.window.max()
page.set.load_mode.none()
page.get(url)
if page.ele('登录', timeout=3):
input('请手动完成登录~完成后按下Enter键继续执行')
return page
def list_page_data(self, products, select_product, page):
"""获取列表页数据"""
# 价格区间
lowest_price = str(int(products[select_product['lowest_price'))# 价格区间最低价
highest_price = str(int(products[select_product['highest_price'))# 价格区间最高价
# 匹配价格区间元素
price_range = page.eles('tag:input@@class^search-price-input--')
price_range.input(lowest_price)# 输入最低价
price_range.input(highest_price)# 输入最高价
# 价格排序条件筛选
page.eles('@class=search-select-title--zzthyzLG').hover()# 价格元素悬停,露出价格排序元素
time.sleep(random.uniform(1, 1.5))
page.eles('@class=search-select-item--H_AJBURX').click()# 价格从低到高排序
# time.sleep(random.uniform(0.5, 1))
# page.eles('@class^search-checkbox--fULWOSyM ').click()# 筛选全新
# 列表页产品
products = page.eles('@class=feeds-item-wrap--rGdH_KoF')# 列表页产品列表(单页最大30)
self.details_page_data(page, products)
# 产品最大列表页数(筛选步骤后)
page_num = 1
max_page_num = page.eles('@class=search-pagination-page-box--AbqmJFFp ')[-.text
# 详细说明页数据获取完毕后翻页(若当前为最后一页则跳过)
while page_num != max_page_num:
page.eles('@class=search-page-tiny-arrow-container--tVZE99sy').click()# 向后翻页
products = page.eles('@class=feeds-item-wrap--rGdH_KoF')# 列表页产品列表(单页最大30)
self.details_page_data(page, products)
page_num += 1
@staticmethod
def details_page_data(page, products):
"""新标签页打开详情页并发起问题"""
for product in products:
product_url = product.attr('href')
# product.click()# 点击元素进入详情页
detail_tab = page.new_tab(product_url)
iwant_url = detail_tab.eles('@class=want--mVAXJTGv').attr('href')
iwant_tab = page.new_tab(iwant_url)
iwant_tab.ele('@class=ant-input css-apn68 ant-input-outlined textarea-no-border--cIId06_i ').input(
'麻烦问一下价格多少')# 问价语句 可自定义
iwant_tab.ele(
'@class=ant-btn css-apn68 ant-btn-default ant-btn-color-default ant-btn-variant-outlined').click()# 确认发送
iwant_tab.close()
detail_tab.close()
def main(self):
products = self.read_json_file(self.sku_path)
keyword = list(products.keys())# 关键字列表(需遍历)
for select_product in keyword:
url = f'https://www.goofish.com/search?q={select_product}'
print(f'当前搜索:{select_product}')
page = self.launch_page(url)
self.list_page_data(products, select_product, page)
if __name__ == '__main__':
web1 = IdlefishPCWeb()
web1.main()
插入代码的方法可以参考置顶帖
【公告】发帖代码插入以及添加链接教程(有福利)
https://www.52pojie.cn/thread-713042-1-1.html
(出处: 吾爱破解论坛)
6,感谢分享 感谢楼主分享 感谢大佬分享 感谢分享哈哈 苏紫方璇 发表于 2024-11-17 21:46
插入代码的方法可以参考置顶帖
【公告】发帖代码插入以及添加链接教程(有福利)
https://www.52pojie.cn ...
收到非常感谢!{:1_893:} 海鲜市场问多了也会出现滑块 还是综合分析靠谱 sg6465038 发表于 2024-11-21 07:26
海鲜市场问多了也会出现滑块
之前跑时候滑块是不影响后面元素加载的 也就是说在不处理验证弹窗情况下仍然不影响脚本运行 现在不知道还是不是这样:Dweeqw
页:
[1]