最近在写论文,导师那里很严格,所以我打算去知网下载文章进行参考,但是需要money,在同学的推荐下拿到了某宝一家免费的知网接口,今天就是对该网站的分析,最后成品会开源!在分析的时候被对方耍了一下,对方有一个登陆页面,登陆了后才发现只是个导航,其实登陆无所谓,只需要记住导航地址即可,但是还没完,我抓包发现,数据时HTML当我全部清洗干净后发现数据不是我想要的,对比网站HTML发现数据匹配不上,若大家对此类文章感兴趣欢迎订阅我的专栏《Python爬虫脚本项目实战
》
推荐我的爬虫文章
《记一次云之家签到抓包》
《记一次视频抓包m3u8解密过程》
《抓包部分软件时无网络+过代理检测 解决办法 安卓黄鸟httpcanary+vmos》
《Python】记录抓包分析自动领取芝麻HTTP每日免费IP(成品+教程)》
《某课抓包视频 安卓手机:黄鸟+某课app+VirtualXposed虚拟框架》
推荐专栏:
《Python爬虫脚本项目实战》
该专栏往期文章:
《【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)》
如果感觉看完文章还不过瘾,欢迎查看我的其它专栏
作者对python有很大的兴趣,完成过很多独立的项目:例如滇医通等等脚本,但是由于版权的原因下架了,爬虫这一类审核比较严谨,稍有不慎就侵权违规了,所以在保证质量的同时会对文章进行筛选
如果您对爬虫感兴趣请收藏或者订阅该专栏哦《Python爬虫脚本项目实战》,如果你有项目欢迎联系我,我会同步教程到本专栏!
登陆响应数据
{"code":200,"session":"41766242260434","type":"3","expiration":"\u6c38\u4e45\u6743\u9650","msg":"\u767b\u9646\u6210\u529f\uff0c\u8fc7\u671f\u65f6\u95f4\uff1a\u6c38\u4e45\u6743\u9650","cardtime":"3650","rename":"0"}
找到知網入口一,发现在跳转的同时访问了某个接口,由于我这里网页抓取不到,只能用抓包工具了
这里本来打算用Fiddler,电脑上我都用这个,结果这个抓不到数据,安卓手机上我用黄鸟,现在只有iphone 我下载了
Stream(苹果商店可以下载)
参考文章
《某课抓包视频 安卓手机:黄鸟+某课app+VirtualXposed虚拟框架》
《抓包部分软件时无网络+过代理检测 解决办法 安卓黄鸟httpcanary+vmos》
网址跳转重定向的时候,闪过了一个域名
https://xxxxx.com/9988.php
这是我手机抓到的数据盲猜和后面的cookie算法有关,这里先不做探究了
响应数据:
既然数据都在网页里面直接获取检索后的HTML代码即可
import requests
cookies = {
}
headers = {
'Accept': 'text/html, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
# 'Cookie': 'SID_kns_new=kns25128007; knsLeftGroupSelectItem=1%3B2%3B; dblang=ch',
'Origin': 'http://119.45.237.51',
'Referer': 'http://119.45.237.51/kns8/defaultresult/index',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
data = {
'IsSearch': 'true',
'QueryJson': '{"Platform":"","DBCode":"CFLS","KuaKuCode":"CJFQ,CCND,CIPD,CDMD,BDZK,CISD,SNAD,CCJD,GXDB_SECTION,CJFN,CCVD","QNode":{"QGroup":[{"Key":"Subject","Title":"","Logic":1,"Items":[{"Title":"主题","Name":"SU","Value":"你好,“海油观澜号”","Operate":"%=","BlurType":""}],"ChildItems":[]}]},"CodeLang":"ch"}',
'SearchSql': '0645419CC2F0B23BC604FFC82ADF67C6E920108EDAD48468E8156BA693E89F481391D6F5096D7FFF3585B29E8209A884EFDF8EF1B43B4C7232E120D4832CCC8979F171B4C268EE675FFB969E7C6AF23B4B63CE6436EE93F3973DCB2E4950C92CBCE188BEB6A4E9E17C3978AE8787ED6BB56445D70910E6E32D9A03F3928F9AD8AADE2A90A8F00E2B29BD6E5A0BE025E88D8E778EC97D42EF1CF47C35B8A9D5473493D11B406E77A4FF28F5B34B8028FE85F57606D7A3FED75B27901EEF587583EBD4B63AC0E07735BE77F216B50090DEE5ABB766456B996D37EB8BDACA3A67E8126F111CF9D15B351A094210DB6B4638A21065F03B6F0B73BB4625BBECE66F8197909739D8FB4EB756DEF71864177DFA3CB468CFA6E8ABF7924234DED6B0DFD49D9269CBA4A2BF4075D517A61D094225D70C1B4C137DB9614758A5E097376F5F3E55A7063A4B7E437436D13FF3CC8FB435E131FFCD16FC30DD997098B4FC997D995E767E2712175BC05B960D3FEB5CAF12A13BD1CE3530AD72FC4DB93206996E216BC5DC294960A0CA05E986848E1E64FFC5A52BFCB41A97840A708E397F11EFF261E08F3A34094061AE8E8F819AF6A17A9E2176C3893C6DD3E3C06864C91989BDEF9790A38FAF2524B17743B30EBA4ADD550BF985F9C3097A608C697283CE37F8CB78BDC9EAA4874C3485E6F931B016EC41BFBC0EF91B2AD7E1B424E1DFB8FC8771DEA2458C5A7A4C9BF0192C101FD8EDDEE1BACB44C3E478361EF0D1B70FAD56BCF6870A6044D3A226611B9C1A43C6F9F7C021C98E0D5F778D72C87183F026071A730B8BB4FABF9F68FEC783AB1E6E79218B5D87FD1BB541817FB4F3C21DC849A803CB8A620A2EE00475BAF2CE6556638B7A949B446F39A1076DA15764A777BA6239447CB91F4CF513325366E167D268DDB75F288B5C13415CE62F5C431181C044A28CA502FF14439E5C6F63D419CB6DE1360DB01593FE765459299E442EE24917C199AB5178F38461F8C4EBBC95344C5F2AB60F379813A87E2E3AFE3021198B8222CEAB870D9A353786079961184D63977917C7DF8FE6AFBBC795A832BDD454D6E3CD22C3FF7A58808923DD6F464C12A9A88FBFD0C71458AB0E4C1D566315181A9578ECE93670E5CAF13CF2553F68E64726C131F4A48B42A9E7F09EFEBA51D1FDA6BA0ECA0B02B951ECC04548F1D4D08DB69D0EFDCE6793537BB8E59DC442631A9CDBA13878D7493AADA0CD868C1C1C3A6A6FA17C4109205A83F9C0C43E0D2551D0A8592EA99D20D4B78B4EEEE2D53A543701F620C7D6FF46E800B0CEF9B3D23ACD62C7CBEA25FC8BD74D5A0E5C86B9CF3FCACBDBE585AFF85F9689CBF5BCBD267C580361D5B93AA9BD5A1BB6122BB87C04AE227211FE675A4650814F2285261E5641683D65E0454E2597F6025BB4AA1A044D7B97F57394EA5EC878B80FC0A82F12E2D3D9E1BCB062A7ABB290F02116BDED95761A67CE2FDDE42BDDDF34F22E49A0406D724FEBC86B93F80BB52A8D34B8D2B24288ECBC3F90CCB1EF36085E77F1E2AE0AB411FE60A033E704A21469EA5CE4BB8AF6B1C1F1C5F1F084472D57F458CC39F0B2FE583D0795159E9E38BD1102F5D96DB0F828B66F41A702BB0AE59E40CF53BE7F6342EF208434CFFABF845AFD771B288D484BB79952159E6EA27658A6B6230557AF16E86C4AFDF973DBD5A3A2B979AD9037441409D22A954DC50CBCEA8EA5AC500C4BC8282DCE2626BD2B2CB4B1E33B2E1F92533F7F04C48D061907DBCE3E21FF0A77F09C1AE33E769962CD1EDE6B688590D569409EE9EEC4DF1074DCC97C43B0EDAF1C38B5B2784ABC803D9B3B4FC35F46CB1E275E7F83036FC6AFF2E624D4D2E6AE1C2D4CE3FF219FA90A935957E0DE1A386E4AAB5C9F9D1CECA909F5698BFA86C57B6A73D3C0F9FDB94128B7BB9FDD19D57E4C2C2F4127A1F127A96ABF248B26D8B6EF12A1EA97D064564D33D46E5CA71F53FA121A7E5C91ED2B08BE64A0E3D22BE26FC251C0BF4CF21674DE19AF410E3EDFBD9A4BBEA6C709A1E42B5C17E1EE7AA33EFB0F375BF0858D49210A71662313FA5B8E04E508A5E9425D49C3C5D12CB8DCADBF8A148BFA042BBB0218AAC403AAB9CECC45FD33CEC6797FC984BF91FF638AF6E1F09546F595CFC779D2D867282C63B78DC6A6ED3C1C3887462C84AC07C756C5A8D8A8B2EFD39C28A68D47091A3312461BC20085636F4B41F22D5B46861F3E557777CDCFDFE6CAB8ABECFECA3634D779C0F21185772CA46EA1C0B1E0191F02F11A2B10372550A8B839D8C819F77A67512CA57D16DBA687D1BB77271E375C6DD3432C804B0A707D0DF7D72108E3190885E95DE0F0F118A904C80D606BB82C582FF3E3D836AED573EA426D382FF3D0C83B51E0E63B863FC20F67D2C68C14558E2EEDED6B71B615A74152632E0E1A4BFC01F083BEEA6E702D1650038B1826D1970F88507FB5E5C07A18F3BD94177B73C5C9E960EE73ED66B353BB65245EABB7D552BA6F27425B703A081479862CF0C6A2102A796F0B93F072D362F8CE04AB334C4342186C69F946794EE812FFC903D270DF98BCEAF98F8C4D685BB25DD848FBDE28BE6A5DB4564BF4D9115620B5BA45E1A86A44A0F4A1D1839184E8E952AB38050D6C2A5378577AB09FA6A5167AA498C61F04853CCA741B2A360E4EA67F8F67E4739DFB9DF144C9D44CBAFEA30AD7B764F276F570674A2333F36EB6C9051026EA82DE60C00EFB5DF9661474D1A9DDD4137C8E7DC9E1B9C4D4E6D9091E5764AECB618E94F85A503FBACE93CAB29A06953832D09B0209A14A166A74F1CD4897AE8859A481A4DBFAD581995A658F3760823F3D9B538DD0053554A723CBD58B946830D2FA2B6D7B488523EEBCC212063F740F5127D3FFE63AA9C5D7C62255D6DBB79EAFD56880D73477414AD8D88B4742516151C806BE56D392C9CBE1A8104D60E50DAFED1F5C838D2F6FBBF261AEC9AE8967DE29EC73BFDEC898D8AAF7991469D79734D3C1D41A1F2B96206D598E265C331B6C38A49B14453322F18EEBEF1B6D4FEBC2515A695E7D9468E8BB142A4FD9AADFF88397AD8E94BE63C807C65CF264485BFE49D8C2812F7E37B4B987F7A6C15283D068254EA587B04018CDF19DC5612BFBDAF0C937B872A907A8719868DFF55700CC215B580190CE1DA4293C56FE8C836F6804347495F534768BA0F62A17C4F19346CA711FD1F71EB7C0720313ABC0D4FB70E0A567320E1F9CC052DF2C937A85',
'PageName': 'defaultresult',
'HandlerId': '0',
'DBCode': 'CFLS',
'KuaKuCodes': 'CJFQ,CCND,CIPD,CDMD,BDZK,CISD,SNAD,CCJD,GXDB_SECTION,CJFN,CCVD',
'CurPage': '1',
'RecordsCntPerPage': '20',
'CurDisplayMode': 'listmode',
'CurrSortField': '',
'CurrSortFieldType': 'desc',
'IsSortSearch': 'false',
'IsSentenceSearch': 'false',
'Subject': '',
}
response = requests.post(
'http://*****/kns8/Brief/GetGridTableHtml',
cookies=cookies,
headers=headers,
data=data,
verify=False,
)
print(response.text)
打印结果
<script src="/c_data.js"></script><form method="post" name="gridTableForm">
<div id="gridTable" class="search-result">
<div class='toolbar'><div id="countPageDiv" class="result-con-r"><span class='pagerTitleCell'>共找到<em>1</em>条结果</span></div><div class='toolbar-col'>
<div class="checkcount">
<label class="checkAll"><input type="checkbox" name="selectCheckbox" id="selectCheckAll1" onclick="$(this).filenameClick()">全选</label>
<span>已选:</span>
<em title='点击查看所选文献' id='selectCount' name='selectCount' onclick='window.open(APPPATH + "/manage.html"+(GetQueryStringByName("subject")?"?subject="+GetQueryStringByName("subject"):""))'>0</em>
<a href="javascript:$.filenameClear();">清除</a>
</div>
<ul class="dropdown-analysis-btns" id="batchOpsBox">
<li class="bulkdownload export"><a href="javascript:void(0)">批量下载</a></li>
<li>
<a href="javascript:void(0)">导出与分析</a><i class="icon-d"></i>
<ul>
<li class="export">
<a href="javascript:void(0)">导出文献</a>
<i class="icon-r"></i>
<ul class="secondUl">
<li><a href="javascript:void(0)" exportType="GBTREFER">GB/T 7714-2015 格式引文</a></li>
<li><a href="javascript:void(0)" exportType="elearning" >知网研学(原E-Study)</a></li>
...
...
...
...
..
bs = BeautifulSoup(response.text,"html.parser")
print("downloadlink:"+bs.select('.downloadlink')[0]['href'])
print("cbItem:"+bs.select('.cbItem')[0]['value'])
print("title:"+bs.select('.fz14')[0].get_text())
# print("来源:"+bs.select('.source')[0].get_text())
# print("作者:"+bs.select('.author')[0].get_text())
print(f'标题:{bs.select(".Mark")[0].get_text()},来源:{bs.select(".source")[0].get_text()},作者:{bs.select(".author")[0].get_text()}')
furl_ = bs.select('.downloadlink')[0]['href'].split('?')
furl=furl_[1]
sfname_ = bs.select('.cbItem')[0]['value'].split('!')
sfname = sfname_[1]
title=bs.select('.fz14')[0].get_text()
查看c_data.js的数据,我们发现最后的接口是通过js算出来渲染到首页的,所以接口应该是
https://cnki-oss******/download?“+furl+”&fileid=“+sfname+”&title="+title
function ddata()
{
$('.result-table-list tr').each(function (i){
if(i>0)
{
var sfname="",dbcode="",author="",source="",title="",time="",type="";
var fz14= ($(this).find("a[class='fz14']"));
var url0=fz14.attr("href");
var title=$.trim(fz14.text());
var briefDl=$(this).find("a.downloadlink");
var quote=$(this).find("a.icon-quote");
var collect=$(this).find("a.icon-collect");
var url1=briefDl.attr("href");
var FileNameS=$(this).find("input[class='cbItem']").val();
arr=FileNameS.split('!');
if(arr!=null)
{
dbcode=arr[0]
sfname=arr[1];
}
var furl="";
if(url1!=null)
{
arr=url1.split('?');
if(arr!=null)furl=arr[1];
}
author=$.trim($(this).children(".author").text());
source=$.trim($(this).children(".source").text());
time=$.trim($(this).children(".date").text());
var newUrl="https://cnki-******/download?"+furl+"&fileid="+sfname+"&title="+title;
$(this).find("a").attr('href',newUrl);
briefDl.removeClass("icon-notlogged").addClass('icon-download');
quote.attr('href','javascript:void(0)');
collect.attr('href','javascript:void(0)');
briefDl.attr('title',"涓嬭浇");
fz14.attr('title',sfname);
}
});
//BriefOnload();
}
因为现在有了chatgpt,于是我们直接上手去问吧,先找到js所提到的downloadlink
找到HTML代码,数据值就是我们要的数据,复制一下
前往Chatgpt通过js代码查看打印,构造代码
因为js算法中:
arr=url1.split('?');
if(arr!=null)furl=arr[1];
所以
var url1=“/kns8/download?filename=6FXYXBjcRZlN3NkV1MmcUBXaRp2dNpWNodDNI9EWrATeVpkRKhjS6V0dqZkZid1bW5EOBN3QtN1dyJkYjFUVapHTjZnQsFUbQN2M1cFMLlkU5ZXdKZ2Vk9UNjdXc3QkaJtyatNzTxcEd5RWW4IFNXdUdi9kSVNWO&tablename=CJFDLAST2022”;
arr=url1.split(‘?’);
请输出一下arr[1]
看一下回答结果
数据模拟成功后我们再次观察正确数据做下参数对比,发现数据是正确的
分析js,找到class:‘cbItem’
HTML中的位置
一样的,通过chatgpt来进行还原验证
原代码:
var FileNameS=$(this).find("input[class='cbItem']").val();
arr=FileNameS.split('!');
if(arr!=null)
{
dbcode=arr[0]
sfname=arr[1];
}
改造后,发送给Chatgpt来进行验证
var FileNameS="CJFDLAST2022!KJFT202228004!1!0";
arr=FileNameS.split('!');
if(arr!=null)
{
dbcode=arr[0]
sfname=arr[1];
}
打印sfname的值
输出结果
var FileNameS = "CJFDLAST2022!KJFT202228004!1!0";
var arr = FileNameS.split('!');
if (arr != null) {
dbcode = arr[0];
sfname = arr[1];
}
console.log(sfname);
输出:KJFT202228004
观察js算法数据
这里可以不用做验证,直接找到数据
分析结束,接下来就是通过python进行构造请求
好像出了点问题,排查发现没有title,原来是ide的问题,手动复制粘贴吧
再次测试,的确是能下载下来
换了个浏览器,居然还是拒绝访问,所以?猜测cookie肯定是需要的,将cookie清除或者禁用后
发现果真没有cookie不行
那就再次重新开始,观察cookie的携带
先不急着获取cookie,先一段代码,测试下cookie存在的情况下是否能下载
通过requests构造请求,将链接和参数直接改为我们上面获取到的链接,携带cookie测试
import requests
cookies = {
'sessionid': 'vp8zc6jwbp6xoi1ig5ehi7zh82q9jdlw',
'AUTH_TOKEN': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IjQxNzY2MjQyMjYwNDM0IiwidXNlcl9pZCI6NjYwMTgzLCJlbWFpbCI6IiIsImV4cCI6MTY4MTg4NjQ4OH0.VLkygFS8FuT6X2FE8jbJF9IwBAC7pp1gT1gtdcFCRlM',
}
headers = {
'authority': 'cnki-oss.doc110.com',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'zh-CN,zh;q=0.9',
'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
}
response = requests.get('https://*******api/download?filename=uB3KqZmb4Qndj1kWvhHV3sCZytGNMtWYxlEe4lUMaFlQKFjaxwWVlFVWRRzdCd2axM2V1UWVrVnQrpXcoRWcPNmSw9Wb2hkdCxGOsRWNqp0cGhUeQl2bTBTbstUZplUeXZ1ZipkYJhGOQdEWwlkeQd2cKxEVypUQ&tablename=CJFDLASN2020&fileid=SJSM202008052&title=', cookies=cookies, headers=headers)
# 判断请求状态码是否为200
if response.status_code == 200:
with open('file.pdf', 'wb') as f:
f.write(response.content)
print('下载成功!')
else:
print('下载失败!')
成功了,接下来就是获取cookie
sessionid | vp8zc6jwbp6xoi1ig5ehi7zh82q9jdlw |
---|---|
AUTH_TOKEN | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 |
cookie的时间大概是1个月,我在考虑这部分要不要弄,因为接口的拼接属于偶然,再次去找cookie的算法有点折磨人,暂时就这样用着,后面需求多了再考虑分析
以上就是今天教程,在对教程分析时,由于博主是一边分析一边记录,最后再放到相关的地方,会存在逻辑先后的不明确,建议大家有问题不要卡在那里,继续往下,在做分析的同时发现了对方是利用cookie和ip来进行检测的,这与我最初的结论是不一样的,对于IP注册和cookie获取可能需要完整的进行整个流程的操作(若我做出了更新会同步到文章【分析Cookie】部分)
推荐我的爬虫文章
《记一次云之家签到抓包》
《记一次视频抓包m3u8解密过程》
《抓包部分软件时无网络+过代理检测 解决办法 安卓黄鸟httpcanary+vmos》
《Python】记录抓包分析自动领取芝麻HTTP每日免费IP(成品+教程)》
《某课抓包视频 安卓手机:黄鸟+某课app+VirtualXposed虚拟框架》
推荐专栏:
《Python爬虫脚本项目实战》
该专栏往期文章:
《【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)》
如果感觉看完文章还不过瘾,欢迎查看我的其它专栏
作者对python有很大的兴趣,完成过很多独立的项目:例如滇医通等等脚本,但是由于版权的原因下架了,爬虫这一类审核比较严谨,稍有不慎就侵权违规了,所以在保证质量的同时会对文章进行筛选
如果您对爬虫感兴趣请收藏或者订阅该专栏哦《Python爬虫脚本项目实战》,如果你有项目欢迎联系我,我会同步教程到本专栏!