使用selenium 撰写爬虫读取网页内容是很常见的需求,不过你可能会遇到需要先登入帐号才能爬取内容的网页,像是博客来上限制级的书就是这样的例子,你会看到如下的交谈窗:
由于登入帐号后会利用 cookie 记录已登入资讯,为了读取这样的网页,我们可以先手动登入,登入之后汇出 cookie 到档案。之后利用 selenium 爬取网页时,再将汇出的 cookie 重新加入,重新整理网页即可正常读取网页内容了。
请先利用 selenium 开启欲读取的网页,这里以博客来为例:
>>> from selenium import webdriver >>> driver = webdriver.Edge() >>> driver.get('https://www.books.com.tw')
这时请依照正常程序登入会员,然后安装 cookie_editor 外挂:
请记得切回博客来的首页,利用外挂以 JSON 格式汇出所有的 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 生效:
>>> driver.refresh()
看到的就是登入会员的页面了:
这样就可以利用 selenium 读取需要登入会员的页面了。
最后要提醒的就是 cookie 都有时效,如果一段时间过后无法利用之前储存的 cookie 登入,只要重新依据上述步骤重新取得 cookie 就可以了。
以上是使用 selenium 读取需要登入会员的网页的详细内容。更多信息请关注PHP中文网其他相关文章!