Попытка получить все статьи в формате pdf из основной базы данных API: python - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь извлечь все статьи в формате pdf, используя API из ядра (сборник статей открытого доступа). У меня есть 2 версии. Один из них такой:

    import requests
import time
import sys
import os
import validators
import urllib.request
from bs4 import BeautifulSoup
import pandas as pd

def download_file():
  for i in range(1, 5):
    url = 'https://core.ac.uk:443/api-v2/articles/'
    query = 'search/(needs%20OR%20requirements)%20AND%20(smart%20irrigation%20OR%20smart%20irrigation%20system%20)%20AND%20crops%20AND%20(smallholder%20OR%20rural)AND%20(internet%20of%20things%20OR%20IoT)?'
    language = 'language=en&'
    year = 'from_Year=2015&to_Year=2019'
    page = 'page={}&'.format(i)
    pageSize = 'pageSize=100&'
    data_query = 'metadata=false&fulltext=false&citations=false&similar=false&duplicate=false&urls=true&faithfulMetadata=false&'
    apiKey = 'apiKey=AEzF5ei2TfnsCmpSR8yHIv6NoPakwYr9'

    response = requests.get(url + query + language + year + page + pageSize + data_query + apiKey)
    time.sleep(1)
    if response.status_code != 200:
      print('No es posible tener respuesta del servidor {}'.format(i))
    else:
      json_data = response.json()
      df = pd.DataFrame(json_data['data'])
      for index, row in df.iterrows():
        file_name = str(row['id'] + '.pdf')
        val_boolean = validators.url(row['fulltextIdentifier'])
        if val_boolean == True:
          print('Descargando el documento {}'.format(file_name))
          with open(file_name, 'wb') as file_pdf:
            url = requests.get(row['fulltextIdentifier'])
            file_pdf.write(url.content)
      print('Descarga completada '.format(i))
if __name__ == '__main__':
  download_file() 

в начале кажется работающим, но я заметил, что он не получает все PDF-файлы. Он продолжает циклически повторять одни и те же 100 статей с первой страницы снова и снова с 1 по 5, он не хочет go за пределами первой страницы, что я делаю не так? Как я могу сделать так, чтобы это было oop правильным способом? Мне нужно получить около 10000 статей.

до версии 2 Я хотел сделать то же самое, но получил ошибку:

    import requests
from urllib.parse import urljoin

url = 'https://core.ac.uk:443/api-v2/articles/'
query = 'search/(needs%20OR%20requirements)%20AND%20(smart%20irrigation%20OR%20smart%20irrigation%20system%20)%20AND%20crops%20AND%20(smallholder%20OR%20rural)AND%20(internet%20of%20things%20OR%20IoT)?'
language = 'language=en&'
year = 'from_Year=2015&to_Year=2019'
page = 'page=1&'
pageSize = 'pageSize=100&'
data_query = 'metadata=false&fulltext=false&citations=false&similar=false&duplicate=false&urls=true&faithfulMetadata=false&'
apiKey = 'apiKey=AEzF5ei2TfnsCmpSR8yHIv6NoPakwYr9'
url_request = (url + query + language + year + page + pageSize + data_query + apiKey)
response = requests.get(url_request).json()

for file in response['data']:
    url_request=file(response['data'][file].get('fulltextIdentifier'))
    if url_request:
        file_name = os.path.join(url_request.split('/')[-1])
        with open(file_name, mode='wb') as file_pdf:
            file_pdf.write(requests.get(url_request).content) 

Это ошибка, как я могу это исправить? url_request=file(response['data'][file].get('fulltextIdentifier')) TypeError: list indices must be integers or slices, not dict

Я новичок во всем этом, не могли бы вы мне помочь, пожалуйста?

...