我正试图帮助我的朋友抓取一些可视化所需的数据。他正在使用Tableau在美国地图上可视化主要零售店的比例。我这方面的最终目标是拥有一个CSV,其中包含给定链的所有位置的街道地址,城市,州和邮政编码。
从这里开始BJ:
https://www.bjs.com/allClubLocator
我的方法是使用Splash解析JS,使用Scrapy将返回的HTML刮擦成字典(就像我之前对静态网站所做的那样),然后将数据输出到CSV。
首先,您必须在商店“链接”之前选中一个复选框 显示特定状态的信息:
下面是Splash lua脚本,用于选中所有框并显示所有链接(这很正常):
function main(splash, args)
assert(splash:go(args.url))
assert(splash:wait(0.5))
splash:runjs('var elem = document.getElementsByClassName("checkBox"); for (var i=0; i<elem.length; i++) {elem[i].click();}')
return {
html = splash:html()
}
end
通常,我会做类似的事情来将链接输入到response.follow:
for link in response.xpath('//div[@class="class_name"]/a/@href'):
yield response.follow(link, self.parse)
但是,Splash返回的HTML没有href标记,只有城市名称的文本:
<a _ngcontent-c24="" class="state-hyperlink">Auburn</a>
单击后,将带您到/ mapDetail; city =%somenumber之类的URL。例如,https://www.bjs.com/mapDetail;city=0119会带您到罗德岛考文垂的商店页面。
使用正则表达式解析城市,州和地址很容易,但是我不能做到这一点,除非能够将Scrapy发送到这些详细信息页面...
几乎是肯定的,我现在有一个荷马·辛普森时刻,并且缺少Splash lua脚本中的一些基本内容来解析它们?
非常感谢您的提前帮助。