首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用Scrapy和Splash处理分页,如果按钮的href为javascript:void(0)

如何使用Scrapy和Splash处理分页,如果按钮的href为javascript:void(0)
EN

Stack Overflow用户
提问于 2022-05-12 12:48:26
回答 1查看 55关注 0票数 -1

我正试图从这个网站:https://www.topuniversities.com/university-rankings/world-university-rankings/2021中抓取大学的名称和链接,并且在处理分页时遇到了一个问题,因为指向下一页的按钮的href是javascript:void(0),所以我无法用scrapy.Request()或response.follow()到达下一页,有什么方法可以这样处理分页吗?

网站屏幕截图

标签和href的屏幕截图

此网站的URL不包含params,如果单击下一个页面按钮,URL将保持不变,因此我无法通过更改URL来处理分页。

下面的代码片段只能在第一页和第二页获取大学的名称和链接:

代码语言:javascript
运行
AI代码解释
复制
import scrapy
from scrapy_splash import SplashRequest


class UniSpider(scrapy.Spider):
    name = 'uni'
    allowed_domains = ['www.topuniversities.com']

    script = """
    function main(splash, args)
      splash:set_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36")
      splash.private_mode_enabled = false
      assert(splash:go(args.url))
      assert(splash:wait(3))

      return {
        html = splash:html()
      }
    end
    """

    next_page = """
    function main(splash, args)
        splash:set_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36")
        splash.private_mode_enabled = false
        assert(splash:go(args.url))
        assert(splash:wait(3))

        local btn = assert(splash:jsfunc([[
        function(){
        document.querySelector("#alt-style-pagination a.page-link.next").click()
      }
        ]]))
        assert(splash:wait(2))
        btn()

        splash:set_viewport_full()
        assert(splash:wait(3))

        return {
          html = splash:html()
        }
    end
    """

    def start_requests(self):
        yield SplashRequest(
            url="https://www.topuniversities.com/university-rankings/world-university-rankings/2021",
            callback=self.parse, endpoint="execute",
            args={"lua_source": self.script})

    def parse(self, response):
        for uni in response.css("a.uni-link"):
            uni_link = response.urljoin(uni.css("::attr(href)").get())
            yield {
                "name": uni.css("::text").get(),
                "link": uni_link
            }

        yield SplashRequest(
            url=response.url,
            callback=self.parse, endpoint="execute",
            args={"lua_source": self.next_page}
        )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-12 23:40:52

你不需要花这个简单的网站。

尝试加载以下链接:

https://www.topuniversities.com/sites/default/files/qs-rankings-data/en/2057712.txt

这有所有的大学,网站只加载这个文件/json一次,然后显示信息与分页。

下面是简短的代码(不使用scrapy):

代码语言:javascript
运行
AI代码解释
复制
from requests import get
from json import loads, dumps
from lxml.html import fromstring

url = "https://www.topuniversities.com/sites/default/files/qs-rankings-data/en/2057712.txt"
html = get(url, stream=True)

## another approach for loading json
# jdata = loads(html.content.decode())

jdata = html.json()
for x in jdata['data']:
    core_id = x['core_id']
    country = x['country']
    city = x['city']
    guide = x['guide']
    nid = x['nid']
    title = x['title']
    logo = x['logo']
    score = x['score']
    rank_display = x['rank_display']
    region = x['region']
    stars = x['stars']
    recm = x['recm']
    dagger = x['dagger']

    ## convert title to text
    soup = fromstring(title)
    title = soup.xpath(".//a/text()")[0]

    print ( title )

以上代码打印个别大学的“标题”,尝试将其与其他可用列一起保存在CSV/Excel文件中。结果如下:

代码语言:javascript
运行
AI代码解释
复制
Massachusetts Institute of Technology (MIT) 
Stanford University
Harvard University
California Institute of Technology (Caltech)
University of Oxford
ETH Zurich - Swiss Federal Institute of Technology
University of Cambridge
Imperial College London
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72221908

复制
相关文章
Ubuntu Desktop安装及桌面美化(修复图片)
用户1170933
2018/01/05
4.5K0
Ubuntu Desktop安装及桌面美化(修复图片)
如何在Ubuntu 18.04.2 LTS中安装Unity桌面环境
本文向你介绍如何在Ubuntu 18.04.2 LTS操作系统中安装Unity桌面环境的方法,包括查看Unity版本及从Ubuntu 18.04系统中卸载GNOME桌面的方法。其实Unity桌面挺好用的,也很美化,如果你倾向于Unity,那就使用它吧,跟着以下方法一起操作。
用户8704998
2021/06/07
1.9K0
给 FreeBSD 12.1 安装 GNOME3 图形界面
FreeBSD是一个完全开放的、安全的系统,可以Do it yourself的系统。但是个人还是不喜欢呆板的命令行界面,所有就给 FreeBSD 12.1 安装 GNOME3 图形界面。
用户8705033
2021/06/08
1.9K0
virtualbox和Gnome3
最近不停的在装linux,各种发行版本基本上都装了,可能是先入为主的概念,比较喜欢fc15+gnome3,虽然ubuntu和opensuse都已经搭配了gnome3但没有直接放到DVD里面装起来麻烦,fc15DVD包含了所有包,不用为不能联网的问题烦恼。在virtualbox中安装fc15+gnome3问题很多,不知道是fc的问题还是gnome3的问题,时常一个mount命令可能导致内核崩溃,对此很无语,经过半个月的摸索发现gnome3的vb的版本要求很奇怪,以前用4.1.2成功了一次就再也不行了,逼不得已退回到4.1.0,奇怪的时退回来后装Gnome更轻松了而且不用升级内核版本。难道是内核版本去匹配VB增强包自带的显卡驱动,而不是反过来的,关于KDE确实很华丽,不过真是不习惯那个终端,要么全屏要么就自动缩小到那一块儿,设置大小也没用,gnome3的体验确实不错,虽然颠覆了传统的操作习惯但是慢慢会习惯的。但有些问题依然不知道怎么回事。
py3study
2020/01/13
7270
如何在 Ubuntu 服务器上安装桌面环境(GUI)
你想在你的 Ubuntu 服务器上安装 GUI 吗?大部分情况下你是可以安装的,在本教程中我会详细介绍安装的步骤。
用户8639654
2021/09/13
4.9K0
如何在 Ubuntu 18.04 上安装 Xrdp 远程桌面服务
Xrdp 是 Microsoft 远程桌面协议 (RDP) 的开源实现,允许您以图形方式控制远程系统。使用 RDP ,您可以登录到远程计算机并创建一个真实的桌面会话,就像您已登录到本地计算机一样。
星哥玩云
2022/07/28
2.5K0
如何在 Ubuntu 18.04 上安装 Xrdp 远程桌面服务
Gitea Windows 版修复式安装后恢复之前的仓库
这两天遇到了家里搭建的 Windows 版 Gitea 服务端异常的问题,提示 ORM 错误,连接不上。进入系统一看,发现是 MySql 数据库坏了。最后只好重装 MySql,然后再次访问 Gitea 服务,发现要重新执行安装(初始化)操作,索性将数据库选成 Sqlite 来重新安装了。安装完之后发现网站中空空如也,之前的仓库都没了,所以就想着怎么恢复。上网简单搜索了一番,只在一篇被墙的文章[https://www.soinside.com/question/kF6BqYRodW6zEn4SD3NUZP]中发现了一点蛛丝马迹。然后在 Gitea 后台摸索了一番,发现挺简单的,不过不懂的人应该是不懂的(手动狗头),所以特写此文广而告之。
独立观察员
2025/01/23
970
Gitea Windows 版修复式安装后恢复之前的仓库
桌面白屏(Active故障)修复批处理
一年前我在做用户系统维护服务工作时发现 AD 域环境下,AD 用户桌面经常会出现壁纸无法显示,ActiveDesktop 桌面损坏之类的故障,当时从前人心得里学到的方法就是登入管理员,然后删除用户配置
张戈
2018/03/23
1.4K0
桌面白屏(Active故障)修复批处理
glibc 误升级后修复
在使用 cephadm 安装 ceph v16.2 时升级了 python,系统默认版本是 3.7.4 ,升级后版本是 3.8.5,glibc 作为依赖同时进行了升级,系统默认版本是 2.28 ,升级后版本是 2.31,幸好记录及时,截图留存了软件包升级信息,如下
Amadeus
2022/10/25
2.9K0
glibc 误升级后修复
【桌面篇】ArchLinux安装kde桌面
现在你的U盘可以拔掉了,重启后会发现和刚刚没什么区别,还是命令行的界面,别着急现在就带你安装桌面环境。
huanhao
2020/04/09
8K0
安装Gnome桌面
sudo add-apt-repository ppa:tualatrix/ppa sudo apt-get install -f gnome-panel gnome gnome-shell gnome-menus gnome-session gdm
JNingWei
2018/09/28
4.4K0
如何在 Ubuntu 18.04 上安装 Xrdp 服务器(远程桌面)
Xrdp 是一个微软远程桌面协议(RDP)的开源实现,它允许你通过图形界面控制远程系统。通过 RDP,你可以登录远程机器,并且创建一个真实的桌面会话,就像你登录本地机器一样。
雪梦科技
2020/05/11
14.3K0
如何在 Ubuntu 18.04 上安装 Xrdp 服务器(远程桌面)
如何在 Ubuntu 上安装和使用 XRDP 进行远程桌面连接
微软的 远程桌面协议(RDP) 是一个允许从一台计算机到另一台计算机进行图形化远程桌面连接的协议。RDP 的工作原理是让一台主机运行软件,允许其他几台计算机连接到它。
用户8639654
2021/09/08
2.6K0
如何在 Ubuntu 上安装和使用 XRDP 进行远程桌面连接
微软的 远程桌面协议(RDP) 是一个允许从一台计算机到另一台计算机进行图形化远程桌面连接的协议。RDP 的工作原理是让一台主机运行软件,允许其他几台计算机连接到它。
用户8989785
2021/09/09
3.4K0
AIGC | Ubuntu24.04桌面版安装后必要配置
描述:Ubuntu 24.04 与CentOS/Redhat系列主机网络配置是不一样,从Ubuntu 20.04开始网络配置目录为/etc/netplan/,通常安装后会有一个50-cloud-init.yaml文件它是Ubuntu 24.04的默认网络配置文件。
全栈工程师修炼指南
2024/07/06
2.4K0
AIGC | Ubuntu24.04桌面版安装后必要配置
如何在Ubuntu 20.04 上安装 Xrdp 服务器(远程桌面)
本文最先发布在: https://www.itcoder.tech/posts/how-to-install-xrdp-on-ubuntu-20-04/
雪梦科技
2020/05/25
10.2K6
如何在Ubuntu 20.04 上安装 Xrdp 服务器(远程桌面)
如何在Ubuntu 18.09 Linux上安装WordPress.com桌面应用程序
在本文中,我们将在Ubuntu 19.04 Disco Dingo Linux上安装Wordpress.com桌面客户端应用程序。
星哥玩云
2022/07/26
1.5K0
如何在Ubuntu 18.09 Linux上安装WordPress.com桌面应用程序
如何在Ubuntu上修复Grub 2
Grub 2与以前版本中最受欢迎且广泛使用的启动管理器相比,已经是一个期待已久且非常重要的升级。 支持新的文件系统,主题,改进的飞溅功能,更好的国际化,电源引导,动态模块加载和脚本支持。 所有这一切都是伟大的,但事情仍然会出错,意外突破。 这基本上意味着可启动分区(操作系统)可能无法访问,这就是为什么Grub v2提供了强大的营救模式。 现在使用这种模式,对于大多数没有经验的用户而言,可能不会在公园里散步,所以这里有一个关于如何使用Boot Repair工具轻松修复Grub的指南。
子润先生
2021/06/14
1.7K0
更新后系统无法启动,如何修复?
是山河呀
2025/03/23
1840
ubuntu11.04升级到11.10 启动不起来(booting system without full network configuration)
装上ubuntu有一段时间了,说起来过程比较曲折,显示用u盘装了32位的fedora系统,但是4G内存无法充分发挥优势,于是装成64位fedora系统,不过稳定性不是特别好,在加上无法识别笔记本(thinkpad E420 39c)的无线网卡,于是又装成ubuntu64位11.04,用起来觉得舒服多了,可能是因为先前用过的缘故。不过无线网卡还是无法识别,在网上查找了解决方案才搞定。
the5fire
2019/02/28
1.1K0

相似问题

jQuery:包含ajax()函数的函数不会返回ajax()响应

10

JavaScript函数返回AJAX响应(没有jQuery)?

24

JQuery AJAX响应未定义

23

jquery ajax返回值未按预期响应

13

JQuery Ajax函数返回

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文