找回密码
 会员注册
查看: 38|回复: 0

用DrissionPage过某里滑块分析

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
64021
发表于 2024-9-12 19:53:25 | 显示全部楼层 |阅读模式
最近我又在找工作了,悲哀啊~,面试官给了一道题,要求如下:爬虫机试:https://detail.1688.com/offer/643272204627.html过该链接的滑动验证码,拿到正确的商品信息页html,提取出商品维度的信息,输出json由于时间紧迫,想着去破解加密参数x5sec估计时间也不够,最后采用自动化工具先应付一下面试,毕竟能不能入职还是未知数。言归正传,先看效果图如下:众所周知阿里的滑块检测是比较多的,常规的自动化工具无法过滑块。所有这次尝试用DrissionPage去破解。DrissionPage文档地址如下:https://www.drissionpage.cn/每次运行代码后都会启动一个全新的浏览器,防止浏览器缓存被检测fromDrissionPageimportChromiumPage,ChromiumOptionsco=ChromiumOptions()co.auto_port()page=ChromiumPage(co)12345通过监听数据包的方式获取数据self.page.listen.start('https://detail.1688.com/all')1自定义滑块轨迹,这点还是比较重要的,模拟的越像人工轨迹越不会被检测。defslide(self):"""滑动代码:return:"""ele=self.page.wait.eles_loaded("x://span[contains(@id,'nc_1_n1z')]",timeout=20)ifele: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)1234567891011121314报错捕获,目前发现当抓取的数据超过一定量后,必然会触发封控机制,这时候就需要换IP处理。ifself.page.wait.eles_loaded("#recyclerview"):print('过滑动成功')elifself.page.wait.eles_loaded("#nc_1_refresh1"):print('滑动失败')#需要继续处理.......elifself.page.wait.eles_loaded("#login-form"):print('需要登陆/换IP')#需要继续处理.......12345678完整代码如下:fromDrissionPageimportChromiumPage,ChromiumOptionsimportjsonimporttimeimportreimportrandomimportdatetimeclassDetail(object):def__init__(self):co=ChromiumOptions()co.auto_port()self.page=ChromiumPage(co)self.page.listen.start('https://detail.1688.com/offer/643272204627.html')defslide(self):"""滑动代码:return:"""ele=self.page.wait.eles_loaded("x://span[contains(@id,'nc_1_n1z')]",timeout=20)ifele: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)defrequest_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*'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)exceptExceptionase:print(e)self.slide()ifself.page.wait.eles_loaded("#recyclerview"):print('过滑动成功')elifself.page.wait.eles_loaded("#nc_1_refresh1"):print('滑动失败')#需要继续处理.......elifself.page.wait.eles_loaded("#login-form"):print('需要登陆/换IP')#需要继续处理.......defrun(self):foriinrange(1,100000):self.request_body()if__name__=='__main__':detail=Detail()detail.run()12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364最后总结一下,代码是半成品,想要实现完美的抓取阿里1688数据第一需要完成IP代理模块;第二完善报错机制;第三优化滑块轨迹逻辑。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-26 01:51 , Processed in 0.314660 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表