Python爬虫:1药城店铺爬虫(完整代码)

embedded/2025/2/6 17:25:32/

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️
🐴作者:秋无之地

🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据开发、数据分析等。

🐴欢迎小伙伴们点赞👍🏻、收藏⭐️、留言💬、关注🤝,关注必回关

一、确定目标数据

1、先打开目标网站,找到目标数据所在的页面,点击逛店铺

2、找到目标数据所在的api或页面

通过f12打开调试模式,通过搜索关键词,找到关键词所在的api或页面

3、观察请求参数

1)请求参数:有sign和token加密参数

2)翻页:position参数变动了,1_0_0表示第一页,2_0_0表示第二页。

二、请求接口

使用requests库请求接口,返回数据

python">def get_shop_list(self,per=10,position='1_0_0'):'''获取店铺列表:param per:每页展示条数:param position:开始位置:return:'''try:url = self.uri + "/druggmp/index/shopList"params = {"traderName":"yaoex_pc","trader":"pc","closesignature":"yes","timestamp":int(time.time()*1000),}data = {"traderName":"yaoex_pc","trader":"pc","closesignature":"yes","timestamp":int(time.time()*1000),"token":self.token,"queryAll":"yes","isSearch":"yes","per":per,"position":position,}self.log_.info(f"入参:{data}")resp = requests.post(url,headers=self.header,params=params,data=data).json()self.log_.info(f"出参数量:{len(resp['data']['shopList'])}")return resp['data']['shopList']except Exception as e:self.log_.error(str(e))return []

三、数据解析

将返回的数据进行正则匹配,然后通过遍历提取目标数据

python">'''获取店铺列表'''
shop_list = self.get_shop_list(per=10,position=position)
if not len(shop_list):self.log_.info('已经爬完,结束!')break
#遍历店铺
for shop_ in shop_list:#店铺idshop_id = shop_['enterpriseId']#店铺名称shop_name = shop_['shopName']#店铺logologo = shop_['logo']#是否自营self_str = shop_['shopExtTypeText']if self_str and self_str=='自营':is_self = 1else:is_self = 0#城市if 'shipAddress' in shop_:city = shop_['shipAddress']else:city = ''

四、数据存储

数据解析后,对数据进行拼接,然后持久化,存在csv文件

python">sql = f'''replace into yyc_shop(shop_id,shop_name,logo,shelves,is_self,biz_code,biz_url,yao_url,qs_url,official_name,province,city) 
values('{shop_id}','{shop_name}','{logo}',{shelves},{is_self},'{biz_code}','{biz_url}','{yao_url}','{qs_url}','{official_name}','{province}','{city}')'''
self.log_.info(f"插入sql:{sql}")
self.base_.mysql_data(sql)

文件内容:

五、完整代码

完整代码如下:

python">def get_shop_list(self,per=10,position='1_0_0'):'''获取店铺列表:param per:每页展示条数:param position:开始位置:return:'''try:url = self.uri + "/druggmp/index/shopList"params = {"traderName":"yaoex_pc","trader":"pc","closesignature":"yes","timestamp":int(time.time()*1000),}data = {"traderName":"yaoex_pc","trader":"pc","closesignature":"yes","timestamp":int(time.time()*1000),"token":self.token,"queryAll":"yes","isSearch":"yes","per":per,"position":position,}self.log_.info(f"入参:{data}")resp = requests.post(url,headers=self.header,params=params,data=data).json()self.log_.info(f"出参数量:{len(resp['data']['shopList'])}")return resp['data']['shopList']except Exception as e:self.log_.error(str(e))return []'''获取店铺列表'''
shop_list = self.get_shop_list(per=10,position=position)
if not len(shop_list):
self.log_.info('已经爬完,结束!')
break
#遍历店铺
for shop_ in shop_list:
#店铺id
shop_id = shop_['enterpriseId']
#店铺名称
shop_name = shop_['shopName']
#店铺logo
logo = shop_['logo']
#是否自营
self_str = shop_['shopExtTypeText']
if self_str and self_str=='自营':is_self = 1
else:is_self = 0
#城市
if 'shipAddress' in shop_:city = shop_['shipAddress']
else:city = '''''获取店铺上架数'''
shelves = self.get_shop_drug_count(shop_id=shop_id)'''获取店铺证件'''
shop_info = self.get_shopcert(shop_id=shop_id)
#地址
address = shop_info['data']['baseInfo']['address']
#省份
try:if city and city in address:province = address.split(city)[0]else:provs = address.split('省')province = provs[0]city = provs[1].split('市')[0]
except:province = ''
#供应商全称
official_name = shop_info['data']['baseInfo']['enterpriseName']
#图片列表
img_files = shop_info['data']['files']
# 企业营业执照
biz_url = ''
# 经营许可证
yao_url = ''
# 质量体系调查表
qs_url = ''
if len(img_files):for i in img_files:if '营业执照' in i['typeName']:biz_url = i['filePath']if '经营许可证' in i['typeName']:yao_url = i['filePath']if '质量体系调查表' in i['typeName']:qs_url = i['filePath']'''获取店铺营业执照编码'''
biz_code = ''
if biz_url:biz_code = self.get_shop_biz_code(img_link=biz_url)#替换插入数据库
sql = f'''replace into yyc_shop(shop_id,shop_name,logo,shelves,is_self,biz_code,biz_url,yao_url,qs_url,official_name,province,city) 
values('{shop_id}','{shop_name}','{logo}',{shelves},{is_self},'{biz_code}','{biz_url}','{yao_url}','{qs_url}','{official_name}','{province}','{city}')'''
self.log_.info(f"插入sql:{sql}")
self.base_.mysql_data(sql)

六、总结

Python爬虫主要分三步:

  1. 请求接口
  2. 数据解析
  3. 数据存储

版权声明

本文章版权归作者所有,未经作者允许禁止任何转载、采集,作者保留一切追究的权利。


http://www.ppmy.cn/embedded/160089.html

相关文章

【Vue3 完整学习笔记 - 第一部分】

Vue3 完整学习笔记 - 第一部分 Vue3 完整学习笔记 - 第一部分1. Vue3 基础入门1.1 Vue3 简介1.2 创建 Vue3 工程1.3 编写首个 Vue3 组件1.4 Composition API vs Options API1.5 setup 函数详解1.6 响应式数据处理 Vue3 完整学习笔记 - 第一部分 1. Vue3 基础入门 1.1 Vue3 简…

RGB565转BITMAP[C#---2]

这是楼主在开发C#上位机的时候遇到的另一个问题,怎么把RGB565转为BITMAP,在CSDN上搜索,要么是安卓平台的,要么是2011年的古早代码(还没排版),还是靠自己和DEEPSEEK的智慧解决了(●’◡’●) 当然…

【PyQt】keyPressEvent键盘按压事件无响应

问题描述 通过load ui 文件加载程序时,keyPressEvent键盘按压事件无响应 原因 主要是由于事件处理的方式和窗口的显示方式不正确所导致的。 解决代码 self:这里的self作为loadUi函数的第二个参数,意味着加载的界面将被设置为当前类实例&…

基于YOLO11的肺结节检测系统

基于YOLO11的肺结节检测系统 (价格90) LUNA16数据集 数据一共 1186张 按照8:1:1随机划分训练集(948张)、验证集(118张)与测试集(120张) 包含 nodule 肺结节 1种…

『 C++ 』中理解回调类型在 C++ 中的使用方式。

文章目录 案例 1:图形绘制库中的回调使用场景说明代码实现代码解释 案例 2:网络服务器中的连接和消息处理回调场景说明代码实现代码解释 案例 3:定时器中的回调使用场景说明代码实现代码解释 以下将通过不同场景给出几个使用回调类型的具体案…

Python之如何在Visual Studio Code 中写的python程序打包成可以在Windows系统下运行的.exe程序

要将你在 Visual Studio Code 中编写的 Python 程序打包成可以在 Windows 系统下运行的 .exe 文件,可以使用 PyInstaller 工具。以下是详细的操作步骤: 1. 安装 PyInstaller 首先,你需要安装 PyInstaller。打开终端(可以在 VS C…

GPU 硬件原理架构(一)

这张费米管线架构图能看懂了,整个GPU的架构基本就熟了。市面上有很多GPU厂家,他们产品的架构各不相同,但是核心往往差不多,整明白一了个基本上就可以触类旁通了。下面这张图信息量很大,可以结合博客GPU 英伟达GPU架构回…

《手札·开源篇》从开源到商业化:中小企业的低成本数字化转型路径——一位甲方信息化负责人与开源开发者的八年双重视角

在中小企业数字化转型的浪潮中,"低成本"与"可持续性"始终是悬在决策者头顶的双刃剑。作为曾操盘过30信息化项目、主导过开源ERP二次开发的信息化老兵,我试图通过"甲方信息化负责人"与"开源开发者"的双重身份&am…