VSCrawler 爬取美女图片

7 篇文章 0 订阅
4 篇文章 0 订阅

主函数CrawlDemo.java

import com.google.common.io.Files;
import com.virjar.sipsoup.parse.XpathParser;
import com.virjar.vscrawler.core.VSCrawler;
import com.virjar.vscrawler.core.VSCrawlerBuilder;
import com.virjar.vscrawler.core.event.support.AutoEvent;
import com.virjar.vscrawler.core.event.support.AutoEventRegistry;
import com.virjar.vscrawler.core.event.systemevent.SeedEmptyEvent;
import com.virjar.vscrawler.core.net.session.CrawlerSession;
import com.virjar.vscrawler.core.processor.CrawlResult;
import com.virjar.vscrawler.core.processor.SeedProcessor;
import com.virjar.vscrawler.core.seed.Seed;
import com.virjar.vscrawler.core.util.PathResolver;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import java.io.File;
import java.io.IOException;



public class CrawlDemo {
    public static void main(String[] args) throws IOException {

        VSCrawler vsCrawler = VSCrawlerBuilder.create().addPipeline(new EmptyPipeline())
                .setProcessor(new SeedProcessor() {

                    private void handlePic(Seed seed, CrawlerSession crawlerSession) {
                        byte[] entity = crawlerSession.getCrawlerHttpClient().getEntity(seed.getData());
                        if (entity == null) {
                            seed.retry();
                            return;
                        }
                        try {
                            Files.write(entity, // 文件根据网站,路径,base自动计算
                                    new File(PathResolver.onlySource("E:/testpic", seed.getData())));
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    }


                    public void process(Seed seed, CrawlerSession crawlerSession, CrawlResult crawlResult) {
                        if (StringUtils.endsWithIgnoreCase(seed.getData(), ".jpg")) {
                            handlePic(seed, crawlerSession);
                        } else {
                            String s = crawlerSession.getCrawlerHttpClient().get(seed.getData());
                            if (s == null) {
                                seed.retry();
                                return;
                            }
                            // 将下一页的链接和图片链接抽取出来
                            crawlResult.addStrSeeds(XpathParser
                                    .compileNoError(
                                            "/css('#pages a')::self()[contains(text(),'下一页')]/absUrl('href') | /css('.content')::center/img/@src")
                                    .evaluateToString(Jsoup.parse(s, seed.getData())));
                        }
                    }

                }).build();

        // 清空历史爬去数据,或者会断点续爬
        vsCrawler.clearTask();

        vsCrawler.pushSeed("https://www.meitulu.com/item/2125.html");
        vsCrawler.pushSeed("https://www.meitulu.com/item/6892.html");
        vsCrawler.pushSeed("https://www.meitulu.com/item/2124.html");
        vsCrawler.pushSeed("https://www.meitulu.com/item/2120.html");
        vsCrawler.pushSeed("https://www.meitulu.com/item/2086.html");
        vsCrawler.pushSeed("https://www.meitulu.com/item/2066.html");

        vsCrawler.addCrawlerStartCallBack(new VSCrawler.CrawlerStartCallBack() {

            public void onCrawlerStart(final VSCrawler vsCrawler) {
                AutoEventRegistry.getInstance().registerEvent(ShutDownChecker.class);
                AutoEventRegistry.getInstance().registerObserver(new ShutDownChecker() {


                    public void checkShutDown() {
                        // 15s之后检查活跃线程数,发现为0,证明连续10s都没用任务执行了
                        if (vsCrawler.activeWorker() == 0
                                && (System.currentTimeMillis() - vsCrawler.getLastActiveTime()) > 10000) {
                            System.out.println("尝试停止爬虫");
                            vsCrawler.stopCrawler();
                        }
                    }
                });
                AutoEventRegistry.getInstance().registerObserver(new SeedEmptyEvent() {

                    public void onSeedEmpty() {// 如果收到任务为空消息的话,尝试停止爬虫
                        // 发送延时消息,当前收到了任务为空的消息,产生一个发生在15s之后发生的事件,
                        AutoEventRegistry.getInstance().createDelayEventSender(ShutDownChecker.class, 15000).delegate()
                                .checkShutDown();
                    }
                });
            }
        });

        // 开始爬虫
        vsCrawler.start();
    }

    interface ShutDownChecker {
        @AutoEvent
        void checkShutDown();
    }
}

EmptyPipeline.java 实现Pipeline接口

import java.util.Collection;

import com.virjar.vscrawler.core.seed.Seed;
import com.virjar.vscrawler.core.serialize.Pipeline;


public class EmptyPipeline implements Pipeline {

    public void saveItem(Collection<String> itemJson, Seed seed) {
        System.out.println(seed.getData() + " 处理完成");
    }
}

图片列表

实测在https://www.meitulu.com网站中不到半分钟能畅通无阻爬取近600张妹纸图,效率不错!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后台路径:/admcn 创始人账户密码都是admcn(后台即可修改账户密码,请第一时间修改) 操作运营: 第一天: 1:先登录后台 在基本设置里设置好域名信息(其它基本不用管/如需修改站名、关键词、描述等信息请直接用记事本或其它工具打开程序根目录的index.html文件修改保存即可); 在广告管理中添加您的广告信息(流量未过千不建议添加弹窗/其它广告任意) 2:打开名为“网址”的txt文档,按顺序一个个地到人家的站去申请流量交换,每申请一个就回到你后台点击“交换网站添加” 首次加站不要超过30个网站,因为过多流量分配不过来,保持在30个左右,加站最好在网络高峰期的时候才加。OK后每间隔6-8小时就到后台看看人家的返量情况,要是没有流量给你的就“下架”(放入未审核区/别直接删除),然后继续加新站,保持网站个数30个左右即可。 第二天: 1:通常今天就可以上弹窗了,因为正常的话只需要24小时左右IP就能过千,弹窗数量表太多,也得站在用户的角度思考下,点一次是弹窗、再点一次还是弹窗,你想用户还会继续点吗!用户不点就没法与其它站交换流量,你没量给人家,人家当然也不会给你,最终你的量也会越来越少。 2:IP过千后,你要做的就是“取优去劣”,即陆续的替换反量比例少的交换站。例如流量出路>来路很多的就按倒序一一替换掉(还是放入未审核区/表直接删)。 第三天and以后: 第三天的工作和第二天一样,以后也是如此。不断替换反量少的交换站,尽量做到只保留流量进出比例在1:1以上的交换站,如果30个交换站流量进出比例高于1:1,那么离日IP过万就很近了。 聪明人看到这应该差不多完全明白了。若还不明白再问我 ps:崭新的站,没有一丁点流量的站开始做的时候注意下交换站有无“去量要求”,因为部分交换站会要求先给他们送去10-20个IP,他们才会给你审核、反量。所以新站前期尽量与那些无要求或要求低的交换站做,等流量上去了再与有要求的做即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值