如何使用Scrapy实现网站多页循环爬取并提取博客链接?
问题解答
你原来的实现逻辑完全可以复用,甚至可以继续在Scrapy的解析流程里使用BeautifulSoup做页面解析,不需要强制切换到Scrapy自带的选择器。区别在于Scrapy内置了异步请求调度、自动重试、链接去重、并发控制等能力,不需要你自己手动写循环发请求、维护存储链接的外部列表。
具体实现可以参考以下Scrapy蜘蛛代码:
import scrapy from bs4 import BeautifulSoup import re class BrookingsBlogSpider(scrapy.Spider): name = 'brookings_blog' # 和你原代码的基础URL保持一致 base_url = 'https://www.brookings.edu/topic/environment/page/' def start_requests(self): # 对应原代码的for循环生成10页列表页请求,原range(1,10)仅生成1-9共9页,要爬10页调整为range(1,11)即可 for page in range(1, 11): list_url = f"{self.base_url}{page}/?type=posts" yield scrapy.Request(url=list_url, callback=self.parse_list_page) def parse_list_page(self, response): # 直接复用你原有的BeautifulSoup解析逻辑即可 soup = BeautifulSoup(response.text, 'lxml') links = [link['href'] for link in soup.find_all('a', href=re.compile('^(https://www.brookings.edu/blog/)'))] # 去重逻辑和原代码一致 links = list(set(links)) # 无需手动维护lis列表,直接将文章链接生成请求交给Scrapy调度 for article_url in links: yield scrapy.Request(url=article_url, callback=self.parse_article_content) def parse_article_content(self, response): # 此处可继续用BeautifulSoup实现你原有的正文提取逻辑 soup = BeautifulSoup(response.text, 'lxml') # 示例提取字段,可根据自己的需求调整解析规则 article_title = soup.find('h1').get_text(strip=True) if soup.find('h1') else '' article_content = soup.find('div', class_='post-body').get_text(strip=True) if soup.find('div', class_='post-body') else '' # 直接返回爬取结果,Scrapy支持一键导出为json、csv等格式 yield { 'title': article_title, 'url': response.url, 'content': article_content }
注意事项
- 代码运行前需要先安装对应的依赖:
pip install scrapy beautifulsoup4 lxml - 你可以根据自己的需求调整正文提取的规则,不需要强制使用Scrapy的XPath/CSS选择器,原有BeautifulSoup的解析逻辑可以直接复用
- Scrapy默认会自动对请求去重,不需要额外做重复请求的过滤处理
内容的提问来源于stack exchange,提问作者user14079786
相关产品推荐
相关产品推荐

