Sentiment1996 发表于 2021-2-9 11:06

Java-webmagic爬虫

本帖最后由 Sentiment1996 于 2021-3-15 09:40 编辑

本文均为非登录页面,模拟登陆页面获取cookie我选取的selenium

该文章代码内容只是截取部分,具体的还是得靠自己揣摩

情形一:静态页面(即发送请求加载静态页面,后端渲染成功的页面)
可直接通过Xpath进行页面内容的获取(特殊情况:页面整体是静态,但页码是动态拼接,可自行研究js或者点击页码查看地址栏链接拼接规律)
@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直接请求

@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"验证

@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]
查看完整版本: Java-webmagic爬虫