scrapy - 从无限滚动页面获取链接

标签 scrapy scrapy-splash

我正在尝试从带有 LinkExtractor 的页面获取链接在无限滚动的页面上。用

做这个
    rules = (
    Rule(LinkExtractor(allow=".*?(\/nl\/agenda\/).*"), callback='parse_item', follow=True),
)

有效。但是,这在没有 JavaScript 的情况下被调用,因此图像不会在页面中加载(以及我需要的它们的 url)。将 LinkExtractor 更改为时;

rules = (
    Rule(LinkExtractor(allow=".*?(\/nl\/agenda\/).*"), callback='parse_item', follow=True, process_links='process_links'),
)

与;

def process_links(self, links):
    for link in links:
        link.url = "http://localhost:8050/render.html?" + urlencode({ 'url' : link.url })
    return links

它只访问它在加载页面时加载的 url(但它需要获取所有你可以通过滚动获得的链接)。出于某种原因,它还会像这样加载一些奇怪的本地主机 URL;

http://localhost:8050/render.html?url=http%3A%2F%2Flocalhost%3A8050%2Fnl%2Fagenda%2xxxxxx

我不知道为什么会这样。

有没有办法在使用 LinkExtractor 和 Splash 时执行 JavaScript,这样我就可以在 LinkExtractor 获取链接之前滚动并获取所有链接?仅在跟踪来自 LinkExtractor 的链接时执行 JavaScript 也足够了,但我不知道从哪里开始这样做。

最佳答案

链接提取器处理当前内容而不是动态呈现的内容。是的,正如您所说,为此,您正在使用 splash 但 splash 用于呈现 JavaScript 代码,而虚拟滚动从未在 splash 中处理,虚拟滚动更像是获取新数据并将其附加到现有 HTML 的网络调用.因此,当您滚动时,找到一个调用,然后点击该调用以获取所需的数据。

关于scrapy - 从无限滚动页面获取链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53951247/

相关文章:

javascript - Python如何与javascript一起工作

python - 如何在 Scrapy Splash 请求中发送自定义 header ?

python - Scrapy-Splash:无法使用 scrapinghub/splash:latest 作为基础镜像运行 docker 容器

python - 为单个项目从多个来源收集数据的正确方法

python - 使用 Xpath 使用多个条件从 <head> 中的元标记中提取内容

python - 如何在 scrapy 项目导出中每次都覆盖文件?

ubuntu - 从子域为另一台服务器提供服务

python - scrapy-splash 返回它自己的标题而不是网站的原始标题

python - 使用 Scrapy-Splash 的代理服务器

python - 如何获取从 Scrapy Splash 请求生成的 cookie?