Python 如何使用Django访问网页数据?

Python 如何使用Django访问网页数据?,python,json,django,rest,django-rest-framework,Python,Json,Django,Rest,Django Rest Framework,我是Django的新手。我试图访问网页的数据并将其存储在某个数据库中(如sqlite)。但我无法获取数据。我不确定这项任务是否需要使用IMDB API,或者不使用它是否可行 这就是我尝试过的: # view.py from django.shortcuts import render import requests from django.http import HttpResponse import urllib.request, json def index(request):

我是Django的新手。我试图访问网页的数据并将其存储在某个数据库中(如sqlite)。但我无法获取数据。我不确定这项任务是否需要使用IMDB API,或者不使用它是否可行

这就是我尝试过的:

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

如果有人能帮助我,那就太好了。

这里的问题是,您试图访问的网页返回HTML,而不是普通api返回的任何类型的HttpResponse。 出现JSON解码错误是因为脚本基本上是在尝试解码原始html页面。 以下是解决您问题的两个解决方案:

  • 改用新的
  • 如果您不想访问api,请访问实际的html页面。 有用的工具:

正如@cosmicreinder所指出的,您可以在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])

页面不包含JSON,这只是一个HTML页面。您可以使用scraper尝试从页面收集数据,或者寻找以更结构化的方式提供数据的API。例如,请参阅:django是否与您的问题无关?