JS逆向实战8——某网实战(基于golang-colly)
其实本章算不上逆向教程 只是介绍golang的colly框架而已

列表页分析
根据关键字搜索
通过抓包分析可知
下一页所请求的参数如下

上图标红的代表所需参数
所以其实我们真正需要的也就是SearchSql
但是你多观察即可知 这个SearchSql在第一页访问的时候就传给了
所以也就是
爬取第一页获取第二页的请求参数——爬取第二页获取第三页的请求参数
详情页分析
详情页链接在列表页给你的链接是错误的
真是的链接如下图所示

由此图可知我们需要很多参数才能完成爬取
但是列表页给我们的链接也不是毫无用处

我们用正则提取中间所需要的参数即可完成爬取
代码
由于代码是用Go写的 用colly 还不是特别熟练
package main
import (
"fmt"
"github.com/gocolly/colly"
"regexp"
"time"
)
func main() {
PostUrl := "https://kns.cnki.net/kns8/Brief/GetGridTableHtml"
c, contentCollector := initCollector()
c.OnRequest(func(r *colly.Request) {
fmt.Println(r)
fmt.Println(r.Method)
r.Headers.Set("Accept", "text/html, */*; q=0.01")
r.Headers.Set("Accept-Language", "zh-CN,zh;q=0.9")
r.Headers.Set("Connection", "keep-alive")
r.Headers.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
r.Headers.Set("Origin", "https://kns.cnki.net")
r.Headers.Set("Referer", "https://kns.cnki.net/kns8/defaultresult/index")
r.Headers.Set("Sec-Fetch-Dest", "empty")
r.Headers.Set("Sec-Fetch-Mode", "cors")
r.Headers.Set("Sec-Fetch-Site", "same-origin")
r.Headers.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36")
r.Headers.Set("X-Requested-With", "XMLHttpRequest")
})
// 解析列表页
c.OnHTML(".result-table-list tbody", func(element *colly.HTMLElement) {
element.ForEach("tr", func(i int, element *colly.HTMLElement) {
// 获取链接地址
titleUrl, _ := element.DOM.Find("a").Attr("href")
// 获取时间
titleDate := element.DOM.Find("td.date").Text()
// 拿到标题名
s := element.DOM.Find("a").Text()
// 切片取值
if len(s) < 0 {
_ = fmt.Errorf("匹配失败,长度为:%v\n", len(s))
}
titleName := s[:len(s)-4]
// 正则取 decode的值
//deCodeRe := `DbCode=(.*?)&`
// 正则 fileName 的值
fileNameRe := `FileName=(.*?)&`
// 正则 取DbName 的值
dbNameRe := `DbName=(.*?)&`
isMatched, _ := regexp.MatchString(fileNameRe, titleUrl)
if !isMatched {
_ = fmt.Errorf("匹配失败,%v\n", isMatched)
}
fileName := regexp.MustCompile(fileNameRe).FindStringSubmatch(titleUrl)[1]
dbName := regexp.MustCompile(dbNameRe).FindStringSubmatch(titleUrl)[1]
trueUrl := fmt.Sprintf(`https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=CCND&dbname=%s&filename=%s&uniplatform=NZKPT`, dbName, fileName)
fmt.Println(titleName)
fmt.Println(titleDate)
fmt.Println(trueUrl)
_ = contentCollector.Visit(trueUrl)
})
sqlVal, _ := element.DOM.Find("#sqlVal").Attr("value")
_ = c.Post(PostUrl, map[string]string{
"IsSearch": "false",
"QueryJson": `{"Platform":"","DBCode":"CFLS","KuaKuCode":"CJFQ,CDMD,CIPD,CCND,CISD,SNAD,BDZK,CCJD,CCVD,CJFN","QNode":{"QGroup":[{"Key":"Subject","Title":"","Logic":1,"Items":[{"Title":"主题","Name":"SU","Value":"矿","Operate":"%=","BlurType":""}],"ChildItems":[]}]}}`,
"SearchSql": sqlVal,
"PageName": "defaultresult",
"HandlerId": "16",
"DBCode": "CFLS",
"KuaKuCodes": "CJFQ,CDMD,CIPD,CCND,CISD,SNAD,BDZK,CCJD,CCVD,CJFN",
"CurPage": "2",
"RecordsCntPerPage": "20",
"CurDisplayMode": "listmode",
"CurrSortField": "",
"CurrSortFieldType": "desc",
"IsSortSearch": "false",
"IsSentenceSearch": "false",
"Subject": "",
})
})
// 解析详情页
contentCollector.OnHTML(".brief", func(element *colly.HTMLElement) {
contentHtml := element.Text
fmt.Printf(contentHtml)
})
_ = c.Post(PostUrl, map[string]string{
"IsSearch": "true",
"QueryJson": `{"Platform":"","DBCode":"CFLS","KuaKuCode":"CJFQ,CDMD,CIPD,CCND,CISD,SNAD,BDZK,CCJD,CCVD,CJFN","QNode":{"QGroup":[{"Key":"Subject","Title":"","Logic":1,"Items":[{"Title":"主题","Name":"SU","Value":"矿","Operate":"%=","BlurType":""}],"ChildItems":[]}]}}`,
"PageName": "defaultresult",
"DBCode": "CFLS",
"KuaKuCodes": "CJFQ,CDMD,CIPD,CCND,CISD,SNAD,BDZK,CCJD,CCVD,CJFN",
"CurPage": "1",
"RecordsCntPerPage": "20",
"CurDisplayMode": "listmode",
"CurrSortField": "",
"CurrSortFieldType": "desc",
"IsSentenceSearch": "false",
"Subject": "",
})
}
func initCollector() (*colly.Collector, *colly.Collector) {
// 1. 创建收集器
c := colly.NewCollector(
colly.UserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"),
colly.AllowURLRevisit(),
)
// 设置抓取频率限制
_ = c.Limit(&colly.LimitRule{
DomainGlob: "*",
RandomDelay: 5 * time.Second, // 随机延迟
})
// 设置clone内容 解析
contentCollector := c.Clone()
return c, contentCollector
}
JS逆向实战8——某网实战(基于golang-colly)的更多相关文章
- 手把手教你写电商爬虫-第三课 实战尚妆网AJAX请求处理和内容提取
版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 看完两篇,相信大家已经从开始的 ...
- 《Python Web开发实战》|百度网盘免费下载|Python Web开发
<Python Web开发实战>|百度网盘免费下载|Python Web开发 提取码:rnz4 内容简介 这本书涵盖了Web开发的方方面面,可以分为如下部分: 1. 使用最新的Flask ...
- Dubbo官网实战使用技巧
原文链接:Dubbo官网实战使用技巧 1.启动时检查: 我们检查依赖的服务是否启动,可利用下面三个属性,优先级从左到右逐渐降低. 如果服务不是强依赖,或者说服务之间可能存在死循环依赖,我们应该将 ch ...
- js中各种跨域问题实战小结(二)
这里接上篇:js中各种跨域问题实战小结(一) 后面继续学习的过程中,对上面第一篇有稍作休整.下面继续第二部分: -->5.利用iframe和location.hash -->6.windo ...
- js中各种跨域问题实战小结(一)
什么是跨域?为什么要实现跨域呢? 这是因为JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.也就是说只能访问同一个域中的资源.我觉得这就有必要了解下javascript中的同源策略 ...
- Sass实战 sass官网
Sass实战 sass官网 1.相关视频教程:http://pan.baidu.com/s/1eSl8bUa 1.1我的项目源码:http://pan.baidu.com/s/1dFmqbyp 1.2 ...
- 主题:实战WebService II: SOAP篇(基于php)
概述(SOAP和XML-PRC比较) 在Web服务发展的初期,XML格式化消息的第一个主要用途是,应用于XML-RPC协议,其中RPC代表远程过程调用.在XML远程过程调用 (XML-RPC)中,客户 ...
- 项目实战——企业级Zabbix监控实战(一)
项目实战--企业级Zabbix监控实战 实验一:Zabbix监控的搭建 1.实验准备 centos系统服务器3台. 一台作为监控服务器, 两台台作为被监控节点, 配置好yum源. 防火墙关闭. 各节点 ...
- 我去!爬虫遇到JS逆向AES加密反爬,哭了
今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...
随机推荐
- Excel 统计函数(三):AVERAGE 和 AVERAGEA
AVERAGE 只能计算纯数值,如果引用的单元格是非数值,不会被计入总数:AVERAGEA 可以计算逻辑值.代表数字的文本等. 假如下列有一个表格,分别使用两种算术评价函数计算平均值. [过程]AVE ...
- RabbitMQ实现订单超时案例
前言 人间清醒 目录 前言 业务场景 JUC(DelayQueue)方案 DelayQueue简介 JUC DelayQueue实现订单超时案例代码 案例代码 Redis Key过期事件方案 简介 R ...
- 基于Anacoda搭建虚拟环境cudnn6.0+cuda8.0+python3.6+tensorflow-gpu1.4.0
!一定要查准cudnn,cuda,tensorflow-gpu对应的版本号再进行安装,且本文一切安装均在虚拟环境中完成. 下文以笔者自己电脑为例,展开安装教程阐述(省略anaconda安装教程): 1 ...
- 二维积水(DP优化)
题面 在二向箔爆发前的时间里,宇宙中就有一个叫地球的星球,上面存在过奴隶主,后来绝迹了-- --<第三维的往事> 在这个美丽的二维宇宙中,有一个行星叫地圆.地圆有一条大陆叫美洲,上面生活着 ...
- 全链路追踪体验—最简陋TraceId的生成
对于后端开发来说,排查问题是常有的事情.而排查问题时最常用的就是看日志,看一次调用中经过了哪些系统,是那个系统出问题了.这就需要业务日志中关联调用链的TraceId信息,从而在应用出现问题时,能够通过 ...
- Javascript之异步循环打印这道小题
这道题,我相信很多前端从业者都知道,它本质上来说并不复杂,但是却可以有很深远的扩展,最终核心的主题其实就是异步的遍历,其中对于题目的初级解法,还涉及到一些作用域的知识.那么我们以最容易理解的解法入手, ...
- Toast 部分记录丢失问题处理
在日常数据库运维过程中,我们可能会遇到类似以下的错误.该错误信息是由于部分tuple的 toast 字段丢失,导致数据无法访问.需要通过游标方式,将可以访问的数据备份出来. test=# create ...
- KingbaseFlySync 评估工具的使用
关键字: KingbaseFlySync.Linux.x86_64.mips64el.aarch64.Java **** 评估工具的使用**** 1.查询评估工具所在服务器的硬件平台(x86_64.m ...
- 【Android 逆向】手动构造dex文件
public class Hello { public static void main(String[] args) { System.out.println("hello android ...
- Python 第三次实验
一如既往地简单,不到半个小时即可完成 [1] (程序设计)输入一个正整数,输出它的因子分解式.如输入132,则输出132=122311 n=int(input()) print(1,end='') f ...