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 ...
随机推荐
- 记录--基于Vue2.0实现后台系统权限控制
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 基于Vue.js 2.x系列 + Element UI 的后台系统权限控制 前言:关于vue权限路由的那些事儿-- 项目背景:现有一个后台 ...
- 一行代码 python 证件照换底色
安装所需模块 pip install OpenCV-python pip install cvzone pip install mediapipe 代码 import cv2 import cvzon ...
- #并查集#JZOJ 4223 旅游
题目 多次询问有多少个无序点对\((x,y)\), 满足至少有一条最大边权\(\leq d\)的路径 分析 离线询问,用并查集加边,每次产生的贡献为\(2*siz[x]*siz[y]\) 代码 #in ...
- #K-D Tree#洛谷 4357 [CQOI2016]K 远点对
题目 已知平面内 \(n\) 个点的坐标,求欧氏距离下的第 \(k\) 远点对. 分析 先将\(k\)乘2转换为第\(k\)远有序点对. 由于\(O(n^2)\)即枚举一个点再枚举另一个点会超出时限, ...
- #线性基,点分治#洛谷 3292 [SCOI2016]幸运数字
题目 分析 题目就是将\(x\)到\(y\)路径上的线性基合并求解, 这里用的是点分治,每次换根到重心的时候维护前缀线性基, 查询的时候如果属于不同的子树就能询问答案,记得\(x=y\)要特判 代码 ...
- OpenHarmony自定义组件介绍
一.创建自定义组件 在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件.在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑 ...
- C 语言结构体和枚举完全指南:成员访问、字符串操作、枚举基础
访问结构体成员 要访问结构体的成员,请使用点语法 (.): // 创建名为 myStructure 的结构体 struct MyStructure { int myNum; char myLetter ...
- 天气数据爬取+pyechart可视化
数据爬取/处理 爬取深圳2021年全年的天气历史数据. 网址链接:https://lishi.tianqi.com/shenzhen/ 代码: import requests from lxml im ...
- C# 方法参数中的this参数
引用:C# 方法中的this参数 - zh89233 - 博客园 (cnblogs.com) public static class StringExtension { public static v ...
- openGauss数据库源码学习-指标采集、预测与异常检测
opengauss 源码解析 指标采集.预测与异常检测 代码位置:/gausskernel/dbmind/tools/anomaly_detection 各模组在整体结构上的组合在摩天轮论坛上官方解析 ...