drug_pipelines.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import time
  2. from itertools import product
  3. from area_info.city_name_to_id_2 import get_city
  4. from commons.conn_mysql import MySQLPoolOn2
  5. from commons.sql_data import RETRIEVE_SCRAPE_INSERT_COLUMNS, sql_map
  6. from commons.Logger import get_spider_logger
  7. from pipelines.shop_pipelines import ShopPipeline
  8. class DrugPipeline:
  9. def __init__(self, spider_name: str):
  10. self.db_online = MySQLPoolOn2()
  11. self.sql_map = sql_map
  12. self.crawl_count = 0
  13. self.spider_name = spider_name
  14. self.logger = get_spider_logger(spider_name)
  15. self.shop_pipeline = ShopPipeline(spider_name)
  16. @staticmethod
  17. def _db_int(val):
  18. if val is None or val == "":
  19. return 0
  20. try:
  21. return int(val)
  22. except (TypeError, ValueError):
  23. return 0
  24. @staticmethod
  25. def _db_decimal(val):
  26. if val is None or val is False:
  27. return 0.0
  28. if isinstance(val, (int, float)) and not isinstance(val, bool):
  29. return float(val)
  30. s = str(val).strip()
  31. if not s:
  32. return 0.0
  33. try:
  34. return float(s)
  35. except ValueError:
  36. return 0.0
  37. def get_shop_city(self, product):
  38. # 补齐店铺等信息
  39. sql_data = """ SELECT *
  40. FROM `retrieve_scrape_shop_info`
  41. WHERE `platform` = %s
  42. AND `city` IS NOT NULL
  43. AND `city` != '' and `city` !='未知' AND `shop` = %s LIMIT 1"""
  44. data = self.db_online.select_data(sql_data, (str(product["platform"]), product.get("shop_name", "")))
  45. if data:
  46. shop_row = data[0]
  47. if not product.get("city_id"):
  48. product["city_name"] = shop_row.get("city", "") or product.get("city_name", "")
  49. city_id, province_id, city, province = get_city(shop_row["city"])
  50. product["city_id"] = city_id
  51. product["province_id"] = province_id
  52. product["city_name"] = city
  53. product["province_name"] = province
  54. product["area_info"] = shop_row.get("contact_address", product.get("area_info", ""))
  55. product["company_name"] = shop_row.get("business_license_company", product.get("company_name", ""))
  56. return product
  57. def storge_data(self, product):
  58. product = self.get_shop_city(product)
  59. row = {
  60. "platform_id": product["platform"],
  61. "platform_item_id": str(product["item_id"]),
  62. "enterprise_id": self._db_int(product["enterprise_id"]),
  63. "product_name": product["product_name"] or "",
  64. "product_specs": product["spec"] or "",
  65. "product_brand": product.get("product_brand") or "",
  66. "one_box_price": self._db_decimal(self._db_decimal(product.get("price"))/self._db_int(product.get("number", 1))),
  67. "link_url": product["detail_url"] or "",
  68. "store_name": product["shop_name"] or "",
  69. "store_url": product["shop_url"] or "",
  70. "shipment_province_id": self._db_int(product.get("shipment_province_id")),
  71. "shipment_province_name": product.get("shipment_province_name") or "",
  72. "shipment_city_id": self._db_int(product.get("shipment_city_id")),
  73. "shipment_city_name": product.get("shipment_city_name") or "",
  74. "manufacturer": product.get("factory_name") or "",
  75. "company_name": product.get("company_name") or "",
  76. "scrape_date": product["scrape_date"],
  77. "is_sold_out": self._db_int(product.get("is_sold_out")),
  78. "min_price": self._db_decimal(product.get("price")),
  79. "sales": product["sales"] or "",
  80. "inventory": str(product["stock_count"]) if product["stock_count"] not in (None, "") else "",
  81. "snapshot_url": product["snapshot_url"] or "",
  82. "approval_number": product["approval_num"] or "",
  83. "expiry_date": product["deadline"] or "",
  84. "update_time": time.strftime("%Y-%m-%d %H:%M:%S"),
  85. "insert_time": time.strftime("%Y-%m-%d %H:%M:%S"),
  86. "number": self._db_int(product.get("number", 1)),
  87. "task_id": self._db_int(product.get("task_id") or product.get("collect_task_id")),
  88. "anonymous_store_name": product.get("anonymous_store_name") or "",
  89. "search_name": product.get("search_name") or "",
  90. "collect_config_info": product.get("collect_config_info") or "",
  91. "area_info": product.get("area_info") or "",
  92. "city_name": product.get("city_name") or "",
  93. "city_id": self._db_int(product.get("city_id")),
  94. "province_name": product.get("province_name") or "",
  95. "province_id": self._db_int(product.get("province_id")),
  96. "collect_equipment_account_id": self._db_int(product.get("account_id")),
  97. "collect_region_id": self._db_int(product.get("collect_region_id")),
  98. "collect_round": self._db_int(product.get("collect_round")),
  99. "shop_id": product.get("shop_name") or "",
  100. "company_id": product.get("shop_name") or "",
  101. }
  102. tpl = tuple(row[k] for k in RETRIEVE_SCRAPE_INSERT_COLUMNS)
  103. params = tpl
  104. sql = self.sql_map["retrieve_scrape_insert_if_absent_sql"]
  105. affected_rows = self.db_online.execute(sql, params)
  106. # #endregion
  107. if affected_rows > 0:
  108. self.crawl_count += 1
  109. self.logger.info(
  110. "pipeline入库成功 spider=%s item_id=%s total=%s",
  111. self.spider_name,
  112. product.get("item_id"),
  113. self.crawl_count,
  114. )
  115. else:
  116. self.logger.info(
  117. "pipeline跳过入库(已存在或失败) item_id=%s",
  118. product.get("item_id"),
  119. )
  120. # 存入店铺表
  121. shop_data = {
  122. "shop": product["shop_name"] or "",
  123. "shop_id": product["shop_name"] or "",
  124. "company_id": product["shop_name"] or "",
  125. "shop_url": product["shop_url"] or "",
  126. "city": product.get("city_name") or "",
  127. "qualification_number": "",
  128. "business_license_company": product.get("company_name") or "",
  129. "province": product.get("province_name") or "",
  130. "scrape_date": time.strftime("%Y-%m-%d %H:%M:%S"),
  131. "business_license_address": "",
  132. "create_time": time.strftime("%Y-%m-%d %H:%M:%S"),
  133. "update_time": time.strftime("%Y-%m-%d %H:%M:%S"),
  134. "platform": product["platform"]
  135. }
  136. try:
  137. self.shop_pipeline.storge_data(shop_data)
  138. except Exception as e:
  139. pass
  140. return affected_rows
  141. if __name__ == '__main__':
  142. pass