用requests+BeautifulSoup能快速抓取静态新闻列表页,但对JS渲染页面会失败,因requests仅获取初始HTML而不执行JS,导致find_all找不到动态插入的标题。

直接上结论:用 requests + BeautifulSoup 能快速抓取结构清晰的新闻列表页,但对 JavaScript 渲染、反爬验证、分页跳转复杂的站点(如新浪滚动页、部分头条页面)会直接失败——这不是代码写得不对,而是底层机制不支持。
为什么 find_all 找不到标题?常见 DOM 加载问题
很多新闻站首页用 JS 动态插入 h2 或 article 标签,requests.get() 拿到的是初始 HTML,不含渲染后内容。此时 soup.find_all('h2') 返回空列表是正常现象。
- 先用浏览器开发者工具 → Network → 刷一次页面,看「Headers」里 Response 是否真包含目标标题文本;不包含就说明是 JS 渲染
- 若确认是静态 HTML,检查
soup解析是否出错:打印len(soup.body.text),如果极小(比如 - 注意编码:中文站点常返回
gbk或gb2312,response.content直接传给BeautifulSoup即可,别用response.text(可能乱码)
select() 和 find_all() 怎么选?CSS 选择器更稳
当网页 class 名带随机后缀(如 title_abc123)、或结构嵌套深时,find_all(name='div', class_='list-item') 容易漏匹配;select() 支持 CSS 语法,容错更强。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 优先试
soup.select('article h3 a'),比soup.find_all('a', {'class': 'title-link'})更灵活 - 避免硬写 class 名:用
soup.select('div[data-role="news-list"] a[href]')这类带属性的选择器,抗改性好 - 调试时加
print([tag.get('href') for tag in soup.select('a')[:3]])快速验证 selector 是否命中
怎么安全地翻页并去重?别只拼 URL
手动拼 https://xxx.com/news?page=2 看似简单,但很多网站实际用 AJAX 加载、或翻页按钮是 onclick="nextPage()",URL 根本不变。
- 先观察真实翻页行为:Network → 点下一页,找 XHR 请求,提取其 URL 和参数(常含
timestamp或sign) - 去重必须基于 URL,不是标题文本:同一新闻可能在不同栏目重复出现,
set()存url,不是title - 加
time.sleep(1)是底线,但别依赖它防封:有些站会检测请求头中的User-Agent和Accept-Language,缺一不可
真正麻烦的从来不是解析 HTML,而是判断「这个页面到底能不能被 requests 拿到真实内容」——花十分钟看 Network 面板,比写两小时重试逻辑更有效。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










