Splash 返回多个 html 快照的问题
Issue with Splash returning multiple html snapshots
我正在尝试 return 多个 html 页面使用启动脚本(在单个响应中,如文档中所示)并从中提取链接。但我发现在 response.text 和 response.body 中,只要有超过一页 returned,html 内容就会被更改。 response.data 不是这种情况,它工作正常。为什么会这样?
我在与文档相同的代码(和网站)上进行了尝试- http://splash.readthedocs.io/en/stable/scripting-ref.html#splash-html(来自后面的部分,来自多个 html 快照的示例)
这是我的初始请求-->
yield Request(url= url, callback= self.parse, dont_filter=True, meta={
'splash': {
'args': {'lua_source': self.lua_source, 'timeout': 200},
'endpoint': 'execute',
},
})
lua 脚本如下所示 -->
function page_info(splash, url)
splash:go(url)
local res = {
html=splash:html(),
}
return res
end
function main(splash, args)
local base = "https://news.ycombinator.com/news?p="
local result = treat.as_array({})
for i=1,3 do
local url = base .. i
result[i] = page_info(splash, url)
end
return result
end
结果响应:
response.data -->
{u'html': u'<html op="news"><head><meta name="referrer" content="origin"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" type="text/css" href="news.css?i7azI8MkFRPfcPhHQ7HD">\n <link rel="shortcut icon" href="favicon.ico">\n <link rel="alternate" type="application/rss+xml" title="RSS" href="rss">\n <title>Hacker News</title>
response.text 和 response.body -->
u'[{"html": "<html op=\"news\"><head><meta name=\"referrer\" content=\"origin\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><link rel=\"stylesheet\" type=\"text/css\" href=\"news.css?i7azI8MkFRPfcPhHQ7HD\">\n <link rel=\"shortcut icon\" href=\"favicon.ico\">\n <link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"rss\">\n <title>Hacker News</title></head>
注意第二种情况下多出的\ \。这些可能是转义字符或其他东西,但它们与使用 response.text 的 LinkExtractor 混淆并导致链接断开。同样,这仅在我 returning 一组 html 响应时发生。
我在这里错过了什么?
Lua 脚本正在返回一组结果,这些结果将被转换为 Python 中的 JSON 兼容结构。 response.text
中的值似乎是正确的。
您要传递给 LinkExtractor
的 HTML 在 json.loads(response.text)[i]['html']
,因为 i
在 0..2
。
In [1]: import json
In [2]: text = u'[{"html": "<html op=\"news\"><head><meta name=\"referrer\" content=\"origin\"><meta name=\"viewport\
...: " content=\"width=device-width, initial-scale=1.0\"><link rel=\"stylesheet\" type=\"text/css\" href=\"news.css
...: ?i7azI8MkFRPfcPhHQ7HD\">\n <link rel=\"shortcut icon\" href=\"favicon.ico\">\n <link rel=\"alternate\" type=
...: \"application/rss+xml\" title=\"RSS\" href=\"rss\">\n <title>Hacker News</title></head>"}]'
In [3]: print(text)
[{"html": "<html op=\"news\"><head><meta name=\"referrer\" content=\"origin\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><link rel=\"stylesheet\" type=\"text/css\" href=\"news.css?i7azI8MkFRPfcPhHQ7HD\">\n <link rel=\"shortcut icon\" href=\"favicon.ico\">\n <link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"rss\">\n <title>Hacker News</title></head>"}]
In [4]: print(json.dumps(json.loads(text), indent=2))
[
{
"html": "<html op=\"news\"><head><meta name=\"referrer\" content=\"origin\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><link rel=\"stylesheet\" type=\"text/css\" href=\"news.css?i7azI8MkFRPfcPhHQ7HD\">\n <link rel=\"shortcut icon\" href=\"favicon.ico\">\n <link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"rss\">\n <title>Hacker News</title></head>"
}
]
In [5]: print(json.loads(text)[0]['html'])
<html op="news"><head><meta name="referrer" content="origin"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" type="text/css" href="news.css?i7azI8MkFRPfcPhHQ7HD">
<link rel="shortcut icon" href="favicon.ico">
<link rel="alternate" type="application/rss+xml" title="RSS" href="rss">
<title>Hacker News</title></head>
我正在尝试 return 多个 html 页面使用启动脚本(在单个响应中,如文档中所示)并从中提取链接。但我发现在 response.text 和 response.body 中,只要有超过一页 returned,html 内容就会被更改。 response.data 不是这种情况,它工作正常。为什么会这样?
我在与文档相同的代码(和网站)上进行了尝试- http://splash.readthedocs.io/en/stable/scripting-ref.html#splash-html(来自后面的部分,来自多个 html 快照的示例)
这是我的初始请求-->
yield Request(url= url, callback= self.parse, dont_filter=True, meta={
'splash': {
'args': {'lua_source': self.lua_source, 'timeout': 200},
'endpoint': 'execute',
},
})
lua 脚本如下所示 -->
function page_info(splash, url)
splash:go(url)
local res = {
html=splash:html(),
}
return res
end
function main(splash, args)
local base = "https://news.ycombinator.com/news?p="
local result = treat.as_array({})
for i=1,3 do
local url = base .. i
result[i] = page_info(splash, url)
end
return result
end
结果响应:
response.data -->
{u'html': u'<html op="news"><head><meta name="referrer" content="origin"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" type="text/css" href="news.css?i7azI8MkFRPfcPhHQ7HD">\n <link rel="shortcut icon" href="favicon.ico">\n <link rel="alternate" type="application/rss+xml" title="RSS" href="rss">\n <title>Hacker News</title>
response.text 和 response.body -->
u'[{"html": "<html op=\"news\"><head><meta name=\"referrer\" content=\"origin\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><link rel=\"stylesheet\" type=\"text/css\" href=\"news.css?i7azI8MkFRPfcPhHQ7HD\">\n <link rel=\"shortcut icon\" href=\"favicon.ico\">\n <link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"rss\">\n <title>Hacker News</title></head>
注意第二种情况下多出的\ \。这些可能是转义字符或其他东西,但它们与使用 response.text 的 LinkExtractor 混淆并导致链接断开。同样,这仅在我 returning 一组 html 响应时发生。 我在这里错过了什么?
Lua 脚本正在返回一组结果,这些结果将被转换为 Python 中的 JSON 兼容结构。 response.text
中的值似乎是正确的。
您要传递给 LinkExtractor
的 HTML 在 json.loads(response.text)[i]['html']
,因为 i
在 0..2
。
In [1]: import json
In [2]: text = u'[{"html": "<html op=\"news\"><head><meta name=\"referrer\" content=\"origin\"><meta name=\"viewport\
...: " content=\"width=device-width, initial-scale=1.0\"><link rel=\"stylesheet\" type=\"text/css\" href=\"news.css
...: ?i7azI8MkFRPfcPhHQ7HD\">\n <link rel=\"shortcut icon\" href=\"favicon.ico\">\n <link rel=\"alternate\" type=
...: \"application/rss+xml\" title=\"RSS\" href=\"rss\">\n <title>Hacker News</title></head>"}]'
In [3]: print(text)
[{"html": "<html op=\"news\"><head><meta name=\"referrer\" content=\"origin\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><link rel=\"stylesheet\" type=\"text/css\" href=\"news.css?i7azI8MkFRPfcPhHQ7HD\">\n <link rel=\"shortcut icon\" href=\"favicon.ico\">\n <link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"rss\">\n <title>Hacker News</title></head>"}]
In [4]: print(json.dumps(json.loads(text), indent=2))
[
{
"html": "<html op=\"news\"><head><meta name=\"referrer\" content=\"origin\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><link rel=\"stylesheet\" type=\"text/css\" href=\"news.css?i7azI8MkFRPfcPhHQ7HD\">\n <link rel=\"shortcut icon\" href=\"favicon.ico\">\n <link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"rss\">\n <title>Hacker News</title></head>"
}
]
In [5]: print(json.loads(text)[0]['html'])
<html op="news"><head><meta name="referrer" content="origin"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" type="text/css" href="news.css?i7azI8MkFRPfcPhHQ7HD">
<link rel="shortcut icon" href="favicon.ico">
<link rel="alternate" type="application/rss+xml" title="RSS" href="rss">
<title>Hacker News</title></head>