Python 如何使用Django访问网页数据?
我是Django的新手。我试图访问网页的数据并将其存储在某个数据库中(如sqlite)。但我无法获取数据。我不确定这项任务是否需要使用IMDB API,或者不使用它是否可行 这就是我尝试过的: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):
# 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页面。
有用的工具:
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是否与您的问题无关?