Я анализирую 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();
}
}
}