【Python】03快速上手爬虫案例三:搞定药师帮

news2024/12/23 12:36:31

文章目录

  • 前言
  • 1、破解验证码
  • 2、获取数据


前言

流程:通过用户名、密码、搞定验证码,登录进药师帮网站,然后抓取想要的数据。

爬取数据,最终效果图:

在这里插入图片描述


1、破解验证码

使用药师帮测试系统:https://dianrc.ysbang.cn/#/home

在这里插入图片描述

引入打码平台进行破解,我这里使用的是云码。

代码如下:

code_result.py

import json
import requests
import base64
 
class 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不行,这里要使用10103
        payload = {
            "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 webdriver

import time
import requests
from lxml import etree
from code_result import YdmVerify
import csv

driver = 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 webdriver

import time
import requests
from lxml import etree
from code_result import YdmVerify
import csv

driver = 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_source
    parse = 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 True
    print(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+=1
        nextBtn = 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.coloradmin.cn/o/1419258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速入门存内计算—助力人工智能加速深度学习模型的训练和推理

存内计算:提高计算性能和能效的新技术 传统的计算机架构是将数据存储在存储器中,然后将数据传输到计算单元进行处理。这种架构存在一个性能瓶颈,即数据传输延迟。存内计算通过将计算单元集成到存储器中,消除了数据传输延迟&#…

HiveSQL题——窗口函数(lag/lead)

目录 一、窗口函数的知识点 1.1 窗户函数的定义 1.2 窗户函数的语法 1.3 窗口函数分类 1.4 前后函数:lag/lead 二、实际案例 2.1 股票的波峰波谷 0 问题描述 1 数据准备 2 数据分析 3 小结 2.2 前后列转换(面试题) 0 问题描述 1 数据准备 …

kubernetes-快速部署一套k8s集群

1、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。 二进制包 从github下载发行…

04.对象树

一、引入 1.QT实现输出"hello world" 使用QT编写"hello world"程序,有两种实现方式: (1)直接在生成的ui文件中,拖入一个label控件,双击控件编辑内容即可实现 (2&#xff0…

【C++历练之路】探秘C++三大利器之一——多态

W...Y的主页 😊 代码仓库分享💕 前言🍔: 在计算机科学的广袤领域中,C多态性是一门令人着迷的技术艺术,它赋予我们的代码更强大的灵活性和可维护性。想象一下,你正在构建一个程序,需要适应不断…

【技术分享】远程透传网关-单网口快速实现威纶通触摸屏程序远程上下载

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条,用于实现网络连接和连接触摸屏一台威纶通触摸屏及其编程软件一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡,WIFI联网则将WIFI天线插入USB口)…

Redis 面试题 | 19.精选Redis高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Mac安装及配置MySql及图形化工具MySQLworkbench安装

Mac下载配置MySql mysql下载及安装 下载地址:https://dev.mysql.com/downloads/mysql/ 根据自己电脑确定下载x86还是ARM版本的 如果不确定,可以查看自己电脑版本,终端输入命令 uname -a 点击Download下载,可跳过登录注册&…

沙龙回顾|“强标”发布在即,汽车数据安全的挑战与应对

随着智能汽车产业驶入发展快车道,“数据安全”的重要性也日益突出。2020年以来发现的针对整车企业、车联网信息服务提供商等相关企业的恶意攻击达到280余万次。2023年初至今,就发生超过20起与车企相关数据泄露事件,汽车数据安全的现状不容乐观…

基于Matlab无刷直流电机系统仿真建模的新方法

摘 要:在分析无刷直流电机(BLDC)数学模型的基础上,提出了无刷直流电机系统仿真建模的 新方法。在Matlab/Simulink 中,建立独立的功能模块,如BLDC 本体模块、电流滞环控制模块、 速度控制模块等,…

防御保护--智能选路

目录 就近选路 策略选路--PBR DSCP优先级 智能选路--全局路由策略 1.基于链路带宽的负载分担 2.基于链路质量进行负载分担 3.基于链路权重进行负载分担 4.基于链路优先级的主备备份 ​编辑 DNS透明代理 就近选路 我们希望在访问不同运营商服务器时,通过对…

IDEA安装MyBatisX插件

IDEA工具在开发人员中经常使用,从dao层到xml文件对应的查看很费劲,这时候就有相应的插件工具出现了MyBatisX。他的好处如下: mapper and xml can jump back and forth mybatis.xml,mapper.xml prompt mapper and xml support auto prompt lik…

多场景建模:腾讯3MN

3MN: Three Meta Networks for Multi-Scenario and Multi-Task Learning in Online Advertising Recommender Systems 背景 推荐领域的多场景多任务学习:维护单模型即可节省资源也可节省人力;各个场景的数据共享,理论上面学习是更加充分的 …

RK3568 Android Launcher3定制修改

1.去掉Google搜索栏 目录packages/apps/Launcher3/src_build_config/com/android/launcher3/BuildConfig.java 修改如下: 2.Launcher首页去掉抽屉菜单,所有应用都放到桌面 第一步:禁止上滑显示抽屉 在目录packages/apps/Launcher3/quickste…

大模型学习与实践笔记(十四)

使用 OpenCompass 评测 InternLM2-Chat-7B 模型使用 LMDeploy 0.2.0 部署后在 C-Eval 数据集上的性能 步骤1:下载internLM2-Chat-7B 模型,并进行挂载 以下命令将internlm2-7b模型挂载到当前目录下: ln -s /share/model_repos/internlm2-7b/ ./ 步骤2&…

非阿里云注册域名如何在云解析DNS设置解析?

概述 非阿里云注册域名使用云解析DNS,按照如下步骤: 添加域名。 添加解析记录。 修改DNS服务器。 DNS服务器变更全球同步,等待48小时。 添加解析记录 登录云解析DNS产品控制台。 在 域名解析 页面中,单击 添加域名 。 在 …

虚拟创业团队如何建设

虚拟创业团队如何建设 一、目标设定 在组建虚拟创业团队之前,明确团队目标是至关重要的。目标应具体、可衡量、可实现,并与团队成员共享。通过设定共同的目标,团队成员能够更好地理解团队愿景,明确个人职责,并朝着同…

CRG设计之复位

1. 前言 CRG(Clock and Reset Generation,时钟复位生成模块) 模块扮演着关键角色。这个模块负责为整个系统提供稳定可靠的时钟信号,同时在系统上电或出现故障时生成复位信号,确保各个模块按预期运行。简而言之,CRG模块就像是SoC系…

第九节HarmonyOS 常用基础组件16-Blank

1、描述 空白填充组件,在容器主轴方向上,空白填充组件具有自动填充容器空余部分的能力。仅当父组件为Row/Column/Flex时生效。 2、接口 Blank(min?: number | string) 3、参数 参数名 参数类型 必填 描述 min number|string 否 空白填充组件…

SeaTunnel集群安装

环境准备 服务器节点 节点名称 IP bigdata1 192.168.1.250 bigdata4 192.168.1.251 bigdata5 192.168.1.252 Java环境(三个节点都需要) java1.8 注意:在安装SeaTunnel集群时,最好是现在一个节点上将所有配置都修改完&a…