其他框架和语言

爬虫任务本质上是由一个shell命令来实现的。任务ID将以环境变量CRAWLAB_TASK_ID的形式存在于爬虫任务运行的进程中,并以此来关联抓取数据。另外,CRAWLAB_COLLECTION是Crawlab传过来的所存放collection的名称。

在爬虫程序中,需要将CRAWLAB_TASK_ID的值以task_id作为可以存入数据库中CRAWLAB_COLLECTION的collection中。这样Crawlab就知道如何将爬虫任务与抓取数据关联起来了。当前,Crawlab只支持MongoDB。

Java

我们暂时还没有发布 Java 的 SDK,不过 Java 开发者可以参考下面的代码来实现集成。

  1. public class CrawlabUtil {
  2. private MongoClient mongoClient;
  3. public String getTaskId() {
  4. return System.getenv("CRAWLAB_TASK_ID");
  5. }
  6. public String getCollectionName() {
  7. return System.getenv("CRAWLAB_COLLECTION");
  8. }
  9. public MongoClient getMongoClient() {
  10. String mongoHost = System.getenv("CRAWLAB_MONGO_HOST");
  11. String mongoPort = System.getenv("CRAWLAB_MONGO_PORT");
  12. String mongoDatabase = System.getenv("CRAWLAB_MONGO_DB");
  13. String mongoUsername = System.getenv("CRAWLAB_MONGO_USERNAME");
  14. String mongoPassword = System.getenv("CRAWLAB_MONGO_PASSWORD");
  15. String mongoAuthSource = System.getenv("CRAWLAB_MONGO_AUTH_SOURCE");
  16. String url;
  17. if (Strings.isEmpty(mongoUsername)) {
  18. url = "mongodb://" + mongoHost + ":" + mongoPort + "/" + mongoDatabase;
  19. } else {
  20. url = "mongodb://" + mongoUsername + ":" + mongoPassword + "@" + mongoHost + ":" + mongoPort + "/" + mongoDatabase + "?authSource=" + mongoAuthSource;
  21. }
  22. if (mongoClient == null) {
  23. mongoClient = MongoClients.create(url);
  24. }
  25. return mongoClient;
  26. }
  27. public MongoDatabase getMongoDatabase() {
  28. String mongoDatabase = System.getenv("CRAWLAB_MONGO_DB");
  29. MongoClient mongoClient = getMongoClient();
  30. return mongoClient.getDatabase(mongoDatabase);
  31. }
  32. public MongoCollection<Document> getMongoCollection() {
  33. String mongoCollection = getCollectionName();
  34. return getMongoDatabase().getCollection(mongoCollection);
  35. }
  36. public void saveItem(Document item) {
  37. item.append("task_id", getTaskId());
  38. MongoCollection<Document> collection = getMongoCollection();
  39. collection.insertOne(item);
  40. }
  41. }

当需要保存结果时,只需要调用 saveItem 就可以了。其中 Document 是一个普通的 Java 类。