我知道这个问题也曾用类似的方法问过几次,但我无法解决。这就是为什么我要打开一个特定的案例/问题。
情况
我抓取了一个显示文章的网站,比如说20(但该网站有200)。我点击文章链接,然后在那里提取所需的数据。到目前为止,一切都很好。
某些页面似乎具有 Load More (加载更多)按钮,而不是“正常”分页,以显示20篇以上的文章。斗争就从这里开始。我检查了该页面(例如,像在video中用example描述的那样)。但是,单击按钮时请求URL的结构与视频中描述的结构不同。因为结构将保持不变,而不是像http://quotes.toscrape.com/api/quotes那样加载页面? page = 8 ,“ page = 9 ”等。
点击按钮后,我发现带有以下“请求URL”的网站:
在两个示例中,单击按钮时,链接都不会更改。因此,我有点迷茫,无法应用所学教程的解决方案。
我认为解决方案可能是使用Splash ,如here所述。它指出:
通常情况下,您需要在显示页面之前单击一个按钮。我们可以使用splash:mouse_click函数来做到这一点:
function main(splash)
assert(splash:go(splash.args.url))
local get_dimensions = splash:jsfunc([[
function () {
var rect = document.getElementById('button').getClientRects()[0];
return {"x": rect.left, "y": rect.top}
}
]])
splash:set_viewport_full()
splash:wait(0.1)
local dimensions = get_dimensions()
splash:mouse_click(dimensions.x, dimensions.y)
-- Wait split second to allow event to propagate.
splash:wait(0.1)
return splash:html()
end
我安装了启动程序并设置了所有设置。但是,我真的很难将其集成到我的草率代码中。并且这将实际起作用,还是该功能仅单击一次按钮?此外,我抓取的网站的按钮元素没有ID,只有类名(但我想这不是我要解决的问题)。
我非常感谢您提供任何有关如何将此启动功能集成到我的scrapy代码中的输入,或者是通过动态加载更多按钮加载的链接来跟踪链接的其他解决方案。
这是我的代码的一部分(没有飞溅,仅跟随链接和抓取项):
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["example.com"]
start_urls = [
"https://example.com",
]
def parse(self, response):
# follow links to article
for href in response.xpath('//div[@class="article"]/a/@href'):
yield response.follow(href, self.parse_article)
def parse_article(self, response):
def get_with_xpath(query):
return response.xpath(query).get(default='').strip()
yield {
'title': get_with_xpath('//meta[@name="title"]/@content'),
'description': get_with_xpath('//meta[@name="description"]/@content')
}