吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1890|回复: 0
收起左侧

[Java 转载] Java-webmagic爬虫

[复制链接]
Sentiment1996 发表于 2021-2-9 11:06
本帖最后由 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;
        }
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
461735945 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 19:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表