本篇文章就不介绍webmagic了。
普通的静态页面获取这里也不说了,相信大家都没问题。
这里主要记录两种动态页面获取方法
1.数据存在页面js代码中
直接上代码
@Component
public class JobProcessor implements PageProcessor {
private String url = "https://search.51job.com/list/000000,000000,0000,00,9,99,java,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=";
@Override
public void process(Page page) {
//先获取script标签,为了拿到我们想要的那个script标签,使用正则表达式筛选(看script中包含什么独有的内容)
String jobinfo = page.getHtml().css("script").regex(".*SEARCH_RESULT.*").get();
// 解析拿到json字符串
jobinfo = jobinfo.substring(jobinfo.indexOf("{"), jobinfo.lastIndexOf("}") + 1);
// 创建json对象
JSONObject jsonObject = (JSONObject) JSONObject.parse(jobinfo);
// 根据分析拿到放置信息的数组,这里根据你获取的json字符串格式来判断是转化为数组还是直接操作字符串
JSONArray resArr = jsonObject.getJSONArray("engine_search_result");
}
private Site site = Site.me()
.setCharset("utf-8")
.setTimeOut(10 * 1000)
.setRetryTimes(3)
.setRetrySleepTime(3000);
@Override
public Site getSite() {
return site;
}
//initialDelay任务启动后多久执行方法
//fixedDelay每隔多久执行方法
@Scheduled(initialDelay = 1000, fixedDelay = 100 * 1000)
public void process() {
Spider.create(new JobProcessor())
.addUrl(url)
.thread(10)
.run();
}
}
2.从Ajax接口获取数据,也是重点记录的一种情况
首先查看网页源代码发现没有我们想要的内容
f12打开控制台,选择network选项卡,选择XHR刷新页面,获取Ajax请求信息,找到返回数据是我们需要的Ajax接口,如果无法直接访问,即直接复制Ajax请求路径到浏览器打开无法获取数据,则需要该分析Ajax的请求头
这里简单分析一个链接
https://aiqicha.baidu.com/yuqing/latestLyricalAjax?p=1&type=list&_=1629375871000
很明显的看到前面都是固定的,p=1&type=list是分页,1629375871000明显是时间戳。url分析完,我们就知道抓取页面时怎么拼接url了。其他的一些请求头设置如下,有的Ajax接口有访问限制,需要设置请求头。
@Component
public class JobProcessor implements PageProcessor {
private String url = "https://aiqicha.baidu.com/yuqing/latestLyricalAjax?p=1&type=list&_="+System.currentTimeMillis()/1000+"000";
@Override
public void process(Page page) {
//这里就可以获取所需数据了,具体页面解析这里就不说了
System.out.println(page.getHtml());
//这里使用webmagic-extension中自带的JsonPathSelector来获取
List<String> list = new JsonPathSelector("$.data[*]").selectList(page.getRawText());
}
//这里的Ajax接口有访问限制,所以需要设置请求头,请求头的设置根据分析的请求头来
private Site site = Site.me()
.setCharset("gbk")
.setTimeOut(10 * 1000)
.setRetryTimes(3)
.addHeader("Accept-Encoding", "/")
.addHeader("X-Requested-With","XMLHttpRequest")
.addHeader("Referer","https://aiqicha.baidu.com/yuqing/latestlyricallist")
.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36")
.setRetrySleepTime(3000);
@Override
public Site getSite() {
return site;
}
//initialDelay任务启动后多久执行方法
//fixedDelay每隔多久执行方法
@Scheduled(initialDelay = 1000, fixedDelay = 100 * 1000)
public void process() {
Spider.create(new JobProcessor())
.addUrl(url)
.setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(10000)))
.thread(10)
.run();
}
}