• 字体反爬破解学习--爬取实习僧


    一、前言

      这几天搜索一些反爬虫资料时又发现了一种字体反爬的方式。所谓字体反爬,就是一些关键数据你在网页上观看时他是正常的,而当你在使用浏览器的网页检查时却显示的是一个个的方块,这样我们就无法从网页中将数据正确的爬取下来。下面我们我们就来学习如何去破解字体反爬。

    参考文章:1、爬虫与反爬虫 | 土法破解字符映射反爬策略及高频词可视化

         2、如何解决爬虫过程中网页中数字解析为方块的问题?

    二、分析网页

      1、打开实习僧网站,搜索python岗位的工作,我们可以从下图看到网页上的数据都是正常显示的;

      但当我们打开浏览器上的检查元素的时候,却发现原本正常显示的数字变成了一个个的方块;

      如果此时我们此时直接将数据爬取下来,所看到的数据肯定是惨不忍睹的。接下来我们就来破解这个反爬。

      2、根据上面的参考文章,可以了解到这个方块其实就是网站使用了自己的一套Unicode和数字的对应规则,因此我们在解析时需要替换相应的Unicode为数字。首先将方块转为Unicode,再将方块的Unicode与网页上看到的数字一一对应起来,如下;

     1 replace_dict = {
     2     'ueda3': '0',
     3     'ue7d5': '1',
     4     'uef31': '2',
     5     'uec7d': '3',
     6     'ue73d': '4',
     7     'ue6d0': '5',
     8     'ueabe': '6',
     9     'uf375': '7',
    10     'ue4df': '8',
    11     'uf6dd': '9',
    12 }

      3、可是当我按照参考文章的步骤去做的时候却发现,出现下图的状况;

      可以看到数字已经全部正常爬取了,但是职位的一些关键字却也是被网站更改了编码。如果我们要将这些Unicode码与汉字对应起来的话那就太麻烦了。但是,当我们打开职位的详细信息后,可以看到;

      在职位详细页面里汉字的关键字是正常显示的,所以我们可以在主页抓取每个职位的链接,在进入每个职位的详情页去抓取我们想要的信息,而且详情页里的信息更加的全面。(其实是我之前偷懒了,就没来这个页面爬。。。)

    三、代码

      由于时间问题(其实就是因为懒。。。)我就没有去写抓取详情页的代码了,只是在职位列表页面抓取了一些简单的信息,代码如下;

     1 import requests
     2 from bs4 import BeautifulSoup
     3 
     4 url = 'https://www.shixiseng.com/interns?k=Python&p=1'
     5 headers = {
     6     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',
     7     'Referer': 'https://www.shixiseng.com/',
     8 }
     9 replace_dict = {
    10     'ueda3': '0',
    11     'ue7d5': '1',
    12     'uef31': '2',
    13     'uec7d': '3',
    14     'ue73d': '4',
    15     'ue6d0': '5',
    16     'ueabe': '6',
    17     'uf375': '7',
    18     'ue4df': '8',
    19     'uf6dd': '9',
    20 }
    21 def spider(url):
    22     response = requests.get(url, headers=headers)
    23     soup = BeautifulSoup(response.content, 'html.parser', from_encoding="utf-8")
    24     text = soup.prettify()
    25     for key, value in replace_dict.items():
    26         text = text.replace(key, value)
    27     soup = BeautifulSoup(text, 'html.parser')
    28     positions = soup.find_all('a', class_='name')
    29     detail = soup.find_all('div', class_='more')
    30     for i in range(len(positions)):
    31         spans = detail[i].find_all('span')
    32         info = {
    33             'position': positions[i].get_text().strip(),
    34             'salary': spans[0].get_text().strip(),
    35             'day': spans[1].get_text().strip(),
    36             'time': spans[2].get_text().strip(),
    37         }
    38         print(info)
    39 
    40 if __name__ == '__main__':
    41     spider(url)

    代码运行结果如下:

    四、总结

      经过本次的学习我们可以得知:网站人员可以通过更改某些关键字符的编码来方式来进行反爬,我们也可以使用本次的方法来进行反爬。但是,我们也可以得知,如果只是数字,我们还可以通过对应来使他们正常显示,但当关键词多了的时候,这种方法就很难办了,如上图中的职位中的关键字。好在本网站职位详情页中还是汉字还是正常显示的。但是假设详情页中也改变呢了?这也是一个值得思考的问题。  

  • 相关阅读:
    11. MVC 开发模式 -- JSP篇
    10. JSTL格式化标签
    JQUREY 的 表单序列化 和 .$.getScript () 和 $.getJSON() 方法!
    jQery 与 AXAJ -- 书本进阶【主要讲解方法 详解】
    python少儿编程-turtle 基本绘图
    mysql按月进行表分区
    Mysql分区:分区键和唯一索引主键的关系
    Mysql自动按月分区
    MySQL分区表的正确使用方法
    sqoop定时增量导入
  • 原文地址:https://www.cnblogs.com/Lethons/p/9096314.html
Copyright © 2020-2023  润新知