如何使用Scrapy爬取带有「加载更多」功能网站的全量帖子数据
Scrapy全量爬取实现方案
原有代码问题
next_page提取逻辑错误:response.css('div.autoload_continue').get()获取的是div标签的完整HTML内容,不是分页跳转链接,且该逻辑写在帖子遍历循环内部,会重复发起无效请求- 没有匹配站点的分页规则:该站点分页通过URL参数
curpg控制,第一页无参数,第二页为?curpg=2,后续页码依次递增,没有直接暴露的静态下一页链接
修改后的可运行代码
import scrapy class PostsSpider(scrapy.Spider): name = "posts" # 起始页码 cur_page = 1 base_url = 'https://economictimes.indiatimes.com/markets/stocks/recos' def start_requests(self): yield scrapy.Request(self.base_url, callback=self.parse) def parse(self, response): # 先提取当前页所有帖子 post_list = response.css('div.eachStory') # 如果当前页没有帖子,说明已经爬完所有页,直接终止 if not post_list: return for post in post_list: yield { 'title': post.css('a::text').get().strip(), 'date': post.css('time::text').get().strip() } # 构造下一页请求 self.cur_page += 1 next_page_url = f'{self.base_url}?curpg={self.cur_page}' yield scrapy.Request(next_page_url, callback=self.parse)
使用说明
- 执行爬取导出CSV时,可指定编码避免乱码,命令为:
scrapy crawl posts -o posts.csv -s FEED_EXPORT_ENCODING=utf-8 - 可在项目
settings.py中配置DOWNLOAD_DELAY = 1,设置1秒下载延迟,避免请求频率过高被站点封禁 - 若遇到反爬拦截,可在
settings.py中修改USER_AGENT为常用浏览器UA,降低被识别概率
内容的提问来源于stack exchange,提问作者Nero
相关产品推荐
相关产品推荐

