【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…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
