#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])