【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 去取页面数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/248267.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【保驾护航】HarmonyOS应用开发者基础认证-题库-2024

通过系统化的课程学习,熟练掌握DevEco Studio,ArkTS,ArkUI,预览器,模拟器,SDK等HarmonyOS应用开发的关键概念,具备基础的应用开发能力。 考试说明 1、考试需实名认证,请在考前于个…

有哪些ssl证书推荐

SSL证书是由CA认证机构颁发的数字证书,可以用来实现网站的身份验证和数据加密,保障用户与网站之间的通信安全。现在市场上知名的CA认证机构Digicert、Sectigo、Certum等,都已经成立了几十年,每年都要进行WebTrust安全审计&#xf…

HTTPS 之fiddler抓包--jmeter请求

一、浅谈HTTPS 我们都知道HTTP并非是安全传输,在HTTPS基础上使用SSL协议进行加密构成的HTTPS协议是相对安全的。目前越来越多的企业选择使用HTTPS协议与用户进行通信,如百度、谷歌等。HTTPS在传输数据之前需要客户端(浏览器)与服…

【Python笔记-设计模式】抽象工厂模式

一、说明 (一) 解决问题 抽象工厂是一种创建型设计模式,主要解决接口选择的问题。能够创建一系列相关的对象,而无需指定其具体类。 (二) 使用场景 系统中有多于一个的产品族,且这些产品族类的产品需实现同样的接口。 例如:有…

数字人解决方案VividTalk——音频驱动单张照片实现人物头像说话的效果

前言 VividTalk是一项由南京大学、阿里巴巴、字节跳动和南开大学共同开发的创新项目。该项目通过结合单张人物静态照片和一段语音录音,能够制作出一个看起来仿佛实际说话的人物视频。项目的特点包括自然的面部表情和头部动作,口型能够同步,同…

HarmonyOS 鸿蒙驱动消息机制管理

驱动消息机制管理 使用场景 当用户态应用和内核态驱动需要交互时,可以使用HDF框架的消息机制来实现。 接口说明 消息机制的功能主要有以下两种: 用户态应用发送消息到驱动。 用户态应用接收驱动主动上报事件。 表1 消息机制接口 方法描述struct …

防御保护笔记02

防火墙 防火墙的主要职责在于:控制和防护 ---- 安全策略 --- 防火墙可以根据安全策略来抓取流量 防火墙分类 按物理特性划分 软件防火墙 硬件防火墙 按性能划分 百兆级防火墙 吞吐量:指对网络、设备、端口、虚电路或其他设施,单位时间内成…

架构整洁之道-价值维度与编程范式

1 设计与架构究竟是什么 结论:二者没有任何区别,一丁点区别都没有。 架构图里实际上包含了所有底层设计细节,这些细节信息共同支撑了顶层的架构设计,底层设计信息和顶层架构设计共同组成了整个架构文档。底层设计细节和高层架构信…

最新GPT4.0使用教程,AI绘画-Midjourney绘画,GPT语音对话使用,DALL-E3文生图+思维导图一站式解决

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画,文档对话总结DALL-E3文生图,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和…

【HarmonyOS应用开发】ArkUI 开发框架-基础篇-第一部分(七)

常用基础组件 一、组件介绍 组件(Component)是界面搭建与显示的最小单位,HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件,我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。组件根据功能可以分为以下五大类…

深入理解Redis:如何设置缓存数据的过期时间及其背后的机制

目录 Redis 给缓存数据设置过期时间 Redis是如何判断数据是否过期的呢? 过期的数据的删除策略 Redis 内存淘汰机制 Redis 给缓存数据设置过期时间 一般情况下,我们设置保存的缓存数据的时候都会设置一个过期时间。为什么呢? 因为内存是有…

Django模型(一)

一、介绍 模型,就是python中的类对应数据库中的表 1.1、ORM ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写 ORM 把数据库映射成对象 1.…

【Linux】压缩脚本、报警脚本

一、压缩搅拌 要求: 写一个脚本,完成如下功能 传递一个参数给脚本,此参数为gzip、bzip2或者xz三者之一; (1) 如果参数1的值为gzip,则使用tar和gzip归档压缩/etc目录至/backups目录中,并命名为/backups/etc…

Java-并发高频面试题

1.说一下你对Java内存模型(JMM)的理解? 其实java内存模型是一种抽象的模型,具体来看可以分为工作内存和主内存。 JMM规定所有的变量都会存储再主内存当中,再操作的时候需要从主内存中复制一份到本地内存(c…

C++(6) 继承

文章目录 继承1. 继承1.1 什么是继承1.2 C 继承方式1.2.1 基本案例1.2.2 继承权限组合1.2.3 继承中构造函数的说法1.2.4 继承中析构函数的执行顺序1.2.5 继承中变量名称冲突问题1.2.6 继承中函数【重写】 继承 1. 继承 1.1 什么是继承 面向对象程序设计中最重要的一个概念是继…

【linux】复制cp和硬连接、软连接的区别? innode 关系?

1.命令: cp -r [源文件或目录] [目的目录] #复制 ln -s [被链接的文件] [链接的目录/名称] #软连接 ln [被链接的文件] [链接的目录/名称] #硬连接 注:cp -r 会把所有source当作普通文件(regular文件)&#x…

把批量M3U8网络视频地址转为MP4视频

在数字媒体时代,视频格式的转换已成为一项常见的需求。尤其对于那些经常处理网络视频的用户来说,将M3U8格式的视频转换为更常见的MP4格式是一项必备技能。幸运的是,现在有了固乔剪辑助手这款强大的工具,这一过程变得异常简单。下面…

03:华为云管理|云主机管理|云项目实战

华为云管理|云主机管理|云项目实战 安全组配置部署跳板机配置yum源,安装软件包优化系统服务安装配置ansible管理主机 模版镜像配置配置yum源,安装软件包优化系统 网站云平台部署实战华为云的负载均衡 安全组配置 设置安全组 云…

MongoDB常用命令

3.1 案例需求 存放文章评论的数据存放到MongoDB中,数据结构参考如下: 数据库:articledb 3.2 数据库操作 3.2.1 选择和创建数据库 选择和创建数据库的语法格式: use 数据库名称 如果数据库不存在则自动创建,例如&a…

VirtualBox配置OpenEuler虚拟机双网卡使用

VirtualBox配置NAT模式时,在宿主机使用WIFI时,虽然能访问互联网,能正常安装软件,但是本地不能访问虚拟机,但是可以配置另一个host-only模式的网卡,通过双网卡实现本地访问虚拟机的同时也能访问互联网。 安装…