红薯网防爬措施与斗图啦及豆瓣实战案例

今日内容概要

  • 红薯网防爬措施研究
  • 课上自己完成表情包爬取
  • 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代码
为了舒适的结果,眼前的坎坷路程即使再长都是值得的。
原文地址:https://www.cnblogs.com/abudrSatan1998/p/13722606.html