使用Scrapy爬取Project Euler网站的优化实现方案咨询
Hey there! 针对你想用Scrapy爬取Project Euler题目并生成JSON的需求,我整理了一套简洁高效的实现方案,刚好贴合你只抓取ID、标题、内容的核心需求,避开那些复杂冗余的代码:
1. 快速初始化Scrapy项目
首先创建项目并进入目录:
scrapy startproject euler_scraper cd euler_scraper
2. 定义数据结构(可选但规范)
在euler_scraper/items.py里定义我们需要的字段,让数据结构更清晰:
import scrapy class EulerProblemItem(scrapy.Item): problem_id = scrapy.Field() title = scrapy.Field() content = scrapy.Field()
3. 编写核心爬虫代码
在euler_scraper/spiders/euler_spider.py中编写爬虫逻辑,直接生成目标URL并提取关键数据:
import scrapy from euler_scraper.items import EulerProblemItem import re class EulerSpider(scrapy.Spider): name = 'euler' allowed_domains = ['projecteuler.net'] # 这里设置要爬取的题目范围,比如1到100,按需调整 start_urls = [f'https://projecteuler.net/problem={i}' for i in range(1, 101)] def parse(self, response): # 从页面h2标签提取题目ID和标题 h2_text = response.css('h2::text').get() problem_id = re.search(r'Problem (\d+)', h2_text).group(1) title = h2_text.split(' - ')[1] # 提取题目内容,合并所有文本并去除多余空格 content = ' '.join(response.css('div.problem_content *::text').getall()).strip() # 组装数据并返回 item = EulerProblemItem() item['problem_id'] = problem_id item['title'] = title item['content'] = content yield item
4. 配置爬虫礼仪(重要)
在euler_scraper/settings.py里添加基础配置,避免被服务器限制:
# 设置模拟浏览器的User-Agent USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' # 设置下载延迟,遵守爬虫礼仪 DOWNLOAD_DELAY = 2
5. 运行爬虫并导出JSON
直接用Scrapy自带的Feed Exports功能导出JSON,不需要写额外的Pipeline代码:
scrapy crawl euler -o euler_problems.json
这样你就能得到一个包含所有目标数据的JSON文件,后续直接用AJAX加载到本地网页就可以了。这个方案的优势在于:
- 用Scrapy原生的Feed Exports替代自定义Pipeline,减少冗余代码
- 直接生成目标URL,省去爬取列表页的额外步骤(如果需要爬取所有题目,也可以先爬列表页获取所有ID再生成URL,按需调整)
- 用CSS选择器+简单正则提取数据,逻辑清晰易维护
内容的提问来源于stack exchange,提问作者Lore
相关产品推荐
相关产品推荐

