如何用Scrapy爬取Aparat站热门板块超1000条视频链接?
如何获取Aparat网站“داغ ترین ها”板块1000+视频链接
你的问题很典型——静态爬取首页只能拿到初始加载的内容,而这个板块的更多视频是通过**滚动加载(AJAX异步请求)**来补充的,所以只爬首页只能拿到约60条。下面是具体的解决思路和代码修改方案:
1. 先分析网站的加载机制
打开浏览器开发者工具(F12),切换到「Network」→「XHR」标签,然后滚动“داغ ترین ها”板块的页面,你会发现每次滚动到底部,网站会发送一个AJAX请求到类似这样的接口:
https://www.aparat.com/etc/api/videoByCat/cat/mostviewed?page=2&perpage=30
这个接口返回的是JSON格式的数据,里面包含了该分页的所有视频信息,包括链接、标题等。参数说明:
page:当前分页页码(从1开始)perpage:每页返回的视频数量(默认30,你可以尝试调整,但不要太大避免触发反爬)
2. 修改Scrapy代码,批量请求分页接口
我们可以直接请求这个API接口,循环生成不同页码的请求,直到拿到超过1000条链接。这样比解析HTML更高效,也更容易控制数量。
修改后的代码示例:
import scrapy import json class AparatSpider(scrapy.Spider): name = 'aparatspider' # 初始请求第1页,perpage设为30 start_urls = ['https://www.aparat.com/etc/api/videoByCat/cat/mostviewed?page=1&perpage=30'] # 目标数量,这里设为1000 target_count = 1000 current_count = 0 current_page = 1 def parse(self, response): # 解析JSON响应 data = json.loads(response.text) videos = data.get('video', []) for video in videos: # 提取视频链接(用uid拼接直接链接,比解析onmousedown更可靠) video_url = f"https://www.aparat.com/v/{video['uid']}" self.current_count += 1 yield {'video_url': video_url} # 达到目标数量就停止爬取 if self.current_count >= self.target_count: return # 如果还没达到目标,继续请求下一页 self.current_page += 1 next_url = f"https://www.aparat.com/etc/api/videoByCat/cat/mostviewed?page={self.current_page}&perpage=30" yield scrapy.Request(next_url, callback=self.parse)
3. 注意事项
- 反爬应对:不要请求太频繁,Scrapy默认的并发设置已经比较合理,若遇到403/503错误,可以在
settings.py中添加请求头(比如自定义User-Agent),或者设置下载延迟:DOWNLOAD_DELAY = 2。 - 参数调整:部分网站会限制
perpage的最大值,你可以测试调整这个参数(比如设为50)来减少请求次数,但不要超过网站允许的范围。 - 链接可靠性:API返回的
uid是视频的唯一标识,拼接成的链接比从onmousedown属性中提取的更稳定,不容易因为前端代码变动失效。
这样修改后,你的爬虫会自动请求分页接口,直到获取到1000条以上的视频链接。
内容的提问来源于stack exchange,提问作者Reyhaneh Khalili
相关产品推荐
相关产品推荐

