不止是CSS偏移反爬虫

墨蓝 2023-07-23 03:45 3阅读 0赞

文章目录

    • CSS偏移反爬虫
      • 案例分析
      • 代码说明
      • 效果展示
    • 关注不迷路哦

CSS偏移反爬虫

     CSS偏移反爬虫指的是利用CSS样式将乱序的文字排本为人类正常阅读顺序的行为。这个概念不是很好理解,我们可以通过对比两端文字来加深对这个概念的理解。
在这里插入图片描述

  • HTML文本中的文字:我的学号是 1308205,我在北京大学读书。
  • 浏览器显示的文字:我的学号是 1380205,我在北京大学读书。

案例分析

     爬虫取到的学号是1308205,但用户在浏览器中看到的却是1380205.如果不细心观察,爬虫工程师很容易被爬取结果糊弄。这种混淆方法和图片伪装一样,是不会影响用户阅读的。让人好奇的是,浏览器如何将HTML文本中的数字按照开发者的意愿排序或放置呢?这种放置规则是如何运行的呢?我们可以通过一个具体的例子来了解CSS偏移反爬虫的应用和绕过方法。
在这里插入图片描述

代码说明

  1. """
  2. 示例:CSS偏移反爬虫示例
  3. 网址:http://www.porters.vip/confusion/flight.html
  4. 任务:爬取航班查询和机票销售网站页面中的航站名称,
  5. 所属航空公司和票价。
  6. """
  7. import requests
  8. import re
  9. from parsel import Selector
  10. class Css(object):
  11. def __init__(self):
  12. self.url = 'http://www.porters.vip/confusion/flight.html'
  13. self.headers = {
  14. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
  15. }
  16. def get_response_from_page(self, url):
  17. response = requests.get(url, headers=self.headers)
  18. if response.status_code == 200:
  19. return response
  20. else:
  21. return False
  22. def get_contnet_from_page(self):
  23. response = self.get_response_from_page(self.url).text
  24. sel = Selector(response)
  25. em = sel.css('em.rel').extract()
  26. for element in em:
  27. element = Selector(element)
  28. #定位所以的<b>标签
  29. element_b = element.css('b').extract()
  30. # print(element_b)
  31. bl = Selector(element_b.pop(0))
  32. base_price = bl.css('i::text').extract()
  33. print(base_price)
  34. alternate_price = []
  35. for eb in element_b:
  36. eb = Selector(eb)
  37. #提取<b>标签的style属性
  38. style = eb.css('b::attr("style")').get()
  39. #获得具体的位置
  40. position = ''.join(re.findall(r'left:(.*?)px',style))
  41. #获取该标签下的数字
  42. value = eb.css('b::text').get()
  43. #将<b>标签的位置信息和数字以字典的格式添加到替补票价列表中
  44. alternate_price.append({'position':position,'value':value})
  45. for al in alternate_price:
  46. position = int(al.get('position'))
  47. value = al.get('value')
  48. #判断位置的数值是否正整数
  49. puls = True if position >= 0 else False
  50. #计算下标,以16px为基准
  51. index = int(position / 16)
  52. #替换第一对<b>标签值列表中的元素,也就是完整值覆盖操作
  53. base_price[index] = value
  54. print(base_price)
  55. if __name__ == '__main__':
  56. css = Css()
  57. css.get_contnet_from_page()

效果展示

在这里插入图片描述

关注不迷路哦

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,3人围观)

还没有评论,来说两句吧...

相关阅读