Как получить доступ к данным веб-страницы с помощью Django?

#python #json #django #rest #django-rest-framework

#python #json #django #отдых #django-rest-framework

Вопрос:

Я новичок в Django. Я пытаюсь получить доступ к данным этой веб-страницы и сохранить их в какой-либо базе данных (например, sqlite). Но я не смог получить нужные данные. Я не уверен, требует ли эта задача использования API IMDB или это возможно без его использования.

Это то, что я уже пробовал:

 # view.py

from django.shortcuts import render
import requests 
from django.http import HttpResponse
import urllib.request, json 

def index(request):
    r = requests.get('https://www.imdb.com/chart/top?ref_=nv_mv_250').json()
    d = {'v': r}
    return render(request, 'index.html', context = d)
 

Я получаю эту ошибку, выполнив приведенный выше код:

 JSONDecodeError at /
Expecting value: line 4 column 1 (char 3)
 

Было бы здорово, если бы кто-нибудь мог мне помочь.

Комментарии:

1. Страница не содержит JSON, это просто HTML-страница. Вы можете использовать скребок , чтобы попытаться собрать данные со страницы, или искать API, который предлагает данные в более структурированном виде.

2. Смотрите, например: realpython.com/python-web-scraping-practical-introduction

3. Может ли быть так, что django не имеет никакого отношения к вашей проблеме?

Ответ №1:

Проблема здесь в том, что веб-страница, к которой вы пытаетесь получить доступ, возвращает HTML, а не какой-либо тип HttpResponse, который вернул бы обычный api. Ошибка декодирования JSON произошла из-за того, что ваш скрипт в основном пытался декодировать необработанную HTML-страницу. Вот несколько решений вашей проблемы:

  • вместо этого используйте imdb rest api.
  • webscrape фактическая HTML-страница, если вы не хотите получать доступ к api. Полезные инструменты:

Ответ №2:

Как указал @CosmicReindeer, вы можете использовать Beautiful Soup на python. Вы можете просмотреть класс заголовка, год и рейтинг, просмотрев источник страницы. И не забывайте, что данные представлены в виде таблицы.

 from bs4 import BeautifulSoup
import requests

page = requests.get("https://www.imdb.com/chart/top?ref_=nv_mv_250")
soup = BeautifulSoup(page.text, "html.parser")
raw_html = soup.find("tbody", {"class": "lister-list"}).findAll("tr")

if __name__ == '__main__':
    v = []
    for html in raw_html:
        title = html.find("td", {"class":"titleColumn"}).find("a").get_text()
        year = html.find('span',{'class':'secondaryInfo'}).contents[0]
        rating = float(html.find("td", {"class":"ratingColumn imdbRating"}).find("strong").get_text())
        raw_list = [title, year, rating]
        v.append(raw_list)

    for x in range(len(v)):
        print(v[x][0], " ", v[x][1], " ", v[x][2])