无需Selenium/BS4,用Python获取TechCrunch更多文章的方法
解决Techcrunch加载更多文章的爬取方案
不用Selenium的话,核心是抓包分析网站的AJAX加载接口,用requests模拟请求获取隐藏内容,步骤如下:
1. 抓包分析加载逻辑
打开浏览器开发者工具(F12),切换到Network标签,过滤「XHR/Fetch」类型请求:
- 点击页面的「加载更多」按钮,观察新出现的请求,找到返回后续文章的接口(通常是类似
/wp-json/tc/v1/more-posts的API端点) - 记录请求的URL、请求参数(比如
cursor分页标识)、请求头(尤其是User-Agent、Referer) - 查看响应内容,确认是包含文章HTML片段的JSON,还是直接返回HTML
2. 用requests模拟请求实现批量获取
以下是可参考的代码示例(需根据实际抓包结果调整参数):
import requests from bs4 import BeautifulSoup import time # 模拟浏览器请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Referer': 'https://techcrunch.com/' } base_url = 'https://techcrunch.com' # 替换为抓包得到的加载更多接口URL load_more_api = 'https://techcrunch.com/wp-json/tc/v1/more-posts' article_links = [] # 第一步:获取首页的20篇文章链接及初始cursor response = requests.get(base_url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 提取首页文章链接 for article in soup.select('article.post-block'): link_tag = article.find('a', class_='post-block__title__link') if link_tag: article_links.append(link_tag['href']) # 提取初始cursor(从页面JS变量中获取,需根据实际源码调整) cursor = None for script in soup.select('script'): if 'tc_more_posts_cursor' in script.text: cursor = script.text.split('tc_more_posts_cursor = "')[1].split('";')[0] break # 第二步:循环请求加载更多,直到收集满100篇 while len(article_links) < 100 and cursor: # 替换为抓包得到的请求参数 params = {'cursor': cursor, 'page': '1'} try: api_response = requests.get(load_more_api, headers=headers, params=params) api_response.raise_for_status() data = api_response.json() except Exception as e: print(f"请求失败: {e}") break # 解析接口返回的文章HTML片段 more_soup = BeautifulSoup(data['html'], 'html.parser') for article in more_soup.select('article.post-block'): link_tag = article.find('a', class_='post-block__title__link') if link_tag: article_links.append(link_tag['href']) if len(article_links) >= 100: break # 更新cursor为下一页标识 cursor = data.get('next_cursor') # 加延迟避免触发反爬 time.sleep(1) # 第三步:保存文章HTML或转换为PDF for idx, link in enumerate(article_links[:100], 1): article_res = requests.get(link, headers=headers) # 保存HTML with open(f'techcrunch_article_{idx}.html', 'w', encoding='utf-8') as f: f.write(article_res.text) # 若要转PDF,可使用pdfkit(需提前安装wkhtmltopdf) # import pdfkit # pdfkit.from_url(link, f'techcrunch_article_{idx}.pdf')
关键注意事项
- 抓包时务必确认请求参数和请求头的完整性,部分网站会校验
Referer或X-WP-Nonce等字段 - 若遇到反爬,可增加请求延迟、轮换
User-Agent - 页面选择器(如
article.post-block)可能随网站更新变化,需根据实际页面结构调整
内容的提问来源于stack exchange,提问作者Math and Coding
相关产品推荐
相关产品推荐

