本帖最后由 Sentiment1996 于 2021-3-15 09:40 编辑
本文均为非登录页面,模拟登陆页面获取cookie我选取的selenium
该文章代码内容只是截取部分,具体的还是得靠自己揣摩
情形一:静态页面(即发送请求加载静态页面,后端渲染成功的页面)
可直接通过Xpath进行页面内容的获取(特殊情况:页面整体是静态,但页码是动态拼接,可自行研究js或者点击页码查看地址栏链接拼接规律)
[Java] 纯文本查看 复制代码 @Component
public class Crawler implements PageProcessor {
/**
* 定时任务
*/
@Scheduled(cron = "* 15 12 * * ?")
private void startJob(){
Spider spider = Spider.create(new Crawler())
.addUrl("地址")
.thread(1);
spider.start();
}
/**
* 页面处理
*/
@Override
public void process(Page page) {
//判断页面能否访问
if(page.getUrl().match()){
String title= page.getHtml().xpath("//header[@class=\"picture-header\"]/h1/text()").toString();
System.out.println("标题"+title);
// 添加链接到新的请求
page.addTargetRequest(link);
}
}
/**
* 请求配置:编码、间隔、重试次数等
*/
private Site site = Site.me().setSleepTime(2000).setCharset("utf-8")// 设置编码,适应页面,按照实际页面编码而定
.setTimeOut(10000)// 设置超时时间10秒
.setRetrySleepTime(3000)// 设置重试时间3秒
.setRetryTimes(3)// 设置重试次数3次
.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36");//模拟浏览器访问
@Override
public Site getSite() {
return site;
}
}
情形二:动态页面(即发送请求前端渲染的页面)
通过浏览器F12调试(新版edge浏览器举例),抓取js请求
流程:F12——>网络——>选中js——>size(从大到小排列),从中即可找到
1)直接用拼接的js直接请求
[Java] 纯文本查看 复制代码
@Component
public class Crawler implements PageProcessor {
/**
* 定时任务
*/
@Scheduled(cron = "* 15 12 * * ?")
private void startJob(){
String url="http://地址";
Spider spider = Spider.create(new Crawler())
.addUrl(url)
.thread(1);
spider.start();
}
/**
* 页面处理
*/
@Override
public void process(Page page) {
String pages=page.getHtml().toString();
String dataJs = pages.substring(pages.indexOf("{"), pages.lastIndexOf("}") + 1);
// JS请求的结果数据转换为json对象
JSONObject dataJson=(JSONObject) JSONObject.parse(dataJs);
System.out.println(dataJson);
// 后续省略。。。。
}
/**
* 请求配置:编码、间隔、重试次数等
*/
private Site site = Site.me()
.setCharset("utf-8")//设置编码,适应页面
.setTimeOut(10000)//设置超时时间10秒
.setRetrySleepTime(3000)//设置重试时间3秒
.setRetryTimes(3)//设置重试次数3次
.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52");
@Override
public Site getSite() {
return site;
}
}
2)不能直接用拼接的js直接请求,还得加请求头"Referer"验证
[Java] 纯文本查看 复制代码
@Component
public class Crawler implements PageProcessor {
/**
* 定时任务
*/
@Scheduled(cron = "* 15 12 * * ?")
private void startJob(){
String url="http://地址“;
Spider spider = Spider.create(new Crawler())
.addUrl(url)
.thread(1);
spider.start();
}
/**
* 页面处理
*/
@Override
public void process(Page page) {
String pages=page.getHtml().toString();
String dataJs = pages.substring(pages.indexOf("{"), pages.lastIndexOf("}") + 1);
// JS请求的结果数据转换为json对象
JSONObject dataJson=(JSONObject) JSONObject.parse(dataJs);
System.out.println(dataJson);
// 后续省略。。。。
}
/**
* 请求配置:编码、间隔、重试次数等
*/
private Site site = Site.me()
.addHeader("Referer", "http://********.cn/")
.setCharset("utf-8")//设置编码,适应页面
.setTimeOut(10000)//设置超时时间10秒
.setRetrySleepTime(3000)//设置重试时间3秒
.setRetryTimes(3)//设置重试次数3次
.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52");
@Override
public Site getSite() {
return site;
}
}
|