zoukankan      html  css  js  c++  java
  • 红薯网防爬措施与斗图啦及豆瓣实战案例

    今日内容概要

    • 红薯网防爬措施研究
    • 课上自己完成表情包爬取
    • Xpath选择器
    • MongoDB数据库

    今日内容详细

    红薯网防爬措施研究

    1.网站禁止鼠标点击动作 但是可以按F12直接进入调试界面
    2.小说资源不是直接加载过来的(js动态加载 ajax请求)
    3.查看XHR过滤出来的文件数据
        通过preview美化功能发现了几个加密的数据
        (加密意味着别人不想让你直接看 说明这个东西可能比较重要)
        {code:119,msg:"获取章节内容成功",key:"36645883"}
        code:119
            key:"36645883"
                msg:"获取章节内容成功“
         请求地址
         https://www.hongshu.com/bookajax.do
         请求体数据
         method:getchptkey
         bid:3052
         cid:98805
         
         content:"Yk6ZOk0AyXYrDYgD7H1cu5E6rvVO3ohc+0j7755wj7gG87Cwhj"
         other: "FJ6f0iPZdk6Ih6VrQ3NzQpx/l+66LRMz7jBWTCytiEQcF4ZPTR"
          请求地址
        https://www.hongshu.com/bookajax.do
        请求体
        method: getchpcontent
        bid: 3052
        jid: 3317
        cid: 98805
            
        
    4.研究请求方式
    	发现是post请求并且可以查找到请求体数据
        
    5.研究发现文章的url里面含有上述请求体里面的数据
    	https://www.hongshu.com/content/3052/3317-98805.html
        https://www.hongshu.com/content/{bid}/{jid}-{cid}.html
         
    6.加密解密算法关键字
    	encrypt		把…加密(或编码);
        decrypt		给…解密;
    	打开浏览器sources选择 全局搜索含有decrypt关键字的js文件
        然后再改文件内再使用搜索查找含有decrypt关键字的所有代码
     data.content = utf8to16(hs_decrypt(base64decode(data.content), key))
        data.other = utf8to16(hs_decrypt(base64decode(data.other), key))
        大致推到出来加密需要用key content other
        给上述代码打断点查看 可得上述代码是对content和other的一个解密算法
       
    7.将上述代码直接在console(支持直接写js代码)中运行
        查看到了小说的部分内容(有一部分是缺失的)
       
    8.针对小说内容的缺失破解
    	由于content已经没法再去研究了
        所以研究的思路只能是other
        解密other发现了一段加密之后的js代码(大胆猜测应该是这段js代码将缺失的文字动态加载)
     
    9.将content解密之后的结果新建一个html文件存储然后用浏览器打开
    	之后拷贝浏览器上面的文字显示再放入html文件中再次用浏览器打开
        就可以查看到完整的小说内容了 但是小说的格式和标点符号还是有缺失
        你只需要在html中创建一个script标签,将other解密之后的js代码直接粘贴过去
        再次使用浏览器打开html页面发现完完全全展示出来了
       
    10.css防爬(了解一下即可)    
    

    Xpath选择器

    # 参考网站:https://www.w3school.com.cn/xpath/xpath_syntax.asp
    
    doc='''
    <html>
     <head>
      <base href='http://example.com/' />
      <title>Example website</title>
     </head>
     <body>
      <div id='images'>
       <a href='image1.html' a="xxx">Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
       <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
       <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
       <a href='image4.html' class='li'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
       <a href='image5.html' class='li li-item' name='items'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
       <a href='image6.html' name='items'><span><h5>test</h5></span>Name: My image 6 <br /><img src='image6_thumb.jpg' /></a>
      </div>
     </body>
    </html>
    '''
    from lxml import etree
    
    html=etree.HTML(doc)
    # html=etree.parse('search.html',etree.HTMLParser())
    # 1 所有节点
    a=html.xpath('//*')    #匹配所有标签
    # 2 指定节点(结果为列表)
    # a=html.xpath('//head')
    # 3 子节点,子孙节点
    a=html.xpath('//div/a')
    a=html.xpath('//body/a') #无数据
    a=html.xpath('//body//a')
    # 4 父节点
    # a=html.xpath('//body//a[@href="image1.html"]/..')
    a=html.xpath('//body//a[1]/..')  #从1开始
    # 也可以这样
    a=html.xpath('//body//a[1]/parent::*')
    # 5 属性匹配
    a=html.xpath('//body//a[@href="image1.html"]')
    
    # 6 文本获取
    a=html.xpath('//body//a[@href="image1.html"]/text()')
    a=html.xpath('//body//a/text()')
    
    # 7 属性获取
    # a=html.xpath('//body//a/@href')
    # # 注意从1 开始取(不是从0)
    a=html.xpath('//body//a[2]/@href')
    # 8 属性多值匹配
    #  a 标签有多个class类,直接匹配就不可以了,需要用contains
    # a=html.xpath('//body//a[@class="li"]')
    a=html.xpath('//body//a[contains(@class,"li")]/text()')
    # a=html.xpath('//body//a[contains(@class,"li")]/text()')
    # 9 多属性匹配
    a=html.xpath('//body//a[contains(@class,"li") or @name="items"]')
    a=html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()')
    a=html.xpath('//body//a[contains(@class,"li")]/text()')
    # 10 按序选择
    a=html.xpath('//a[2]/text()')
    a=html.xpath('//a[2]/@href')
    # 取最后一个
    a=html.xpath('//a[last()]/@href')
    # 位置小于3的
    a=html.xpath('//a[position()<3]/@href')
    # 倒数第二个
    a=html.xpath('//a[last()-2]/@href')
    # 11 节点轴选择
    # ancestor:祖先节点
    # 使用了* 获取所有祖先节点
    a=html.xpath('//a/ancestor::*')
    # # 获取祖先节点中的div
    a=html.xpath('//a/ancestor::div')
    # attribute:属性值
    a=html.xpath('//a[1]/attribute::*')
    # child:直接子节点
    a=html.xpath('//a[1]/child::*')
    # descendant:所有子孙节点
    a=html.xpath('//a[6]/descendant::*')
    # following:当前节点之后所有节点
    a=html.xpath('//a[1]/following::*')
    a=html.xpath('//a[1]/following::*[1]/@href')
    # following-sibling:当前节点之后同级节点
    a=html.xpath('//a[1]/following-sibling::*')
    a=html.xpath('//a[1]/following-sibling::a')
    a=html.xpath('//a[1]/following-sibling::*[2]/text()')
    a=html.xpath('//a[1]/following-sibling::*[2]/@href')
    print(a)
    

    课上小练习

    https://www.doutula.com/photo/list?page=0
    爬取表钱包然后用文件的形式存储到本地
    

    补充

    ajax
    	1.异步提交
        2.局部刷新
        底层用的其实还是js代码,只不过书写起来比js代码更加的方便
        ajax使用的频率非常高 你可以简单的理解为就是js代码
    
    为了舒适的结果,眼前的坎坷路程即使再长都是值得的。
  • 相关阅读:
    hdu1069Monkey and Banana(动态规划)
    hdu2571 命运(动态规划)
    hdu1505City Game(动态规划)
    在jvm底层有关于方法区的介绍
    用IDEA查看源码总是跳到.class文件而不是.java文件的解决办法
    如果Son类继承Father类,Father类继承GrandFather类,那么new Son()创建对象的时候是否会执行GrandFather类里面的方法
    看面试题有感:子类构造器(无参或有参)继承的super()方法在何时调用,与静态代码块,普通代码块相比的执行顺序如何的思考及证明
    关于子类构造器调用super()方法的规定
    为什么重写了equals方法后还需要重写hashCode方法
    字符串常量池处在JVM的堆中,那么是在堆的哪个部分呢
  • 原文地址:https://www.cnblogs.com/abudrSatan1998/p/13722606.html
Copyright © 2011-2022 走看看