Python请求库从POST请求中提取单独的JSON和HTML响应

2024-04-26 22:04:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我对网页抓取、编程和StackOverflow还不熟悉,所以我会尽可能清晰地表达我的想法

我正在使用Python请求库尝试从本地的一家电影院连锁店中获取一些信息。当我查看网络部分的Chrome开发者工具响应/预览选项卡时,我可以看到看起来非常干净和有用的JSON:

然而,当我尝试使用请求来获取相同的信息时,我得到的是整个页面内容(一页接一页的html)。在进一步检查Chrome开发者工具中的级联之后,我可以看到有两个名为GetNowPlayingByCity的事件:一个包含JSON信息,另一个似乎是HTML

JSON ResponseHTML Response

如何将两者分开,并仅使用Python请求库获取JSON响应?

我已经尝试过修改requests.post(Chrome开发者工具表明这是一个post方法)中的标题,以包含“accept:application/json,text/plain,*/*”,但没有看到我在requests.post中得到的响应有什么不同。目前,我无法解析requests.post响应中的任何JSON,并出现以下错误:

“json.decoder.JSONDecodeError:预期值:第4行第1列(字符3)”

我总是可以尝试解析完整的HTML,但是它太长太复杂了,我更愿意使用友好的JSON信息。任何帮助都将不胜感激


Tags: 工具信息json网页responsehtml编程chrome
1条回答
网友
1楼 · 发布于 2024-04-26 22:04:43

这可能是因为页面发送到浏览器的javascript向API发出请求,以获取有关电影的json信息

您可以尝试直接将请求发送到他们的API(请参见编辑2),使用类似Beautiful Soup的库解析html,也可以使用python中的专用刮取库。我对scrapy有很好的经验。它比请求快得多

编辑:

如果页面使用动态加载的内容(我认为是这种情况),则必须在PhantomJS浏览器中使用selenium,而不是请求。以下是一个例子:

from bs4 import BeautifulSoup
from selenium import webdriver

url = "your url"
browser = webdriver.PhantomJS()
browser.get(url)
html = browser.page_source
soup = BeautifulSoup(html, 'lxml')

# Then parse the html code here

或者你可以load the dynamic content with scrapy

如果你想进入刮削行业,我推荐后者。这将需要更多的时间来学习,但这是一个更好的解决方案

编辑2:

要直接向他们的api发出请求,您只需复制您看到的请求即可。使用google chrome,如果您单击请求并转到“标题”,您可以看到该请求:

Getting the request info

之后,您只需使用请求库复制请求:

import requests
import json

url = 'http://paste.the.url/?here='

response = requests.get(url)

content = response.content

# in my case content was byte string 
# (it looks like b'data' instead of 'data' when you print it)
# if this is you case, convert it to string, like so

content_string = content.decode()

content_json = json.loads(content_string)

# do whatever you like with the data

您可以根据需要修改url,例如,如果它类似于http://api.movies.com/?page=1&movietype=3,您可以将movietype=3修改为movietype=2以观看不同类型的电影,等等

相关问题 更多 >