用DrissionPage过某里滑块分析

最近我又在找工作了,悲哀啊~,面试官给了一道题,要求如下:

爬虫机试:https://detail.1688.com/offer/643272204627.html 过该链接的滑动验证码,拿到正确的商品信息页html,提取出商品维度的信息,输出json

由于时间紧迫,想着去破解加密参数x5sec估计时间也不够,最后采用自动化工具先应付一下面试,毕竟能不能入职还是未知数。

言归正传,先看效果图如下:

众所周知阿里的滑块检测是比较多的,常规的自动化工具无法过滑块。所有这次尝试用DrissionPage去破解。

DrissionPage文档地址如下:

https://www.drissionpage.cn/

每次运行代码后都会启动一个全新的浏览器,防止浏览器缓存被检测

python 复制代码
from DrissionPage import ChromiumPage, ChromiumOptions

co = ChromiumOptions()
co.auto_port()
page = ChromiumPage(co)

通过监听数据包的方式获取数据

python 复制代码
self.page.listen.start('https://detail.1688.com/all')

自定义滑块轨迹,这点还是比较重要的,模拟的越像人工轨迹越不会被检测。

python 复制代码
def slide(self):
    """
    滑动代码
    :return:
    """
    ele = self.page.wait.eles_loaded("x://span[contains(@id,'nc_1_n1z')]", timeout=20)
    if ele:
        ele = self.page.ele("#nc_1_n1t")
        time.sleep(3)
        ele.hover()
        self.page.actions.hold('#nc_1_n1z')
        self.page.actions.move(100, duration=random.random())
        self.page.actions.move(100, duration=random.random())
        self.page.actions.move(59, duration=3)

报错捕获,目前发现当抓取的数据超过一定量后,必然会触发封控机制,这时候就需要换IP处理。

python 复制代码
 if self.page.wait.eles_loaded("#recyclerview"):
     print('过滑动成功')
 elif self.page.wait.eles_loaded("#nc_1_refresh1"):
     print('滑动失败')
     # 需要继续处理.......
 elif self.page.wait.eles_loaded("#login-form"):
     print('需要登陆/换IP')
     # 需要继续处理.......

完整代码如下:

python 复制代码
from DrissionPage import ChromiumPage, ChromiumOptions
import json
import time
import re
import random
import datetime


class Detail(object):

    def __init__(self):
        co = ChromiumOptions()
        co.auto_port()
        self.page = ChromiumPage(co)
        self.page.listen.start('https://detail.1688.com/offer/643272204627.html')

    def slide(self):
        """
        滑动代码
        :return:
        """
        ele = self.page.wait.eles_loaded("x://span[contains(@id,'nc_1_n1z')]", timeout=20)
        if ele:
            ele = self.page.ele("#nc_1_n1t")
            time.sleep(3)
            ele.hover()
            self.page.actions.hold('#nc_1_n1z')
            self.page.actions.move(100, duration=random.random())
            self.page.actions.move(100, duration=random.random())
            self.page.actions.move(59, duration=3)

    def request_body(self):
        url = 'https://detail.1688.com/offer/643272204627.html'
        self.page.get(url)
        res = self.page.listen.wait()
        pattern = r'window\.__INIT_DATA\s*=\s*(\{.*?\})\s*</script>'
        match = re.search(pattern, res.response.body)
        try:
            json_data = match.group(1)
            dict_data = json.loads(json_data)
            temp_model = dict_data.get('globalData').get('tempModel')
            print(datetime.datetime.now())
            print(temp_model)
        except Exception as e:
            print(e)
            self.slide()
            if self.page.wait.eles_loaded("#recyclerview"):
                print('过滑动成功')
            elif self.page.wait.eles_loaded("#nc_1_refresh1"):
                print('滑动失败')
                # 需要继续处理.......
            elif self.page.wait.eles_loaded("#login-form"):
                print('需要登陆/换IP')
                # 需要继续处理.......

    def run(self):
        for i in range(1, 100000):
            self.request_body()


if __name__ == '__main__':
    detail = Detail()
    detail.run()

最后总结一下,代码是半成品,想要实现完美的抓取阿里1688数据

  • 第一需要完成IP代理模块;
  • 第二完善报错机制;
  • 第三优化滑块轨迹逻辑。
相关推荐
Katecat996635 分钟前
YOLO11分割算法实现甲状腺超声病灶自动检测与定位_DWR方法应用
python
玩大数据的龙威31 分钟前
农经权二轮延包—各种地块示意图
python·arcgis
ZH154558913133 分钟前
Flutter for OpenHarmony Python学习助手实战:数据库操作与管理的实现
python·学习·flutter
belldeep43 分钟前
python:用 Flask 3 , mistune 2 和 mermaid.min.js 10.9 来实现 Markdown 中 mermaid 图表的渲染
javascript·python·flask
喵手43 分钟前
Python爬虫实战:电商价格监控系统 - 从定时任务到历史趋势分析的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·电商价格监控系统·从定时任务到历史趋势分析·采集结果sqlite存储
喵手1 小时前
Python爬虫实战:京东/淘宝搜索多页爬虫实战 - 从反爬对抗到数据入库的完整工程化方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·京东淘宝页面数据采集·反爬对抗到数据入库·采集结果csv导出
B站_计算机毕业设计之家1 小时前
猫眼电影数据可视化与智能分析平台 | Python Flask框架 Echarts 推荐算法 爬虫 大数据 毕业设计源码
python·机器学习·信息可视化·flask·毕业设计·echarts·推荐算法
PPPPPaPeR.1 小时前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法
JaydenAI1 小时前
[拆解LangChain执行引擎] ManagedValue——一种特殊的只读虚拟通道
python·langchain
骇城迷影1 小时前
Makemore 核心面试题大汇总
人工智能·pytorch·python·深度学习·线性回归