gitextract_m56n222u/ ├── .gitignore ├── .travis.yml ├── LICENSE ├── README-zh.md ├── README.md ├── pom.xml ├── src/ │ └── site/ │ └── site.xml ├── webmagic-core/ │ ├── README.md │ ├── module_webmagic-core.xml │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── us/ │ │ └── codecraft/ │ │ └── webmagic/ │ │ ├── Page.java │ │ ├── Request.java │ │ ├── ResultItems.java │ │ ├── Site.java │ │ ├── Spider.java │ │ ├── SpiderListener.java │ │ ├── SpiderScheduler.java │ │ ├── Task.java │ │ ├── downloader/ │ │ │ ├── AbstractDownloader.java │ │ │ ├── CustomRedirectStrategy.java │ │ │ ├── Downloader.java │ │ │ ├── HttpClientDownloader.java │ │ │ ├── HttpClientGenerator.java │ │ │ ├── HttpClientRequestContext.java │ │ │ ├── HttpUriRequestConverter.java │ │ │ └── package.html │ │ ├── model/ │ │ │ └── HttpRequestBody.java │ │ ├── package.html │ │ ├── pipeline/ │ │ │ ├── CollectorPipeline.java │ │ │ ├── ConsolePipeline.java │ │ │ ├── FilePipeline.java │ │ │ ├── Pipeline.java │ │ │ ├── ResultItemsCollectorPipeline.java │ │ │ └── package.html │ │ ├── processor/ │ │ │ ├── PageProcessor.java │ │ │ ├── SimplePageProcessor.java │ │ │ ├── example/ │ │ │ │ ├── BaiduBaikePageProcessor.java │ │ │ │ ├── GithubRepoPageProcessor.java │ │ │ │ └── ZhihuPageProcessor.java │ │ │ └── package.html │ │ ├── proxy/ │ │ │ ├── Proxy.java │ │ │ ├── ProxyProvider.java │ │ │ └── SimpleProxyProvider.java │ │ ├── scheduler/ │ │ │ ├── DuplicateRemovedScheduler.java │ │ │ ├── MonitorableScheduler.java │ │ │ ├── PriorityScheduler.java │ │ │ ├── QueueScheduler.java │ │ │ ├── Scheduler.java │ │ │ ├── component/ │ │ │ │ ├── DuplicateRemover.java │ │ │ │ ├── HashSetDuplicateRemover.java │ │ │ │ └── package.html │ │ │ └── package.html │ │ ├── selector/ │ │ │ ├── AbstractSelectable.java │ │ │ ├── AndSelector.java │ │ │ ├── BaseElementSelector.java │ │ │ ├── CssSelector.java │ │ │ ├── ElementSelector.java │ │ │ ├── Html.java │ │ │ ├── HtmlNode.java │ │ │ ├── Json.java │ │ │ ├── JsonPathSelector.java │ │ │ ├── LinksSelector.java │ │ │ ├── OrSelector.java │ │ │ ├── PlainText.java │ │ │ ├── RegexResult.java │ │ │ ├── RegexSelector.java │ │ │ ├── ReplaceSelector.java │ │ │ ├── Selectable.java │ │ │ ├── Selector.java │ │ │ ├── Selectors.java │ │ │ ├── SmartContentSelector.java │ │ │ ├── XpathSelector.java │ │ │ └── package.html │ │ ├── thread/ │ │ │ └── CountableThreadPool.java │ │ └── utils/ │ │ ├── BaseSelectorUtils.java │ │ ├── CharsetUtils.java │ │ ├── Experimental.java │ │ ├── FilePersistentBase.java │ │ ├── HttpClientUtils.java │ │ ├── HttpConstant.java │ │ ├── NumberUtils.java │ │ ├── ProxyUtils.java │ │ ├── UrlUtils.java │ │ ├── WMCollections.java │ │ └── package.html │ └── test/ │ ├── java/ │ │ └── us/ │ │ └── codecraft/ │ │ └── webmagic/ │ │ ├── HtmlTest.java │ │ ├── RequestTest.java │ │ ├── ResultItemsTest.java │ │ ├── SiteTest.java │ │ ├── SpiderTest.java │ │ ├── downloader/ │ │ │ ├── HttpClientDownloaderTest.java │ │ │ ├── HttpUriRequestConverterTest.java │ │ │ ├── MockGithubDownloader.java │ │ │ └── SSLCompatibilityTest.java │ │ ├── example/ │ │ │ └── GithubRepoPageProcessorTest.java │ │ ├── pipeline/ │ │ │ └── FilePipelineTest.java │ │ ├── processor/ │ │ │ └── PageProcessorTest.java │ │ ├── proxy/ │ │ │ ├── ProxyTest.java │ │ │ └── SimpleProxyProviderTest.java │ │ ├── scheduler/ │ │ │ ├── DuplicateRemovedSchedulerTest.java │ │ │ └── PrioritySchedulerTest.java │ │ ├── selector/ │ │ │ ├── AndSelectorTest.java │ │ │ ├── CssSelectorTest.java │ │ │ ├── ExtractorsTest.java │ │ │ ├── JsonPathSelectorTest.java │ │ │ ├── JsonTest.java │ │ │ ├── LinksSelectorTest.java │ │ │ ├── OrSelectorTest.java │ │ │ ├── RegexSelectorTest.java │ │ │ └── SelectorTest.java │ │ └── utils/ │ │ ├── CharsetUtilsTest.java │ │ ├── NumberUtilsTest.java │ │ └── UrlUtilsTest.java │ └── resources/ │ ├── html/ │ │ └── mock-github.html │ └── log4j2-test.xml ├── webmagic-coverage/ │ └── pom.xml ├── webmagic-extension/ │ ├── README.md │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── us/ │ │ │ └── codecraft/ │ │ │ └── webmagic/ │ │ │ ├── MultiPageModel.java │ │ │ ├── SimpleHttpClient.java │ │ │ ├── configurable/ │ │ │ │ ├── ConfigurablePageProcessor.java │ │ │ │ ├── ExpressionType.java │ │ │ │ └── ExtractRule.java │ │ │ ├── downloader/ │ │ │ │ └── PhantomJSDownloader.java │ │ │ ├── example/ │ │ │ │ ├── AppStore.java │ │ │ │ ├── BaiduBaike.java │ │ │ │ ├── GithubRepo.java │ │ │ │ ├── GithubRepoApi.java │ │ │ │ ├── GithubRepoPageMapper.java │ │ │ │ ├── MonitorExample.java │ │ │ │ ├── OschinaBlog.java │ │ │ │ └── PatternProcessorExample.java │ │ │ ├── handler/ │ │ │ │ ├── CompositePageProcessor.java │ │ │ │ ├── CompositePipeline.java │ │ │ │ ├── PatternProcessor.java │ │ │ │ ├── PatternRequestMatcher.java │ │ │ │ ├── RequestMatcher.java │ │ │ │ ├── SubPageProcessor.java │ │ │ │ └── SubPipeline.java │ │ │ ├── model/ │ │ │ │ ├── AfterExtractor.java │ │ │ │ ├── ConsolePageModelPipeline.java │ │ │ │ ├── Extractor.java │ │ │ │ ├── FieldExtractor.java │ │ │ │ ├── HasKey.java │ │ │ │ ├── ModelPageProcessor.java │ │ │ │ ├── ModelPipeline.java │ │ │ │ ├── OOSpider.java │ │ │ │ ├── PageMapper.java │ │ │ │ ├── PageModelCollectorPipeline.java │ │ │ │ ├── PageModelExtractor.java │ │ │ │ ├── annotation/ │ │ │ │ │ ├── ComboExtract.java │ │ │ │ │ ├── ExtractBy.java │ │ │ │ │ ├── ExtractByUrl.java │ │ │ │ │ ├── Formatter.java │ │ │ │ │ ├── HelpUrl.java │ │ │ │ │ ├── TargetUrl.java │ │ │ │ │ └── package.html │ │ │ │ ├── fields/ │ │ │ │ │ ├── MultipleField.java │ │ │ │ │ ├── PageField.java │ │ │ │ │ └── SingleField.java │ │ │ │ ├── formatter/ │ │ │ │ │ ├── BasicClassDetector.java │ │ │ │ │ ├── BasicTypeFormatter.java │ │ │ │ │ ├── DateFormatter.java │ │ │ │ │ ├── ObjectFormatter.java │ │ │ │ │ ├── ObjectFormatterBuilder.java │ │ │ │ │ └── ObjectFormatters.java │ │ │ │ ├── package.html │ │ │ │ └── sources/ │ │ │ │ ├── Source.java │ │ │ │ └── SourceTextExtractor.java │ │ │ ├── monitor/ │ │ │ │ ├── SpiderMonitor.java │ │ │ │ ├── SpiderStatus.java │ │ │ │ └── SpiderStatusMXBean.java │ │ │ ├── pipeline/ │ │ │ │ ├── CollectorPageModelPipeline.java │ │ │ │ ├── FilePageModelPipeline.java │ │ │ │ ├── JsonFilePageModelPipeline.java │ │ │ │ ├── JsonFilePipeline.java │ │ │ │ ├── MultiPagePipeline.java │ │ │ │ └── PageModelPipeline.java │ │ │ ├── scheduler/ │ │ │ │ ├── BloomFilterDuplicateRemover.java │ │ │ │ ├── FileCacheQueueScheduler.java │ │ │ │ ├── RedisPriorityScheduler.java │ │ │ │ └── RedisScheduler.java │ │ │ └── utils/ │ │ │ ├── ClassUtils.java │ │ │ ├── DoubleKeyMap.java │ │ │ ├── ExtractorUtils.java │ │ │ ├── IPUtils.java │ │ │ ├── MultiKeyMapBase.java │ │ │ └── RequestUtils.java │ │ └── resources/ │ │ ├── crawl.js │ │ └── spider-config-draft.xml │ └── test/ │ ├── java/ │ │ └── us/ │ │ └── codecraft/ │ │ └── webmagic/ │ │ ├── MockPageModelPipeline.java │ │ ├── MockPipeline.java │ │ ├── SimpleHttpClientTest.java │ │ ├── configurable/ │ │ │ └── ConfigurablePageProcessorTest.java │ │ ├── downloader/ │ │ │ └── MockGithubDownloader.java │ │ ├── formatter/ │ │ │ └── DateFormatterTest.java │ │ ├── model/ │ │ │ ├── BaseRepo.java │ │ │ ├── GithubRepo.java │ │ │ ├── GithubRepoApi.java │ │ │ ├── GithubRepoTest.java │ │ │ ├── ModelPageProcessorTest.java │ │ │ ├── PageMapperTest.java │ │ │ ├── PageMocker.java │ │ │ └── PageModelExtractorTest.java │ │ ├── monitor/ │ │ │ ├── CustomSpiderStatus.java │ │ │ ├── CustomSpiderStatusMXBean.java │ │ │ ├── SeedUrlWithPortTest.java │ │ │ └── SpiderMonitorTest.java │ │ ├── processor/ │ │ │ └── GithubRepoProcessor.java │ │ ├── scheduler/ │ │ │ ├── BloomFilterDuplicateRemoverTest.java │ │ │ ├── RedisPrioritySchedulerTest.java │ │ │ └── RedisSchedulerTest.java │ │ └── utils/ │ │ ├── IPUtilsTest.java │ │ └── RequestUtilsTest.java │ └── resources/ │ ├── html/ │ │ ├── mock-github.html │ │ └── mock-webmagic.html │ ├── json/ │ │ └── mock-githubrepo.json │ └── log4j2-test.xml ├── webmagic-samples/ │ ├── README.md │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── us/ │ │ │ └── codecraft/ │ │ │ └── webmagic/ │ │ │ ├── main/ │ │ │ │ └── QuickStarter.java │ │ │ ├── model/ │ │ │ │ └── samples/ │ │ │ │ ├── BaiduNews.java │ │ │ │ ├── Blog.java │ │ │ │ ├── DianpingFtlDataScanner.java │ │ │ │ ├── GithubRepo.java │ │ │ │ ├── IteyeBlog.java │ │ │ │ ├── JokejiModel.java │ │ │ │ ├── Kr36NewsModel.java │ │ │ │ ├── News163.java │ │ │ │ ├── OschinaAnswer.java │ │ │ │ ├── OschinaBlog.java │ │ │ │ └── QQMeishi.java │ │ │ ├── recover/ │ │ │ │ ├── DuplicateStorageRemover.java │ │ │ │ ├── MmapQueueScheduler.java │ │ │ │ └── RecoverSample.java │ │ │ └── samples/ │ │ │ ├── AlexanderMcqueenGoodsProcessor.java │ │ │ ├── AmanzonPageProcessor.java │ │ │ ├── AngularJSProcessor.java │ │ │ ├── DiandianBlogProcessor.java │ │ │ ├── DiaoyuwengProcessor.java │ │ │ ├── F58PageProcesser.java │ │ │ ├── GithubRepo.java │ │ │ ├── GithubRepoPageProcessor.java │ │ │ ├── HuxiuProcessor.java │ │ │ ├── InfoQMiniBookProcessor.java │ │ │ ├── IteyeBlogProcessor.java │ │ │ ├── KaichibaProcessor.java │ │ │ ├── MamacnPageProcessor.java │ │ │ ├── MeicanProcessor.java │ │ │ ├── NjuBBSProcessor.java │ │ │ ├── PhantomJSPageProcessor.java │ │ │ ├── QzoneBlogProcessor.java │ │ │ ├── SinaBlogProcessor.java │ │ │ ├── TianyaPageProcesser.java │ │ │ ├── ZhihuPageProcessor.java │ │ │ ├── formatter/ │ │ │ │ └── StringTemplateFormatter.java │ │ │ ├── pipeline/ │ │ │ │ ├── OneFilePipeline.java │ │ │ │ └── ReplacePipeline.java │ │ │ └── scheduler/ │ │ │ ├── DelayQueueScheduler.java │ │ │ ├── LevelLimitScheduler.java │ │ │ └── ZipCodePageProcessor.java │ │ └── resources/ │ │ ├── crawl.js │ │ └── log4j2.xml │ └── test/ │ └── java/ │ └── us/ │ └── codecraft/ │ └── webmagic/ │ ├── SpiderTest.java │ ├── model/ │ │ └── ProcessorBenchmark.java │ ├── processor/ │ │ └── SinablogProcessorTest.java │ └── samples/ │ └── scheduler/ │ └── DelayQueueSchedulerTest.java ├── webmagic-saxon/ │ ├── README.md │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── us/ │ │ └── codecraft/ │ │ └── webmagic/ │ │ └── selector/ │ │ ├── JaxpSelectorUtils.java │ │ ├── NodeSelector.java │ │ └── Xpath2Selector.java │ └── test/ │ └── java/ │ └── us/ │ └── codecraft/ │ └── webmagic/ │ └── selector/ │ └── XpathSelectorTest.java ├── webmagic-scripts/ │ ├── README.md │ ├── deploy.sh │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── groovy/ │ │ │ └── Github.groovy │ │ ├── java/ │ │ │ └── us/ │ │ │ └── codecraft/ │ │ │ └── webmagic/ │ │ │ └── scripts/ │ │ │ ├── Params.java │ │ │ ├── ScriptConsole.java │ │ │ ├── ScriptEnginePool.java │ │ │ ├── ScriptProcessor.java │ │ │ ├── ScriptProcessorBuilder.java │ │ │ ├── config/ │ │ │ │ ├── CommandLineOption.java │ │ │ │ └── ConfigLogger.java │ │ │ └── languages/ │ │ │ ├── JRuby.java │ │ │ ├── Javascript.java │ │ │ ├── Jython.java │ │ │ └── Language.java │ │ ├── kotlin/ │ │ │ └── Github.kt │ │ └── resources/ │ │ ├── js/ │ │ │ ├── defines.js │ │ │ ├── github.js │ │ │ └── oschina.js │ │ ├── python/ │ │ │ ├── defines.py │ │ │ └── oschina.py │ │ └── ruby/ │ │ ├── defines.rb │ │ ├── github.rb │ │ └── oschina.rb │ └── test/ │ ├── java/ │ │ └── us/ │ │ └── codecraft/ │ │ └── webmagic/ │ │ └── scripts/ │ │ └── ScriptProcessorTest.java │ └── resources/ │ └── log4j2-test.xml └── webmagic-selenium/ ├── README.md ├── config.ini ├── pom.xml └── src/ ├── main/ │ └── java/ │ └── us/ │ └── codecraft/ │ └── webmagic/ │ └── downloader/ │ └── selenium/ │ ├── SeleniumDownloader.java │ └── WebDriverPool.java └── test/ ├── java/ │ └── us/ │ └── codecraft/ │ └── webmagic/ │ ├── downloader/ │ │ ├── SeleniumTest.java │ │ └── selenium/ │ │ ├── SeleniumDownloaderTest.java │ │ └── WebDriverPoolTest.java │ └── samples/ │ ├── GooglePlayProcessor.java │ └── HuabanProcessor.java └── resources/ └── config.ini