首页 > 后端开发 > Python教程 > 使用 selenium 读取需要登入会员的网页

使用 selenium 读取需要登入会员的网页

DDD
发布: 2024-12-08 10:22:15
原创
825 人浏览过

使用selenium 撰写爬虫读取网页内容是很常见的需求,不过你可能会遇到需要先登入帐号才能爬取内容的网页,像是博客来上限制级的书就是这样的例子,你会看到如下的交谈窗:

使用 selenium 讀取需要登入會員的網頁

由于登入帐号后会利用 cookie 记录已登入资讯,为了读取这样的网页,我们可以先手动登入,登入之后汇出 cookie 到档案。之后利用 selenium 爬取网页时,再将汇出的 cookie 重新加入,重新整理网页即可正常读取网页内容了。

汇出 cookie

请先利用 selenium 开启欲读取的网页,这里以博客来为例:

>>> from selenium import webdriver
>>> driver = webdriver.Edge()
>>> driver.get('https://www.books.com.tw')
登录后复制
登录后复制

这时请依照正常程序登入会员,然后安装 cookie_editor 外挂:

使用 selenium 讀取需要登入會員的網頁

请记得切回博客来的首页,利用外挂以 JSON 格式汇出所有的 cookie:

使用 selenium 讀取需要登入會員的網頁

它会将 cookie 内容复制到剪贴簿上,请自行贴到文字编辑器存档。

重新加入 cookie

接着把 selenium 关闭,再重新开启:

>>> from selenium import webdriver
>>> driver = webdriver.Edge()
>>> driver.get('https://www.books.com.tw')
登录后复制
登录后复制

要加入 cookie,一定要在跟 Cookie 相同网域的网页,所以要记得先开启博客来网页。接着就可以开启储存 cookie 的档案,载入成为 Pytho 的字典:

>>> import json
>>> with open('cookies.json') as f:
...     cookies = json.load(f)
登录后复制

再把 cookie 一一加回去:

>>> for cookie in cookies:
...     driver.add_cookie(cookie)
登录后复制

这时你应该会看到以下的错误:

Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
  File "C:\Users\meebo\code\python\poetry_env\py310\.venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 670, in add_cookie
    assert cookie_dict["sameSite"] in ["Strict", "Lax", "None"]
AssertionError
登录后复制

这是因为cookie-editor 汇出的资料中,在sameSite 属性中是以null 表示"no_restriction" 表示没有限制一定要是同一个网站,但是selenium 只认得"Strict", "Lax", "None"这三种限制,所以诊断为错误,我们必须手动修改JSON 档,自行把所有sameSite 属性值都改为"None"(注意是字串喔),也请检查把网域不是".books.com.tw " 的cookie 删除:

[
    {
        "domain": ".books.com.tw",
        "expirationDate": 1767941747.633402,
        "hostOnly": false,
        "httpOnly": false,
        "name": "_ga_TR763QQ559",
        "path": "/",
        "sameSite": null,
        "secure": false,
        "session": false,
        "storeId": null,
        "value": "GS1.1.1733381542.1.1.1733381747.0.0.0"
    },
    ...
    {
        "domain": ".books.com.tw",
        "expirationDate": 1748933733,
        "hostOnly": false,
        "httpOnly": false,
        "name": "__eoi",
        "path": "/",
        "sameSite": "no_restriction",
        "secure": true,
        "session": false,
        "storeId": null,
        "value": "ID=7f42c4647467b5fb:T=1733381733:RT=1733381733:S=AA-AfjbpJCe1kw2klEX0xW55n9CY"
    },
    ...
]
登录后复制

修改完之后,重新载入并加入 cookie 就不会出错了。

重新整理网页让 cookie 生效

加入 cookie 后,你看到的画面仍然是未登入的画面:

使用 selenium 讀取需要登入會員的網頁

必须重新整理网页才能让 cookie 生效:

>>> driver.refresh()
登录后复制

看到的就是登入会员的页面了:

使用 selenium 讀取需要登入會員的網頁

这样就可以利用 selenium 读取需要登入会员的页面了。

最后要提醒的就是 cookie 都有时效,如果一段时间过后无法利用之前储存的 cookie 登入,只要重新依据上述步骤重新取得 cookie 就可以了。

以上是使用 selenium 读取需要登入会员的网页的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板