Scrapy + splash: 无法选择元素
2022-2-14 18:24:50
收藏:0
阅读:89
评论:1
我正在学习使用 scrapy 和 splash。作为练习,我试图访问 https://www.ubereats.com/stores/,点击地址文本框,输入位置,然后按 Enter 按钮移动到显示该位置可用餐厅的下一页。我有以下 lua 代码:
function main(splash)
local url = splash.args.url
assert(splash:go(url))
assert(splash:wait(5))
local element = splash:select('.base_29SQWm')
local bounds = element:bounds()
assert(element:mouseclick{x = bounds.width/2, y = bounds.height/2})
assert(element:send_text("Wall Street"))
assert(splash:send_keys("<Return>"))
assert(splash:wait(5))
return {
html = splash:html(),
}
end
当我在 splash API 中单击“Render!”时,我收到以下错误消息:
{
"info": {
"message": "Lua error: [string \"function main(splash)\r...\"]:7: attempt to index local 'element' (a nil value)",
"type": "LUA_ERROR",
"error": "attempt to index local 'element' (a nil value)",
"source": "[string \"function main(splash)\r...\"]",
"line_number": 7
},
"error": 400,
"type": "ScriptError",
"description": "Error happened while executing Lua script"
}
一些如何我的 css 表达式是 false,导致 splash 尝试访问未定义/零值的元素!我已尝试其他表达式,但似乎找不到解决方法!
Q: 有谁知道如何解决这个问题吗?
EDIT: 即使我仍然想知道如何实际单击该元素,但我发现仅使用按键即可获得相同的结果:
function main(splash)
local url = splash.args.url
assert(splash:go(url))
assert(splash:wait(5))
splash:send_keys("<Tab>")
splash:send_keys("<Tab>")
splash:send_text("Wall Street, New York")
splash:send_keys("<Return>")
assert(splash:wait(10))
return {
html = splash:html(),
png = splash:png(),
}
end
然而,在 splash API 中返回的 HTML/图像来自输入地址的页面,而不是输入地址并单击 enter 后看到的页面。
Q2: 如何成功加载第二页?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

这里并不是完整的解决方案,但下面是我目前的进展:
import json import re import scrapy from scrapy_splash import SplashRequest class UberEatsSpider(scrapy.Spider): name = "ubereatspider" allowed_domains = ["ubereats.com"] def start_requests(self): script = """ function main(splash) local url = splash.args.url assert(splash:go(url)) assert(splash:wait(10)) splash:set_viewport_full() local search_input = splash:select('#address-selection-input') search_input:send_text("Wall Street, New York") assert(splash:wait(5)) local submit_button = splash:select('button[class^=submitButton_]') submit_button:click() assert(splash:wait(10)) return { html = splash:html(), png = splash:png(), } end """ headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36' } yield SplashRequest('https://www.ubereats.com/new_york/', self.parse, endpoint='execute', args={ 'lua_source': script, 'wait': 5 }, splash_headers=headers, headers=headers) def parse(self, response): script = response.xpath("//script[contains(., 'cityName')]/text()").extract_first() pattern = re.compile(r"window.INITIAL_STATE = (\{.*?\});", re.MULTILINE | re.DOTALL) match = pattern.search(script) if match: data = match.group(1) data = json.loads(data) for place in data["marketplace"]["marketplaceStores"]["data"]["entity"]: print(place["title"])请注意 Lua 脚本中的更改:我找到了搜索框,将搜索文本发送给它,然后找到了“查找”按钮并单击了它。在截图中,无论我设置了多长时间延迟,都没有看到搜索结果加载,但是我已经从
script内容中获取了餐厅名称。place对象包含筛选所需餐厅的所有必要信息。还要注意,我导航到的 URL 是“New York”(而不是通用的“stores”)。
我不完全确定为什么搜索结果页面没有被加载,但希望这能为您提供一个很好的开端,您可以进一步改进这个解决方案。