使用Bs4爬取2lib.org获取的下载链接与手动查看不一致该如何解决?
问题原因和修复方案
链接不一致的核心原因
2lib的下载链接是基于用户会话动态生成的,链接末尾的字符串是会话相关的签名参数,你代码请求时的会话和你浏览器手动访问的会话不一致,所以生成的签名不一样,最终链接也不匹配。
需要补充的处理步骤
- 补充完整的请求头模拟浏览器访问
网站会对请求头做校验,直接用requests默认的请求头会被识别为爬虫,返回临时异常的下载链接。你需要从浏览器开发者工具的网络面板中,复制你访问该书籍页时的请求头,包含User-Agent、Referer、Accept等字段,添加到requests的请求参数中。 - 同步会话Cookie
如果你手动访问时处于登录状态,或者浏览器已经有站点分配的匿名会话Cookie,你需要将对应Cookie复制到代码的请求头中,或者使用requests.Session()维持同一会话发起请求,保证会话和浏览器侧一致,拿到的签名参数才会匹配。 - 处理动态渲染内容(可选)
部分站点的下载按钮链接是前端JS执行完成后才生成的,静态请求拿到的HTML中只有初始占位链接,这种场景下你可以使用Selenium、Playwright等浏览器自动化工具加载页面,等待JS执行完成后再提取下载链接,就能拿到和浏览器侧完全一致的结果。
参考修改代码
import requests from bs4 import BeautifulSoup # 替换为你自己浏览器中对应请求的请求头参数 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Referer": "https://2lib.org/", # 可选:填入你从浏览器中复制的2lib站点Cookie "Cookie": "xxx" } # 用Session维持会话,保证后续请求共用同一份会话信息 session = requests.Session() session.headers.update(headers) URL = 'https://2lib.org/book/1844071/8add88/' page = session.get(URL) soup = BeautifulSoup(page.content, 'lxml') for tag in soup.select('a.btn-primary.dlButton.addDownloadedBook'): print(f"https://2lib.org{tag['href']}")
内容的提问来源于stack exchange,提问作者John Duck
相关产品推荐
相关产品推荐

