Как сканировать данные о 1000 книгах одновременно с goodreads.com с помощью его API? - PullRequest
0 голосов
/ 18 апреля 2019

Я анализирую XML файлов и добавляю новое поле с именем <description> к каждому файлу со значением, отсканированным с веб-сайта GoodReads.com с использованием его API. Код успешно сканирует данные книги (когда ISBN соответствует GoodReads.com). Используя ключ разработчика (предоставляется GoodReads.com), мне разрешено сканировать 1000 книг в день, но служба не позволяет мне загружать их одновременно. Обычно после сканирования 20 или более книг он прекращает доступ к книгам, возвращая 404 или 403 status. Пожалуйста, помогите!

Я уже связался с командой разработчиков GoodReads.com, чтобы предоставить мне более 1000 книг для набора данных, который я использую в своих исследовательских экспериментах, но они еще не ответили. Но проблема в том, что даже я не могу сканировать 1000 книги одновременно.

Вот код, который я использую для сканирования книг (путем вызова из основной программы):

import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class GoodReadsCrawler {



private static final String API_KEY = "some key";
private static final String ISBN_TO_ID_URL = "https://www.goodreads.com/book/isbn_to_id?key=" + API_KEY;
private static final String BOOK_DETAILS_URL = "https://www.goodreads.com/book/show/";

public static void main(String[] args) {
    // TODO: Change "1856058387" to any valid ISBN 1933705000
    // String bookId = isbnToId("1856058387");

    // String bookId = isbnToId("1933705000");
    // print("Book Id: " + bookId);
    // String bookData = getBookDescription(bookId);
    // print("Description tag: " + bookData);

}

private static void print(String msg) {
    System.out.println(msg);
}

// private static String isbnToId(String isbn) {
public static String isbnToId(String isbn) {
    try {
        print("Getting id of " + isbn);
        String requestUrl = ISBN_TO_ID_URL + "&isbn=" + isbn;
        HttpClient client = new DefaultHttpClient();
        HttpGet getRequest = new HttpGet(requestUrl);

        HttpResponse response = client.execute(getRequest);
        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }
        return result.toString();
    } catch (Exception e) {
        e.printStackTrace();
        return "";
    }
}

// private static String getBookDescription(String bookId) {
public static String getBookDescription(String bookId) {
    try {
        print("Getting book data...");
        String bookUrl = BOOK_DETAILS_URL + bookId;
        Document documment = Jsoup.connect(bookUrl).get();
        Element descriptionTag = documment.getElementById("description");
        return descriptionTag.getElementsByTag("span").last().text();

    } catch (Exception e) {
        e.printStackTrace();
        return "Error: " + e.getMessage();
    }
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...