|
@@ -2,11 +2,11 @@
|
|
|
# Author : Charley
|
|
# Author : Charley
|
|
|
# Python : 3.10.8
|
|
# Python : 3.10.8
|
|
|
# Date : 2025/8/26 10:47
|
|
# Date : 2025/8/26 10:47
|
|
|
-import datetime
|
|
|
|
|
-import inspect
|
|
|
|
|
|
|
+import sys
|
|
|
import random
|
|
import random
|
|
|
import time
|
|
import time
|
|
|
import requests
|
|
import requests
|
|
|
|
|
+import datetime
|
|
|
import user_agent
|
|
import user_agent
|
|
|
from loguru import logger
|
|
from loguru import logger
|
|
|
from parsel import Selector
|
|
from parsel import Selector
|
|
@@ -63,15 +63,14 @@ def get_proxys(log):
|
|
|
|
|
|
|
|
|
|
|
|
|
@retry(stop=stop_after_attempt(5), wait=wait_fixed(1), after=after_log)
|
|
@retry(stop=stop_after_attempt(5), wait=wait_fixed(1), after=after_log)
|
|
|
-def get_parent_single_page(log, page, sql_pool):
|
|
|
|
|
|
|
+def get_parent_single_page(log, page):
|
|
|
"""
|
|
"""
|
|
|
单页请求
|
|
单页请求
|
|
|
:param log:
|
|
:param log:
|
|
|
:param page:
|
|
:param page:
|
|
|
- :param sql_pool:
|
|
|
|
|
:return: decrypted_res -> 解密后的数据
|
|
:return: decrypted_res -> 解密后的数据
|
|
|
"""
|
|
"""
|
|
|
- log.debug(f'Request {inspect.currentframe().f_code.co_name} for page: {page} .................')
|
|
|
|
|
|
|
+ log.debug(f'Request {sys._getframe().f_code.co_name} for page: {page} .................')
|
|
|
par = {"pageNum": str(page), "pageSize": "20"}
|
|
par = {"pageNum": str(page), "pageSize": "20"}
|
|
|
|
|
|
|
|
sign_result = api_sign(
|
|
sign_result = api_sign(
|
|
@@ -101,6 +100,7 @@ def get_parent_single_page(log, page, sql_pool):
|
|
|
|
|
|
|
|
decrypted_res = pokemon_aes_decrypt(response.text)
|
|
decrypted_res = pokemon_aes_decrypt(response.text)
|
|
|
# print(decrypted_res)
|
|
# print(decrypted_res)
|
|
|
|
|
+ # time.sleep(1111)
|
|
|
return decrypted_res
|
|
return decrypted_res
|
|
|
|
|
|
|
|
|
|
|
|
@@ -113,7 +113,7 @@ def parse_parent_list(log, list_data, sql_pool):
|
|
|
:return:
|
|
:return:
|
|
|
"""
|
|
"""
|
|
|
if not list_data:
|
|
if not list_data:
|
|
|
- log.error(f"{inspect.currentframe().f_code.co_name} list_data is None")
|
|
|
|
|
|
|
+ log.error(f"{sys._getframe().f_code.co_name} list_data is None")
|
|
|
return
|
|
return
|
|
|
|
|
|
|
|
# info_list = []
|
|
# info_list = []
|
|
@@ -124,7 +124,7 @@ def parse_parent_list(log, list_data, sql_pool):
|
|
|
|
|
|
|
|
# 20260327 增加系列过滤 '周边'
|
|
# 20260327 增加系列过滤 '周边'
|
|
|
if "周边" in expansion_series:
|
|
if "周边" in expansion_series:
|
|
|
- log.debug(f"{inspect.currentframe().f_code.co_name}过滤系列: {expansion_series}")
|
|
|
|
|
|
|
+ log.debug(f"{sys._getframe().f_code.co_name}过滤系列: {expansion_series}")
|
|
|
continue
|
|
continue
|
|
|
# data_dict = {
|
|
# data_dict = {
|
|
|
# "parent_id": parent_id,
|
|
# "parent_id": parent_id,
|
|
@@ -135,7 +135,7 @@ def parse_parent_list(log, list_data, sql_pool):
|
|
|
# print(data_dict)
|
|
# print(data_dict)
|
|
|
# info_list.append(data_dict)
|
|
# info_list.append(data_dict)
|
|
|
try:
|
|
try:
|
|
|
- log.debug(f"{inspect.currentframe().f_code.co_name} Request -> get_child_list, parent_id: {parent_id}")
|
|
|
|
|
|
|
+ log.debug(f"{sys._getframe().f_code.co_name} Request -> get_child_list, parent_id: {parent_id}")
|
|
|
get_child_list(log, sql_pool, parent_id, expansion_series, expansion_img)
|
|
get_child_list(log, sql_pool, parent_id, expansion_series, expansion_img)
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
log.error(f"Error parsing child list: {e}")
|
|
log.error(f"Error parsing child list: {e}")
|
|
@@ -154,7 +154,7 @@ def get_parent_list(log, sql_pool):
|
|
|
|
|
|
|
|
while page <= max_page:
|
|
while page <= max_page:
|
|
|
try:
|
|
try:
|
|
|
- result = get_parent_single_page(log, page, sql_pool)
|
|
|
|
|
|
|
+ result = get_parent_single_page(log, page)
|
|
|
|
|
|
|
|
if result.get("code") != 0:
|
|
if result.get("code") != 0:
|
|
|
log.error(f"请求失败: {result.get('message')}")
|
|
log.error(f"请求失败: {result.get('message')}")
|
|
@@ -210,7 +210,7 @@ def get_child_single_page(log, page, parentId):
|
|
|
:param parentId: 查询的父系列id
|
|
:param parentId: 查询的父系列id
|
|
|
:return:
|
|
:return:
|
|
|
"""
|
|
"""
|
|
|
- log.debug(f'Request {inspect.currentframe().f_code.co_name} for page: {page} .................')
|
|
|
|
|
|
|
+ log.debug(f'Request {sys._getframe().f_code.co_name} for page: {page} .................')
|
|
|
par = {'pageNum': str(page), 'pageSize': '20', 'parentId': str(parentId)}
|
|
par = {'pageNum': str(page), 'pageSize': '20', 'parentId': str(parentId)}
|
|
|
sign_result = api_sign(
|
|
sign_result = api_sign(
|
|
|
timeout=1221,
|
|
timeout=1221,
|
|
@@ -254,7 +254,7 @@ def parse_child_list(log, list_data, sql_pool, parentId, expansion_series, expan
|
|
|
:return:
|
|
:return:
|
|
|
"""
|
|
"""
|
|
|
if not list_data:
|
|
if not list_data:
|
|
|
- log.error(f"{inspect.currentframe().f_code.co_name} list_data is None")
|
|
|
|
|
|
|
+ log.error(f"{sys._getframe().f_code.co_name} list_data is None")
|
|
|
return
|
|
return
|
|
|
|
|
|
|
|
info_list = []
|
|
info_list = []
|
|
@@ -283,7 +283,7 @@ def parse_child_list(log, list_data, sql_pool, parentId, expansion_series, expan
|
|
|
"description": description,
|
|
"description": description,
|
|
|
"crawler_language": crawler_language
|
|
"crawler_language": crawler_language
|
|
|
}
|
|
}
|
|
|
- # print(data_dict)
|
|
|
|
|
|
|
+ print(data_dict)
|
|
|
info_list.append(data_dict)
|
|
info_list.append(data_dict)
|
|
|
|
|
|
|
|
if info_list:
|
|
if info_list:
|
|
@@ -362,7 +362,7 @@ def get_series_single_page(log, item_tuple, page):
|
|
|
commodity_code = item_tuple[2]
|
|
commodity_code = item_tuple[2]
|
|
|
sales_date = item_tuple[3]
|
|
sales_date = item_tuple[3]
|
|
|
# print(child_id, child_name, commodity_code, sales_date)
|
|
# print(child_id, child_name, commodity_code, sales_date)
|
|
|
- log.debug(f'Request {inspect.currentframe().f_code.co_name} for ID: {child_id}, page: {page} .................')
|
|
|
|
|
|
|
+ log.debug(f'Request {sys._getframe().f_code.co_name} for ID: {child_id}, page: {page} .................')
|
|
|
par = {"banCardFlag": "0", "commodityIds": str(child_id), "commoditySelectedList": [
|
|
par = {"banCardFlag": "0", "commodityIds": str(child_id), "commoditySelectedList": [
|
|
|
{"id": str(child_id), "commodityName": child_name, "commodityCode": commodity_code, "salesDate": sales_date}],
|
|
{"id": str(child_id), "commodityName": child_name, "commodityCode": commodity_code, "salesDate": sales_date}],
|
|
|
"pageNum": str(page), "pageSize": "50"}
|
|
"pageNum": str(page), "pageSize": "50"}
|
|
@@ -415,7 +415,7 @@ def parse_series(log, list_data, sql_pool, item_tuple):
|
|
|
:return:
|
|
:return:
|
|
|
"""
|
|
"""
|
|
|
if not list_data:
|
|
if not list_data:
|
|
|
- log.error(f"{inspect.currentframe().f_code.co_name} list_data is None")
|
|
|
|
|
|
|
+ log.error(f"{sys._getframe().f_code.co_name} list_data is None")
|
|
|
return
|
|
return
|
|
|
# info_list = []
|
|
# info_list = []
|
|
|
for item in list_data:
|
|
for item in list_data:
|
|
@@ -436,7 +436,7 @@ def parse_series(log, list_data, sql_pool, item_tuple):
|
|
|
try:
|
|
try:
|
|
|
get_details_page(log, detail_id, item_tuple, sql_pool)
|
|
get_details_page(log, detail_id, item_tuple, sql_pool)
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
- log.error(f"{inspect.currentframe().f_code.co_name} {detail_id} 请求异常: {e}")
|
|
|
|
|
|
|
+ log.error(f"{sys._getframe().f_code.co_name} {detail_id} 请求异常: {e}")
|
|
|
|
|
|
|
|
time.sleep(random.randint(1, 5) / 10)
|
|
time.sleep(random.randint(1, 5) / 10)
|
|
|
# if info_list:
|
|
# if info_list:
|
|
@@ -506,7 +506,7 @@ def get_details_page(log, card_id, item_tuple, sql_pool):
|
|
|
:param sql_pool:
|
|
:param sql_pool:
|
|
|
"""
|
|
"""
|
|
|
log.debug(
|
|
log.debug(
|
|
|
- f'Request {inspect.currentframe().f_code.co_name} for card_id: {card_id} .................')
|
|
|
|
|
|
|
+ f'Request {sys._getframe().f_code.co_name} for card_id: {card_id} .................')
|
|
|
par = {"id": str(card_id)}
|
|
par = {"id": str(card_id)}
|
|
|
sign_result = api_sign(
|
|
sign_result = api_sign(
|
|
|
timeout=1221,
|
|
timeout=1221,
|
|
@@ -562,6 +562,7 @@ def parse_details(log, list_data, sql_pool, card_id, item_tuple):
|
|
|
child_id = item_tuple[0]
|
|
child_id = item_tuple[0]
|
|
|
child_name = item_tuple[1]
|
|
child_name = item_tuple[1]
|
|
|
commodity_code = item_tuple[2]
|
|
commodity_code = item_tuple[2]
|
|
|
|
|
+ sales_date = item_tuple[3]
|
|
|
expansion_series = item_tuple[4]
|
|
expansion_series = item_tuple[4]
|
|
|
"""
|
|
"""
|
|
|
pg_value -> commodity_code
|
|
pg_value -> commodity_code
|
|
@@ -570,12 +571,12 @@ def parse_details(log, list_data, sql_pool, card_id, item_tuple):
|
|
|
"""
|
|
"""
|
|
|
|
|
|
|
|
if not list_data:
|
|
if not list_data:
|
|
|
- log.error(f"{inspect.currentframe().f_code.co_name} list_data is None")
|
|
|
|
|
|
|
+ log.error(f"{sys._getframe().f_code.co_name} list_data is None")
|
|
|
return
|
|
return
|
|
|
|
|
|
|
|
item = list_data.get("data")
|
|
item = list_data.get("data")
|
|
|
if not item:
|
|
if not item:
|
|
|
- log.error(f"{inspect.currentframe().f_code.co_name} item is None")
|
|
|
|
|
|
|
+ log.error(f"{sys._getframe().f_code.co_name} item is None")
|
|
|
return
|
|
return
|
|
|
|
|
|
|
|
# pg_value
|
|
# pg_value
|
|
@@ -592,6 +593,7 @@ def parse_details(log, list_data, sql_pool, card_id, item_tuple):
|
|
|
"major_category_name": expansion_series,
|
|
"major_category_name": expansion_series,
|
|
|
"pg_value": commodity_code,
|
|
"pg_value": commodity_code,
|
|
|
"pg_label": child_name,
|
|
"pg_label": child_name,
|
|
|
|
|
+ "sales_date": sales_date,
|
|
|
"card_id": card_id,
|
|
"card_id": card_id,
|
|
|
"card_name": card_name,
|
|
"card_name": card_name,
|
|
|
"card_no": card_no,
|
|
"card_no": card_no,
|
|
@@ -610,7 +612,7 @@ def jz_pokemon_main(log):
|
|
|
"""
|
|
"""
|
|
|
主函数
|
|
主函数
|
|
|
"""
|
|
"""
|
|
|
- log.info(f'开始运行 {inspect.currentframe().f_code.co_name} 爬虫任务.............................................')
|
|
|
|
|
|
|
+ log.info(f'开始运行 {sys._getframe().f_code.co_name} 爬虫任务.............................................')
|
|
|
|
|
|
|
|
# 配置 MySQL 连接池
|
|
# 配置 MySQL 连接池
|
|
|
sql_pool = MySQLConnectionPool(log=log)
|
|
sql_pool = MySQLConnectionPool(log=log)
|
|
@@ -624,7 +626,7 @@ def jz_pokemon_main(log):
|
|
|
try:
|
|
try:
|
|
|
get_parent_list(log, sql_pool)
|
|
get_parent_list(log, sql_pool)
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
- log.error(f"{inspect.currentframe().f_code.co_name} Request get_category_list error: {e}")
|
|
|
|
|
|
|
+ log.error(f"{sys._getframe().f_code.co_name} Request get_parent_list error: {e}")
|
|
|
|
|
|
|
|
# 获取商品详情
|
|
# 获取商品详情
|
|
|
log.debug(f"........... 获取商品详情 ..........")
|
|
log.debug(f"........... 获取商品详情 ..........")
|
|
@@ -633,7 +635,9 @@ def jz_pokemon_main(log):
|
|
|
# "pageNum": str(page), "pageSize": "50"}
|
|
# "pageNum": str(page), "pageSize": "50"}
|
|
|
# 2026-03-27 18:11:00 gmt_create_time字段 查询今天的数据
|
|
# 2026-03-27 18:11:00 gmt_create_time字段 查询今天的数据
|
|
|
sql_ietm_id_list = sql_pool.select_all(
|
|
sql_ietm_id_list = sql_pool.select_all(
|
|
|
- f"SELECT DISTINCT child_id,child_name,commodity_code,sales_date,expansion_series FROM pokemon_jianz_category WHERE crawler_language='{crawler_language}' AND gmt_create_time >= '{datetime.datetime.now().strftime('%Y-%m-%d 00:00:00')}'")
|
|
|
|
|
|
|
+ # f"SELECT DISTINCT child_id,child_name,commodity_code,sales_date,expansion_series FROM pokemon_jianz_category WHERE crawler_language='{crawler_language}'"
|
|
|
|
|
+ f"SELECT DISTINCT child_id,child_name,commodity_code,sales_date,expansion_series FROM pokemon_jianz_category WHERE crawler_language='{crawler_language}' AND gmt_create_time >= '{datetime.datetime.now().strftime('%Y-%m-%d 00:00:00')}'"
|
|
|
|
|
+ )
|
|
|
# sql_ietm_id_list = [item_id[0] for item_id in sql_ietm_id_list]
|
|
# sql_ietm_id_list = [item_id[0] for item_id in sql_ietm_id_list]
|
|
|
log.debug(f"获取商品详情长度为: {len(sql_ietm_id_list)}")
|
|
log.debug(f"获取商品详情长度为: {len(sql_ietm_id_list)}")
|
|
|
for item_tuple in sql_ietm_id_list:
|
|
for item_tuple in sql_ietm_id_list:
|
|
@@ -644,9 +648,9 @@ def jz_pokemon_main(log):
|
|
|
log.error(f"Request get_details error: {e}")
|
|
log.error(f"Request get_details error: {e}")
|
|
|
|
|
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
- log.error(f'{inspect.currentframe().f_code.co_name} error: {e}')
|
|
|
|
|
|
|
+ log.error(f'{sys._getframe().f_code.co_name} error: {e}')
|
|
|
finally:
|
|
finally:
|
|
|
- log.info(f'爬虫程序 {inspect.currentframe().f_code.co_name} 运行结束,等待下一轮的采集任务............')
|
|
|
|
|
|
|
+ log.info(f'爬虫程序 {sys._getframe().f_code.co_name} 运行结束,等待下一轮的采集任务............')
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if __name__ == '__main__':
|