• CSS位置偏移反爬虫绕过


    0x01 初始化浏览器对象

    bs=webdriver.Chrome()

    0x02 访问网站

    bs.get('https://antispider3.scrape.center/'

    0x03 等待出现结果,然后再获取数据

    1. wt=WebDriverWait(bs,10)#创建一个等待的对象,等待10
    2. wt.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR,'.item')))#当节点id是item出现的时候获取数据
    3. print(bs.page_source[:100]) #获取源码 前100个字节

    0x04 获取网页源码并通过PyQuery初始化

    1. html=bs.page_source
    2. doc=py(html)

    0x05 获取源码中所有类item下的类name

    names=doc('.item .name')

    0x06 将获取的列表打印出来,并关闭创建的浏览器

    1. for name in names.items():
    2. print(name.text())
    3. bs.close()

    0x07 运行结果,发现字体的顺序都不对

    1. Wonder
    2. 风 清 白 家
    3. 上 结 ( 宠 老 法 篇 终 的 妃 下 ) 册
    4. 士 为 知 己 ( 全 二 册 )
    5. 那 些 年 , 我 们 一 起 追 的 女 孩
    6. 全 倾 非 三 ( ) 城 我 册
    7. 明 些 儿 那 朝 事
    8. 我 和 你 的 笑 忘 书
    9. 王 小 波 全 集 第 一 卷
    10. 怦 然 动 心
    11. 龙枪编年史(全3册)
    12. 全 三 ( 奇 ) 传 册 枪 龙
    13. 明 黎 之 街
    14. 示 理 启 认 及 知 学 其 心
    15. 银河帝国2:基地与帝国
    16. 基 : 国 地 帝 河 银
    17. 解 四 年 - 材 教 学 下 文 小 全 级 语
    18. 越界言论(第3卷)

    0x08 分析原因

    正确的顺序应该是按后面的值排序,所以我们只要再获取一个style的值,然后进行排序

    1. def paixu(name):
    2. ts=name('.whole')#一种根据类whole判断
    3. if ts:
    4. return name.text()
    5. else:
    6. chars=name('.char')#另一种根据类char判断
    7. items=[]
    8. for char in chars.items():#将过滤后的内容填写到一个列表里
    9. items.append(
    10. {'text':char.text().strip(),'left':int(re.search('(\d+)px',char.attr('style')).group(1))}
    11. )
    12. items=sorted(items,key=lambda x: x['left'],reverse=False)#根据关键字left排序
    13. return ''.join([item.get('text') for item in items])#只返回text的内容

    0x09 最终源码

    1. import re
    2. from selenium import webdriver
    3. from pyquery import PyQuery as py
    4. from selenium.webdriver.common.by import By
    5. from selenium.webdriver.support.wait import WebDriverWait
    6. from selenium.webdriver.support import expected_conditions as ec
    7. def paixu(name):
    8. ts=name('.whole')
    9. if ts:
    10. return name.text()
    11. else:
    12. chars=name('.char')
    13. items=[]
    14. for char in chars.items():
    15. items.append(
    16. {'text':char.text().strip(),'left':int(re.search('(\d+)px',char.attr('style')).group(1))}
    17. )
    18. items=sorted(items,key=lambda x: x['left'],reverse=False)
    19. return ''.join([item.get('text') for item in items])
    20. bs=webdriver.Chrome()
    21. bs.get('https://antispider3.scrape.center/')
    22. wt=WebDriverWait(bs,10)
    23. wt.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR,'.item')))
    24. html=bs.page_source
    25. doc=py(html)
    26. names=doc('.item .name')
    27. for i in names.items():
    28. name=paixu(i)
    29. print(name)
    30. bs.close()

    0x10 声明

    本内容摘自《Python3网络爬虫开发实战 第二版》作者:崔天才

    仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者不承担任何法律及连带责任。

    欢迎关注公众号编程者吧

  • 相关阅读:
    PIC单片机5——串口 中断
    在线云原生边缘计算KubeEdge安装配置(一)
    如何创建集成 LSP 支持多语言的 Web 代码编辑器
    XCTF1-web php
    「Spring Boot 系列」09. Spring Boot集成MyBatis-Plus实现CRUD
    C++学习笔记——01
    LeetCode - 解题笔记 - 211 - Design Add and Search Words Data Structure
    Qt5开发及实例V2.0-第十八章-Qt-MyselfQQ实例
    使用docker 搭建 zerotier服务器 实现异地组网
    【Vue3】自定义指令
  • 原文地址:https://blog.csdn.net/weixin_41489908/article/details/126929931