使用selenium工具爬取知网相关数据,思路:根据几个关键词搜索出相关的内容,然后爬取列表中所有论文的访问链接。
注意:直接爬取的链接是不能用的,需要自己拼接一下。具体看代码。新手,代码写的有点乱。勿喷。里面穿插了一些简单的对于关键词的分析。不喜勿喷,谢谢。
直接上代码
package com.test.demo.controller;
import org.apache.xmlbeans.impl.xb.xsdschema.All;
import org.checkerframework.checker.nullness.compatqual.NullableDecl;
import org.json.JSONObject;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.*;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* 这个整体的过程是 1:爬取所有的论文详情连接 存进文本中
* 2:根据文本中的详情链接,分别开始采相应的数据
* 3:采到的相应的数据在做分析,将结果写进KeyWord.json文件中
*/
@Controller
@RequestMapping("/CNKISpidr")
public class CNKISpiderController {
/**
* 抓取所有的详情列表
* @throws Exception
*/
@RequestMapping(value = "/spider", method = RequestMethod.POST)
@ResponseBody
public Integer spiderCNKI(String themeKey,String Key,String abstractKey,String pageNum) throws Exception{
String themeStr = themeKey;
String keyStr = Key;
String abstractKeyStr = abstractKey;
// 创建一个list存放所有的详情的拼接成功的链接
List reUrlList = new ArrayList<>();
// 存放出版年月的list
List yearList = new ArrayList<>();
/* // 设置驱动的位置
System.setProperty("webdriver.chrome.driver",
"D:\\Google\\Chrome\\Application\\chromedriver.exe");*/
//WebDriver driver;
// driver=new ChromeDriver();
//调整高度
// ((ChromeDriver) driver).executeScript("window.scrollTo(0, document.body.scrollHeight);");
// 爬取详情链接
// List yearListRe = new ArrayList<>();
initqueryAndGetData(themeStr,keyStr,abstractKeyStr); //
// Thread.sleep(10000);
// 根据详情链接爬取内容
spiderByUrl();
// 分析内容,然后将结果写进json文件中
// Thread.sleep(10000);
writeJson();
return 1;
}
// 将结果写进json文件中
private void writeJson() throws Exception{
// 创建存放数据的文本文件,以及读写数据的buffer
File path1 = new File(ResourceUtils.getURL("classpath:").getPath());
if (!path1.exists()) path1 = new File("");
// System.out.println("path:"+path1.getAbsolutePath());
File upload = new File(path1.getAbsolutePath(), "src/main/webapp/data");
if (!upload.exists()) upload.mkdirs();
// 1:创建一个文本文件,用来存放爬取的数据
String path = upload.getAbsolutePath() + "\\keyWord.json";
File file = new File(path);
if (!file.exists()) {
file.getParentFile().mkdirs();
}
file.createNewFile();
// 写所有信息的 true是追加,false是覆盖
FileWriter fileWriter = new FileWriter(file, false);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
//*********读取关键词的文本文件**********************************************************************************
File path2 = new File(ResourceUtils.getURL("classpath:").getPath());
if (!path2.exists()) path2 = new File("");
// System.out.println("path:"+path1.getAbsolutePath());
File upload2 = new File(path2.getAbsolutePath(), "src/main/webapp/data");
if (!upload2.exists()) upload2.mkdirs();
String pathKey = upload2.getAbsolutePath() + "\\text.txt"; // 因为是要分别获取每一篇的关键词,所以直接分析这个文本
// 路径文件
File filekey = new File(pathKey);
BufferedReader in = new BufferedReader(new FileReader(filekey));
String line = null;
//定义一个空字符串来接受读到的字符串
String str = "";
// 这个字符数组的长度不能写死
//String array[] = new String[1605];
List array = new ArrayList<>();
//int i = 0;
//循环把读取到的字符赋给str
while ((line = in.readLine()) != null) {
if (line.contains("关键词")) {
str = line.substring(line.indexOf(":") + 1);
//array[i] = str;
array.add(str);
//i++;
}
}
System.out.println("array:"+array.size());
// 这个是存放所有关键字节点的 nodes
List