如何使用Scrapy爬取本地目录下所有.html文件中的数据
问题原因
你当前的start_urls指向的是本地文件夹路径,Scrapy请求该路径只会返回文件夹的目录索引页面,不会自动读取内部的HTML文件内容。
实现方案
我们可以通过start_requests方法遍历本地文件夹下的所有.html文件,生成对应的file://协议请求,再逐个解析每个HTML文件的内容,修改后代码如下:
import scrapy import os LOCAL_FOLDER = 'html_files/' BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) HTML_FOLDER_PATH = os.path.join(BASE_DIR, LOCAL_FOLDER) class MySpider(scrapy.Spider): name = 'mySpider' def start_requests(self): # 遍历目标文件夹下的所有文件 for filename in os.listdir(HTML_FOLDER_PATH): # 过滤出html文件 if not filename.endswith('.html'): continue file_abs_path = os.path.join(HTML_FOLDER_PATH, filename) # 转为scrapy支持的file协议url yield scrapy.Request(f"file://{file_abs_path}", callback=self.parse) def parse(self, response): # 这里写你的解析逻辑即可,response对应单个html文件的内容 rows = response.xpath('//div[@class="data"]//tbody/tr') self.logger.info(f"当前处理文件:{response.url},匹配到数据行:{len(rows)}") # 提取数据返回示例 for row in rows: yield { # 可根据你的实际需求调整XPath提取规则 'col1': row.xpath('./td[1]/text()').get(), 'col2': row.xpath('./td[2]/text()').get() }
补充说明
- 如果你的
html_files下还有嵌套的子文件夹,可将os.listdir替换为os.walk递归遍历所有层级的html文件 - Windows系统下代码会自动生成符合要求的带盘符的
file:///格式路径,无需额外适配 - 本地文件请求无反爬限制,可直接运行无需调整Scrapy的延迟、UA等反爬配置
内容的提问来源于stack exchange,提问作者finite_diffidence
相关产品推荐
相关产品推荐

