C# 采集知网
采集知网
WebClient
/// <summary>
/// 支持 Session 和 Cookie 的 WebClient。
/// </summary>
public class WebClientHelper:WebClient { // Cookie 容器
private CookieContainer cookieContainer; /// <summary>
/// 创建一个新的 WebClient 实例。
/// </summary>
public WebClientHelper() {
this.cookieContainer = new CookieContainer();
} /// <summary>
/// 创建一个新的 WebClient 实例。
/// </summary>
/// <param name="cookie">Cookie 容器</param>
public WebClientHelper(CookieContainer cookies) {
this.cookieContainer = cookies;
} /// <summary>
/// Cookie 容器
/// </summary>
public CookieContainer Cookies {
get { return this.cookieContainer; }
set { this.cookieContainer = value; }
}
// 设置自己想要添加的登陆信息等cookie
public void SetCustCookie(string name,string value,string path,string domain) {
CookieCollection cookies = new CookieCollection();
cookies.Add(new Cookie(name.Trim(),value.Trim(),path,domain));
Cookies.Add(cookies);
}
/// <summary>
/// 返回带有 Cookie 的 HttpWebRequest。
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
protected override WebRequest GetWebRequest(Uri address) {
WebRequest request = base.GetWebRequest(address);
if(request is HttpWebRequest) {
HttpWebRequest httpRequest = request as HttpWebRequest;
httpRequest.CookieContainer = cookieContainer;
}
return request;
} #region 封装了PostData, GetSrc 和 GetFile 方法 /// <summary>
/// 向指定的 URL POST 数据,并返回页面
/// </summary>
/// <param name="uriString">POST URL</param>
/// <param name="postString">POST 的 数据</param>
/// <param name="postStringEncoding">POST 数据的 CharSet https://blog.csdn.net/gengyiping18/article/details/77620061</param>
/// <param name="dataEncoding">页面的 CharSet</param>
/// <returns>页面的源文件</returns>
public string PostData(string uriString,string postString,string postStringEncoding = "utf-8",string dataEncoding = "utf-8") {
try {
// 将 Post 字符串转换成字节数组
byte[] postData = Encoding.GetEncoding(postStringEncoding).GetBytes(postString);
this.Headers.Add("Content-Type","application/x-www-form-urlencoded");
// 上传数据,返回页面的字节数组
byte[] responseData = this.UploadData(uriString,"POST",postData);
string srcString = Encoding.GetEncoding(dataEncoding).GetString(responseData);
srcString = srcString.Replace("\t","");
srcString = srcString.Replace("\r","");
srcString = srcString.Replace("\n","");
return srcString;
} catch(WebException we) {
Logger.LogError("PostData:" + uriString + "?" + postString,we);
return "error";
}
} /// <summary>
/// 获得指定 URL 的源文件
/// </summary>
/// <param name="uriString">页面 URL</param>
/// <param name="dataEncoding">页面的 CharSet</param>
/// <returns>页面的源文件</returns>
public string GetSrc(string uriString,string dataEncoding = "utf-8") {
try {
// 返回页面的字节数组
byte[] responseData = this.DownloadData(uriString);
// 将返回的将字节数组转换成字符串(HTML);
string srcString = Encoding.GetEncoding(dataEncoding).GetString(responseData);
srcString = srcString.Replace("\t","");
srcString = srcString.Replace("\r","");
srcString = srcString.Replace("\n","");
return srcString;
} catch(WebException we) {
Logger.LogError("GetSrc:" + uriString,we);
return "error";
}
} /// <summary>
/// 从指定的 URL 下载文件到本地
/// </summary>
/// <param name="uriString">文件 URL</param>
/// <param name="fileName">本地文件的完成路径</param>
/// <returns></returns>
public bool GetFile(string urlString,string fileName,out string msg) {
try {
this.DownloadFile(urlString,fileName);
msg = string.Empty;
return true;
} catch(WebException we) {
msg = we.Message;
return false;
}
} /// <summary>
/// 遍历CookieContainer
/// </summary>
/// <param name="cc"></param>
/// <returns></returns>
public List<Cookie> GetAllCookies(CookieContainer cc) {
List<Cookie> lstCookies = new List<Cookie>();
Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable",
System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.GetField|
System.Reflection.BindingFlags.Instance,null,cc,new object[] { }); foreach(object pathList in table.Values) {
SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list",
System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.GetField
|System.Reflection.BindingFlags.Instance,null,pathList,new object[] { });
foreach(CookieCollection colCookies in lstCookieCol.Values)
foreach(Cookie c in colCookies) lstCookies.Add(c);
}
return lstCookies;
}
public List<Cookie> GetAllCookies() {
CookieContainer cc = this.cookieContainer;
List<Cookie> lstCookies = new List<Cookie>();
Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable",
System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.GetField|
System.Reflection.BindingFlags.Instance,null,cc,new object[] { }); foreach(object pathList in table.Values) {
SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list",
System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.GetField
|System.Reflection.BindingFlags.Instance,null,pathList,new object[] { });
foreach(CookieCollection colCookies in lstCookieCol.Values)
foreach(Cookie c in colCookies) lstCookies.Add(c);
}
return lstCookies;
}
#endregion 封装了PostData, GetSrc 和 GetFile 方法
}
MAIN 采集知网("知网","",0,0);
public void 采集知网(string type,string StrUnit,int minPage,int maxPage) {
if(string.IsNullOrWhiteSpace(type)) type="知网";
if(string.IsNullOrWhiteSpace(StrUnit)) StrUnit=BaseDAL.GetSystemInstitutions();
if(minPage<=0) minPage=1;
if(maxPage<=0) maxPage=10;
string url = "https://kns.cnki.net/kns/request/SearchHandler.ashx";
Dictionary<string,string> postData = new Dictionary<string,string>();
postData.Add("pagename","brief_result_aspx");
postData.Add("dbPrefix","SCDB");
postData.Add("dbCatalog","中国学术文献网络出版总库");
postData.Add("ConfigFile","SCDB.xml");
postData.Add("db_opt","CJFQ,CDFD,CMFD,CPFD,IPFD,CCND,CCJD");
postData.Add("danwei_1_sel","AF");
postData.Add("danwei_1_value1",""+StrUnit+"");
postData.Add("publishdate_from",DateTime.Now.AddDays(-30).ToString("yyyy-MM-dd"));//2022-6-18
postData.Add("publishdate_to",DateTime.Now.ToString("yyyy-MM-dd"));//2022-6-18
postData.Add("danwei_1_special1","=");
postData.Add("isinEn","1");
string postDataStr = postData.ToUrlParams();
//建立会话
WebClientHelper webClient = new WebClientHelper();
string mainData = webClient.PostData(url,postDataStr);
var cli = webClient.GetAllCookies();
string cookie = cli[0].ToString();
Dictionary<string,string> header = new Dictionary<string,string>();
header.Add("Cookie",cookie);
// 查询获取总条数
url="https://kns.cnki.net/kns/brief/brief.aspx?pagename=ASP.brief_result_aspx&isinEn=1&dbPrefix=SCDB&dbCatalog=%e4%b8%ad%e5%9b%bd%e5%ad%a6%e6%9c%af%e6%96%87%e7%8c%ae%e7%bd%91%e7%bb%9c%e5%87%ba%e7%89%88%e6%80%bb%e5%ba%93&ConfigFile=SCDB.xml&research=off&t=1592202301266";
string res = webClient.PostData(url,postDataStr);
string preg_cookie = "id=\"resultcount\" name=\"resultcount\" value=\"([0-9]*)\"";
var rg = Regex.Match(res,preg_cookie);
var num = rg.Groups[1].Value.ToDouble();
Console.WriteLine("num:"+num);
preg_cookie="QueryID=[0-9]*";
rg=Regex.Match(res,preg_cookie,RegexOptions.Singleline);
string QueryID = rg.Value.Replace("QueryID=","");
Console.WriteLine("QueryID:"+QueryID);
if(num<=0) {
Console.WriteLine("没有采集到新数据");
return;
}
var cot = Math.Round(num/50);
//分页获取所有数据
string data = "";
for(int i = minPage;i<=cot;i++) {
if(i>maxPage) break;
url="https://kns.cnki.net/kns/brief/brief.aspx?curpage="+i+"&RecordsPerPage=50&QueryID="+QueryID+"&ID=&turnpage=1&tpagemode=L&dbPrefix=SCDB&Fields=&DisplayMode=custommode&PageName=ASP.brief_result_aspx&sKuaKuID=0&isinEn=1&";
res=webClient.PostData(url,postDataStr);
data+=res;
}
var regex = new Regex(@"<li>(.*?)<\/li>");
var ret = regex.Matches(data);
Dictionary<string,string> pattern = new Dictionary<string,string>();
pattern.Add("title",@"class=""title_c""><a href='(.*)' target='_blank'>(.*)</a>(.*)</h3>");
pattern.Add("author",@"class=""author""> (.*),</span>");
pattern.Add("journal",@"class=""journal"">[\s\S]*?<\/span>");
pattern.Add("database",@"class=""database"">(.*?)</span>");
pattern.Add("pub_dates",@"<label>.*?发表时间:(.*)<\/label>");
pattern.Add("abstract_c",@"<p.*?class=""abstract_c"">[\s\S]*?<\/p>");
List<LunWen> modes = new List<LunWen>();
foreach(Match mat in ret) {
LunWen model = new LunWen();
model.wt_Type=type;
model.wt_DownDate=DateTime.Now;
string row = mat.Groups[1].Value;
var title = Regex.Match(row,pattern["title"],RegexOptions.Singleline);
if(!string.IsNullOrWhiteSpace(title.Value)) {
model.wt_Title=title.Groups[2].Value;
model.wt_Url="https://kns.cnki.net"+title.Groups[1].Value;
//作者
var authorAndLink = Regex.Match(row,pattern["author"]);
if(!string.IsNullOrWhiteSpace(authorAndLink.Value)) {
string authors_names = "";
var autReg = Regex.Matches(authorAndLink.Value,@"[\u4E00-\u9FFF]+",RegexOptions.IgnoreCase|RegexOptions.IgnorePatternWhitespace);
for(int j = 0;j<autReg.Count;j++) {
authors_names+=","+autReg[j].Value;
}
model.wt_Author=authors_names;
}
//单位
var journal = Regex.Match(row,pattern["journal"]);
if(!string.IsNullOrWhiteSpace(journal.Value)) {
model.wt_Unit=GetChineseWord(journal.Value);
}
//期刊论文
var database = Regex.Match(row,pattern["database"]);
if(!string.IsNullOrWhiteSpace(database.Value)) {
model.wt_ResouceType=GetChineseWord(database.Value);
model.wt_Source=database.Groups[1].Value;
}
//2022年01期
var pub_dates = Regex.Match(row,pattern["pub_dates"]);
if(!string.IsNullOrWhiteSpace(pub_dates.Value)) {
model.wt_Volume=pub_dates.Groups[1].Value;
}
//内容
var abstract_c = Regex.Match(row,pattern["abstract_c"]);
if(!string.IsNullOrWhiteSpace(abstract_c.Value)) {
model.wt_Content=abstract_c.Value;
}
modes.Add(model);
Console.WriteLine(type+":"+model.wt_Title);
}
}
if(modes.Count>0) {
Console.WriteLine("采集到新数据准备入库");
LunWenDal.AddBatch(modes);
Console.WriteLine("采集到新数据已入库完成");
} else {
Console.WriteLine("没有采集到新数据");
}
}
获取中文:
public static string GetChineseWord(string oriText) {
string x = @"[\u4E00-\u9FFF]+";
MatchCollection Matches = Regex.Matches(oriText,x,RegexOptions.IgnoreCase);
StringBuilder sb = new StringBuilder();
foreach(Match NextMatch in Matches) {
sb.Append(NextMatch.Value);
}
return sb.ToString();
}
实体类:
public partial class LunWen {
/// <summary>
/// 论文网推 LunWen
/// </summary>
public LunWen() {
}
/// <summary>
/// wt_id
/// </summary>
public int wt_id { get; set; }
/// <summary>
/// 单位名称
/// </summary>
public string wt_Unit { get; set; }
/// <summary>
/// 知网、万文
/// </summary>
public string wt_Type { get; set; }
/// <summary>
/// 论文标题
/// </summary>
public string wt_Title { get; set; }
/// <summary>
/// 论文地址
/// </summary>
public string wt_Url { get; set; }
/// <summary>
/// 类型
/// </summary>
public string wt_ResouceType { get; set; }
/// <summary>
/// 作者
/// </summary>
public string wt_Author { get; set; }
/// <summary>
/// 来源
/// </summary>
public string wt_Source { get; set; }
/// <summary>
/// 期刊
/// </summary>
public string wt_Volume { get; set; }
/// <summary>
/// 内容
/// </summary>
public string wt_Content { get; set; }
/// <summary>
/// 下载日期
/// </summary>
public DateTime? wt_DownDate { get; set; }
}
Python采集知网 https://www.cnblogs.com/luomingui/p/17701445.html
C# 采集知网的更多相关文章
- 中国知网cnki(永久会员账号)
中国知网cnki(永久会员账号)大男孩免费分享 网站简介: (中国知网http://www.cnki.net/)中国知网是国家知识基础设施(National Knowledge Infrastru ...
- 论文 查重 知网 万方 paperpass
相信各个即将毕业的学生或在岗需要评职称.发论文的职场人士,论文检测都是必不可少的一道程序.面对市场上五花八门的检测软件,到底该如何选择?选择查重后到底该如何修改?现在就做一个知识的普及.其中对于中国的 ...
- 2015年最新中国知网CNKI免费账号直接入口
以下是Free9免费资源网小编收集整理的2015年最新中国知网CNKI免费账号直接入口,现免费分享给大家(仅供测试使用),此类文献数据库资源有时效性,希望对您的学习.工作上有所帮助! 中国知网直接入口 ...
- 如何将中国知网CNKI中的文献导入EndNote X6
如何将中国知网CNKI中的文献导入EndNote X6 下面给出具体步骤: 1.在CNKI中检索目标文献,如检索<基于Qt的三维可视化技术研究> 我喜欢在CNKI(http://www.c ...
- 去掉cajviewer 右上角的“中国知网数字出版物超市
cajviewer软件是一款可以提取pdf字码的软件(即使pdf是扫描版的) 下面是转的一个博文可以去除软件右上角图标的方法: 去掉cajviewer 7.1.2右上角的“中国知网数字出版物超市” 1 ...
- 如何将知网下载的caj文件转换为pdf文件
一.问题描述: 最近在知网搜索论文的时候,经常遇到有的论文没有pdf文件的情况,但不得不吐槽我觉得知网做的阅读器确实是有点烂.所以想将caj文件转化为pdf文件,找到了一个比较好的方法,所以希望记录一 ...
- 免费下载知网文献的方法 | sci-hub免费下载SCI论文方法
部分方法参考自在家里如何免费使用中国知网? - 大学生 - 知乎的回答,已注明出处. 知网文献下载:idata中国知网 idata中国知网网址:idata中国知网 https://www.cn-ki. ...
- 使用selenium模拟知网登录
之前都是用phantomjs和selenium模拟浏览器动作的,后来phantomjs不再更新,就转用chrome了 本次模拟登录的网站是中国知网http://login.cnki.net/login ...
- 知网下载pdf文件的方法
title: 知网下载pdf文件的方法 toc: false date: 2018-11-02 17:54:43 categories: methods tags: 知网 平时我们使用的是国内版的知网 ...
- Python开源爬虫项目代码:抓取淘宝、京东、QQ、知网数据--转
数据来源:数据挖掘入门与实战 公众号: datadw scrapy_jingdong[9]- 京东爬虫.基于scrapy的京东网站爬虫,保存格式为csv.[9]: https://github.co ...
随机推荐
- 记录--vue3 + mark.js | 实现文字标注功能
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 页面效果 具体实现 新增 1.监听鼠标抬起事件,通过window.getSelection()方法获取鼠标用户选择的文本范围或光标的当前位 ...
- Saltstack 最大打开文件数问题之奇怪的 8192
哈喽大家好,我是咸鱼. 今天分享一个在压测过程中遇到的问题,当时排查这个问题费了我们好大的劲,所以我觉得有必要写一篇文章来记录一下. 问题出现 周末在进行压测的时候,测试和开发的同事反映压测有问题,请 ...
- 不用写一行代码!Python最强自动化神器!
1.Playwright介绍 Playwright是一个由Microsoft开发的开源自动化测试工具,它可以用于测试Web应用程序.Playwright支持多种浏览器,包括Chrome.Firefox ...
- replace小数点后保留2位
小数点后保留2位 网上一堆小数点保留2位正则,但大部分都是直接copy,未解决0101和以.开头的这种情况 网上写法 obj.value = obj.value.replace(/[^\d.]/g,& ...
- Linux服务器部署Web版VSCode,在window下使用浏览器在linux环境下编写代码
最近尝试了一下在Linux服务器上部署VSCode,也就是code-server,然后在windows电脑上通过浏览器访问打开在线编辑器编写代码,以下记录一下部署过程. 1.在linux服务器上安装c ...
- 什么是HSV色彩空间
BGR色彩空间是基于三基色而言,即红色.绿色.蓝色.而HSV色彩空间则是基于色调.饱和度和亮度而言的. 色调(H)是指光的颜色,例如,彩虹中的赤,橙,黄,绿,青,蓝,紫分别表示不同的色调.在OpenC ...
- kingbase ES group by 语句优化
1.group by 分组语句 在SQL中group by主要用来进行分组统计,分组字段放在group by的后面:分组结果一般需要借助聚合函数实现. group by语法结构 1.常用语法 语法结构 ...
- 实现一个简单的echarts词云图PythonFlask
cloud.html 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta char ...
- [Android开发学iOS系列] 删除storyboard需要几步
删除iOS项目中的storyboard 删除项目中的storyboard, (变成一个纯代码的iOS UIKit项目), 需要几步? 找到storyboard, 删掉它. 直接用ViewControl ...
- 1 JavaScript的引入方式
1 JavaScript的引入方式 JavaScript, 是一门能够运行在浏览器上的脚本语言. 简称JS. 首先, Javascript这个名字的由来就很有意思, 不少人认为Javascript和J ...