WebScraping问题:爬取Twitch时soup.find()始终返回None求解答
嘿,我帮你捋清楚这个问题哈~
问题根源分析
Twitch的核心页面内容大多是JavaScript动态渲染出来的!你用requests.get()拿到的只是网站初始的静态HTML框架,那些你在浏览器里能看到的side-nav-card__link这类元素,其实是页面加载完成后由JS动态生成并插入DOM的——所以哪怕你打印soup能看到部分内容,也只是没有动态数据的空壳,BeautifulSoup自然找不到目标元素,换解析器当然解决不了这个问题。
可行解决方案
针对动态渲染的页面,你有两个适合练习的方向:
1. 用浏览器自动化工具模拟真实加载(推荐练手)
用Selenium或Playwright这类工具模拟浏览器打开页面,等JS完全渲染后再抓取内容。这里给你一个Selenium的示例代码:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC URL = 'https://www.twitch.tv' # 配置Chrome无头模式(不想弹出浏览器窗口就启用) chrome_options = Options() chrome_options.add_argument('--headless=new') chrome_options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36') driver = webdriver.Chrome(options=chrome_options) driver.get(URL) # 等待目标元素加载完成,最多等10秒 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'side-nav-card__link')) ) # 获取JS渲染后的完整页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, 'lxml') offline = soup.find('a', {'class':'side-nav-card__link'}) spans = soup.find_all('a') for span in spans: print(span) print(offline) finally: driver.quit()
2. 抓取页面的AJAX接口(进阶技巧)
打开浏览器开发者工具(F12)切换到Network标签,刷新页面后观察XHR/fetch请求,找到Twitch用来加载动态内容的接口,直接请求这些接口拿数据。这种方式效率更高,还能锻炼你分析网络请求的能力。
适合练习的WebScraping项目推荐
既然你想专注练手,给你几个不错的选题:
- 静态博客/新闻站:比如爬取Medium公开文章、新闻站点的列表页,练BeautifulSoup基础解析
- 小型电商页面:提取商品名称、价格、图片链接,练习结构化数据抓取
- 论坛板块:比如Reddit公开板块的帖子标题、作者、点赞数(记得遵守网站robots协议)
- 天气网站:爬取本地未来一周的天气预报,练习解析表格类内容
内容的提问来源于stack exchange,提问作者Elefrea Green
相关产品推荐
相关产品推荐

