【Python】03快速上手爬虫案例三:搞定药师帮
文章目录
- 前言
- 1、破解验证码
- 2、获取数据
前言
提示:通过用户名、密码、搞定验证码,登录进药师帮网站,然后抓取想要的数据。
爬取数据,最终效果图:

1、破解验证码
使用药师帮测试系统:https://dianrc.ysbang.cn/#/home

引入打码平台进行破解,我这里使用的是云码。
代码如下:
code_result.py
import json
import requests
import base64class YdmVerify(object):_custom_url = "http://api.jfbym.com/api/YmServer/customApi"_token = "" #云码的token_headers = {'Content-Type': 'application/json'}def common_verify(self, image, verify_type="10103"):#注意10110不行,这里要使用10103payload = {"image": base64.b64encode(image).decode(),"token": self._token,"type": verify_type}print(payload)resp = requests.post(self._custom_url, headers=self._headers, data=json.dumps(payload))print(resp.text)return resp.json()['data']['data']
# 云码打码对应代码
Y = YdmVerify()
with open("codeysb.png", 'rb') as f:img_content = f.read()
resp = Y.common_verify(img_content)
2、获取数据
步骤:
1)使用Chrome浏览器模拟打开网页
2)使用selenium自动登录
3)登录成功之后,继续在浏览器中打开需要获取数据的url
4)获取数据,导出cvs表格

代码如下(只获取第一页数据):
from selenium.webdriver.common.by import By
from selenium import webdriverimport time
import requests
from lxml import etree
from code_result import YdmVerify
import csvdriver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://dianrc.ysbang.cn/#/login?redirect=%2Fhome')
time.sleep(2)name = driver.find_element(By.NAME, 'userAccount') # 账号输入框位置
name.send_keys("") # 输入你的账号
pwd = driver.find_element(By.CSS_SELECTOR, "#password") # 密码输入框位置
pwd.send_keys("") # 输入你的密码
code = driver.find_element(By.CSS_SELECTOR, "#captcha") # 验证码输入框位置
imgCode = driver.find_element(By.CSS_SELECTOR, "#captchaImg") # 验证码图片位置imgCode.screenshot("codeysb.png") # 将验证码截图
time.sleep(1)# 云码打码
Y = YdmVerify()
with open("codeysb.png", 'rb') as f:img_content = f.read()
resp = Y.common_verify(img_content)
print(resp)
code.send_keys(resp)login = driver.find_element(By.CLASS_NAME, 'btn') # 找到登录的位置
login.click() # 点击登录按钮
time.sleep(2)# 获取数据
html=""
url = "https://dianrc.ysbang.cn/#/indexContent?page=1&pagesize=60&classify_id=&searchkey=%E5%BB%B6%E8%BF%AA%E8%AF%BA%20%E9%98%BF%E6%B3%95%E9%AA%A8%E5%8C%96%E9%86%87%E8%BD%AF%E8%83%B6%E5%9B%8A&onlyTcm=0&operationtype=1&provider_filter=&qualifiedLoanee=0&factoryNames=&specs=&drugId=-1&tagId=&showRecentlyPurchasedFlag=true&onlyShowRecentlyPurchased=false&onlySimpleLoan=false&sn=&deliverFloor=0&purchaseLimitFloor=0&validMonthFloor=0&activityType=%5B%5D&providerSelectList=%5B%5D&factorySelectList=%5B%5D&gradeNameSelectList=%5B%5D&exeStandardSelectList=%5B%5D&specSelectList=%5B%5D&classItem_0=null&classItem_1=null&classItem_2=null&tagName=&_t=1706324500733&_isReplace=true&trafficType=1"
driver.get(url)
driver.implicitly_wait(5)
time.sleep(5)
html = driver.page_source
print(html)
time.sleep(3)
driver.quit()parse = etree.HTML(html)
# 数据
all_tr = parse.xpath('//*[@id="wrapper"]/div[5]/div[3]/div')# 创建csv文件
with open('ysb.csv', 'a', encoding='utf_8_sig', newline='') as fp: header = ['名称','价格', '折扣价', '公司', '旗舰店', '有效期', '图片'] writer = csv.writer(fp) writer.writerow(header)for tr in all_tr:price2 = ''.join(tr.xpath('./div[2]/div[1]/div/span[2]/span/text()')).strip()if len(price2) == 0:price = ''.join(tr.xpath('./div[2]/div[1]/div/div/text()')).strip()else:price = ''.join(tr.xpath('./div[2]/div[1]/div/text()')).strip()tr_data = {'name': ''.join(tr.xpath('./div[2]/div[2]/span/text()')).strip(), # 名称'price': price, # 价格'price2': price2, # 折扣价'commpany': ''.join(tr.xpath('./div[2]/div[4]/text()')).strip(), # 公司'qjd': ''.join(tr.xpath('./div[3]/div[1]/span/a/text()')).strip(), # 旗舰店'yxq': ''.join(tr.xpath('./div[1]/span/text()')).strip(), # 有效期'img': ''.join(tr.xpath('./div[1]/img/@src')).strip(), # 图片}# 写入数据行with open('ysb.csv', 'a', encoding='utf_8_sig', newline='') as fp: fieldnames = ['name','price', 'price2', 'commpany', 'qjd', 'yxq', 'img'] writer = csv.DictWriter(fp, fieldnames) writer.writerow(tr_data)
代码如下(获取所有页数据):
from selenium.webdriver.common.by import By
from selenium import webdriverimport time
import requests
from lxml import etree
from code_result import YdmVerify
import csvdriver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://dianrc.ysbang.cn/#/login?redirect=%2Fhome')
time.sleep(2)name = driver.find_element(By.NAME, 'userAccount') # 账号输入框位置
name.send_keys("") # 输入你的账号
pwd = driver.find_element(By.CSS_SELECTOR, "#password") # 密码输入框位置
pwd.send_keys("") # 输入你的密码
code = driver.find_element(By.CSS_SELECTOR, "#captcha") # 验证码输入框位置
imgCode = driver.find_element(By.CSS_SELECTOR, "#captchaImg") # 验证码图片位置imgCode.screenshot("codeysb.png") # 将验证码截图
time.sleep(1)# 云码打码
Y = YdmVerify()
with open("codeysb.png", 'rb') as f:img_content = f.read()
resp = Y.common_verify(img_content)
print(resp)
code.send_keys(resp)login = driver.find_element(By.CLASS_NAME, 'btn') # 找到登录的位置
login.click() # 点击登录按钮
time.sleep(2)def getData(page):print(f"开始第{page}页数据获取")driver.implicitly_wait(5)time.sleep(5)html = driver.page_sourceparse = etree.HTML(html) # 数据all_tr = parse.xpath('//*[@id="wrapper"]/div[5]/div[3]/div')for tr in all_tr:price2 = ''.join(tr.xpath('./div[2]/div[1]/div/span[2]/span/text()')).strip()if len(price2) == 0:price = ''.join(tr.xpath('./div[2]/div[1]/div/div/text()')).strip()else:price = ''.join(tr.xpath('./div[2]/div[1]/div/text()')).strip()tr_data = {'name': ''.join(tr.xpath('./div[2]/div[2]/span/text()')).strip(), # 名称'price': price, # 价格'price2': price2, # 折扣价'commpany': ''.join(tr.xpath('./div[2]/div[4]/text()')).strip(), # 公司'qjd': ''.join(tr.xpath('./div[3]/div[1]/span/a/text()')).strip(), # 旗舰店'yxq': ''.join(tr.xpath('./div[1]/span/text()')).strip(), # 有效期'img': ''.join(tr.xpath('./div[1]/img/@src')).strip(), # 图片}# 写入数据行with open('ysb.csv', 'a', encoding='utf_8_sig', newline='') as fp: fieldnames = ['name','price', 'price2', 'commpany', 'qjd', 'yxq', 'img'] writer = csv.DictWriter(fp, fieldnames) writer.writerow(tr_data)if len(all_tr) == 60:return Trueprint(f"所有数据获取完成")# 创建csv文件
with open('ysb.csv', 'a', encoding='utf_8_sig', newline='') as fp: header = ['名称','价格', '折扣价', '公司', '旗舰店', '有效期', '图片'] writer = csv.writer(fp) writer.writerow(header)page = 1
url = f"https://dianrc.ysbang.cn/#/indexContent?page=1&pagesize=60&classify_id=&searchkey=%E5%BB%B6%E8%BF%AA%E8%AF%BA%20%E9%98%BF%E6%B3%95%E9%AA%A8%E5%8C%96%E9%86%87%E8%BD%AF%E8%83%B6%E5%9B%8A&onlyTcm=0&operationtype=1&provider_filter=&qualifiedLoanee=0&factoryNames=&specs=&drugId=-1&tagId=&showRecentlyPurchasedFlag=true&onlyShowRecentlyPurchased=false&onlySimpleLoan=false&sn=&deliverFloor=0&purchaseLimitFloor=0&validMonthFloor=0&activityType=%5B%5D&providerSelectList=%5B%5D&factorySelectList=%5B%5D&gradeNameSelectList=%5B%5D&exeStandardSelectList=%5B%5D&specSelectList=%5B%5D&classItem_0=null&classItem_1=null&classItem_2=null&tagName=&_t=1706324500733&_isReplace=true&trafficType=1"
driver.get(url)for i in range(0, 999):if getData(page):page+=1nextBtn = driver.find_element(By.CLASS_NAME, 'pagination-next') # 下一页按钮的位置nextBtn.click() # 点击下一页按钮else:driver.quit()break
注意:重要的是,登录成功之后,是使用driver.get(url)打开新的页面,通过html = driver.page_source去取页面数据。而不是使用r = requests.get,html = r.text 去取页面数据。
相关文章:
【Python】03快速上手爬虫案例三:搞定药师帮
文章目录 前言1、破解验证码2、获取数据 前言 提示:通过用户名、密码、搞定验证码,登录进药师帮网站,然后抓取想要的数据。 爬取数据,最终效果图: 1、破解验证码 使用药师帮测试系统:https://dianrc.ysb…...
C++异步编程
thread std::thread 类代表一个单独的执行线程。在创建与线程对象相关联时,线程会立即开始执行(在等待操作系统调度的延迟之后),从构造函数参数中提供的顶层函数开始执行。顶层函数的返回值被忽略,如果它通过抛出异常…...
dfs专题(记忆化搜索)P1141 01迷宫——洛谷(题解)
题目描述 有一个仅由数字 00 与 11 组成的 ��nn 格迷宫。若你位于一格 00 上,那么你可以移动到相邻 44 格中的某一格 11 上,同样若你位于一格 11 上,那么你可以移动到相邻 44 格中的某一格 00 上。 你的任务是&#…...
pip 安装出现报错 SSLError(SSLError(“bad handshake
即使设置了清华源: pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simplepip 安装包不能配置清华源,出现报错: Retrying (Retry(total2, connectNone, readNone, redirectNone, statusNone)) after connection broken by ‘SSLE…...
新概念英语第二册(46)
【New words and expressions】生词和短语(12) unload v. 卸(货) wooden adj. 木制的 extremely adv. 非常,极其 occur …...
动态规划入门题目
动态规划(记忆化搜索): 将给定问题划分成若干子问题,直到子问题可以被直接解决。然后把子问题的答保存下来以免重复计算,然后根据子问题反推出原问题解的方法 动态规划也称为递推(暴力深搜记忆中间状态结果…...
探索云性能测试的各项功能有哪些?
云性能测试作为现代软件开发和部署过程中不可或缺的一环,为确保系统在各种条件下的高效运行提供了关键支持。本文将介绍云性能测试的各项功能,帮助您更好地了解其在软件开发生命周期中的重要性。 1. 负载测试 云性能测试的首要功能之一是负载测试。通过模…...
(大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
今天,面试了一家公司,什么也不说先来三道面试题做做,第一题。 那么,我们就开始做题吧,谁叫我们是打工人呢。 题目是这样的: 统计除豪车外,销售最差的车 车辆按批销售,每次销售若干…...
Git安装,Git镜像,Git已安装但无法使用解决经验
git下载地址: Git - 下载 (git-scm.com) <-git官方资源 Git for Windows (github.com) <-github资源 CNPM Binaries Mirror (npmmirror.com) <-阿里镜像(推荐,镜…...
Python与CAD系列高级篇(二十五)分类提取坐标到excel(补充圆半径、线长度、圆弧)
目录 0 简述1 分类提取坐标到excel2 结果展示0 简述 上一篇中介绍了:对点、直线、多段线、圆、样条曲线分类读取坐标并提取到excel。考虑到进一步提取图形信息,此篇补充对圆半径、线长度以及圆弧几何信息的提取。 1 分类提取坐标到excel 代码实现: import math import nump…...
Linux安装Influxdb
Linux安装Influxdb 1、安装步骤1.1、安装Influxdb步骤1.2、Influxdb默认安装路径1.3、命令行操作Influxdb,建库,建用户1.3.1 进入influxdb命令行1.3.2 创建用户1.3.2 库查询和创建 1、安装步骤 1.1、安装Influxdb步骤 yum install -y wget #下载安装包…...
Flutter CustomPainter 属性介绍与使用
Flutter 中的 CustomPainter 是一个强大的工具,允许开发者通过自定义绘制来创建各种复杂的图形和动画。本文将介绍 CustomPainter 的一些重要属性以及如何使用它们来实现自定义绘制。 1. CustomPainter 简介 CustomPainter 是一个抽象类,用于自定义绘制…...
基于Javaweb开发的二手图书零售系统详细设计【附源码】
基于Javaweb开发的二手图书零售系统详细设计【附源码】 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统…...
【JaveWeb教程】(35)SpringBootWeb案例之《智能学习辅助系统》登录功能的详细实现步骤与代码示例(8)
目录 案例-登录和认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 案例-登录和认证 在前面的课程中,我们已经实现了部门管理、员工管理的基本功能,但是大家会发现,我们并没有登录,就直接访问到了Tlias智能…...
6.1 内存模式概述
Bruce Powel Douglass大师介绍-CSDN博客 嵌入式软件开发从小工到专家-CSDN博客 C嵌入式编程设计模式源码-CSDN博客 “内存管理模式”介绍了几种内存管理的模式,每种模式都针对特定的系统需求和约束设计。 6.2 静态分配模式(Static Allocation Patter…...
Python中容器类型的数据
目录 序列 序列的索引操作 加和乘操作 切片操作 成员测试 列表 创建列表 追加元素 插入元素 替换元素 删除元素 元组 创建元组 元组拆包 集合 创建集合 修改集合 字典 创建字典 修改字典 访问字典视图 遍历字典 若我们想将多个数据打包并且统一管理&…...
虚拟机安装Centos8.5
记得看目录哦! 附件1. 新建虚拟机2. 安装Centos8.5 附件 安装包自行下载 https://mirrors.aliyun.com/centos/8/isos/x86_64/ 1. 新建虚拟机 2. 安装Centos8.5 启动虚拟机–选择第一个install Centos8.5 记得接收许可证...
ENVI下基于知识决策树提取地表覆盖信息
基于知识的决策树分类是基于遥感影像数据及其他空间数据,通过专家经验总结、简单的数学统计和归纳方法等,获得分类规则并进行遥感分类。分类规则易于理解,分类过程也符合人的认知过程,最大的特点是利用的多源数据。 决策树分类主要的工作是获取规则,本文介绍使用CART算法…...
arco design table遇到的一些问题
问题1:不知情就成了树形table table中不知道为啥就多了个树形加号在前面,查找问题后发现,是后端返回的数据中有children,框架中默认对这个参数做了树形结构。 解决办法: 当时没找到取消或者修改字段的属性或方法&…...
Linux系统——文本三剑客
目录 一、grep 1.格式 2.选项 2.1 grep重定向 2.2grep -m 匹配到几次停止 2.3grep -i 忽略大小写 2.4grep -n 显示行号 2.5grep -c 统计匹配行数 2.6grep -A 后几行 2.7grep -C 前后三行 2.8grep -B 前三行 2.9grep -e 或 2.10grep -w 匹配整个单词 2.11grep -r…...
ESP32多任务水位监测:从Arduino到ESP-IDF的FreeRTOS实战
1. 项目概述:从Arduino到ESP-IDF的跃迁去年我在做毕业设计时,为了搭建一个ESP32的传感器节点演示程序,第一次深入使用了FreeRTOS。那段时间,我几乎天天和任务调度、队列、信号量打交道,从最初的一头雾水到后来能流畅地…...
收藏干货|2026 版企业 AI 落地实操指南,程序员小白入门避坑必备
如今人工智能早已脱离概念炒作阶段,全面扎根企业实际业务场景,成为技术从业者与企业管理者无法回避的发展课题。各行各业都加速布局AI赛道,行业心态也从初期观望试探,彻底转变为实打实的落地攻坚。 不少企业高层主动牵头统筹AI规划…...
Ubuntu经常安装软件
1、垃圾清理工具stacer sudo apt updatesudo apt install stacer apt cleanapt autocleanapt autoremove 2、类似与everything的工具Fsearcch 1sudo add-apt-repository ppa:christian-boxdoerfer/fsearch-stable 2sudo apt update 3sudo apt install fsearch (注…...
Claude Code + LM Studio + CC-Switch 本地自动化编程部署指南
Claude Code LM Studio CC-Switch 本地自动化编程部署指南 本指南汇总了在 Windows 本地环境下,使用 Claude Code 配合 LM Studio 本地模型、CC-Switch 代理进行自动化编程开发的完整配置方案。 目录 硬件与模型选型LM Studio 本地模型部署CC-Switch 代理配置Cla…...
Claude服务治理架构升级(生产环境零停机迁移实录)
更多请点击: https://codechina.net 第一章:Claude服务治理架构升级(生产环境零停机迁移实录) 为应对日益增长的推理请求量与多租户策略精细化需求,我们对Claude服务治理层实施了从单体API网关向云原生服务网格的平滑…...
在ubuntu上为node.js后端服务接入taotoken统一大模型api
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在 Ubuntu 上为 Node.js 后端服务接入 Taotoken 统一大模型 API 为后端服务集成大模型能力已成为提升应用智能水平的关键步骤。对于…...
NCM转MP3终极指南:3分钟解锁你的网易云音乐自由
NCM转MP3终极指南:3分钟解锁你的网易云音乐自由 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的歌曲换个设备就无法播放而烦恼吗?那些神秘的.ncm格式文件,只能在官方应用里…...
保姆级教程:手把手教你用插桩法逆向分析小红书X-S加密(附完整JSVMP日志)
JSVMP逆向工程实战:从加密定位到算法还原的全流程解析 逆向工程的世界里,JSVMP(JavaScript Virtual Machine Protection)一直是让许多开发者望而生畏的存在。这种前端代码虚拟化保护技术通过将JavaScript源代码编译为自定义字节码…...
《道德经》第二十章
本章以绝学无忧我独昏昏为核心,专讲体道者超越世俗价值、回归生命本源的精神境界,是老子自我写照式的抒情篇章。以“唯阿善恶相去几何”的追问破题,以“众人熙熙”与“我独泊兮”的强烈对比展开,最终以“贵食母”点明与道合一的生…...
ImageSearch与Everything集成:如何利用文件搜索神器提升索引速度10倍
ImageSearch与Everything集成:如何利用文件搜索神器提升索引速度10倍 【免费下载链接】ImageSearch 基于.NET10的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 想要在本地硬盘…...
