【问题标题】:Scrapy: How to reproduce results without downloading the html again?Scrapy:如何在不再次下载html的情况下重现结果?
【发布时间】:2017-06-20 05:17:17
【问题描述】:

使用 Scrapy 将 HTML 下载到我的硬盘后(例如,使用带有字段 HTML 的内置项目导出器,或将所有 HTML 文件存储到一个文件夹),我如何使用 Scrapy 再次从我的硬盘读取数据并在管道中执行下一步?有没有类似 Item Importer 的东西?

【问题讨论】:

  • 不是关于“项目导入器”的真正anwser,但HTTPCACHE_ENABLED=True(默认情况下)激活基于文件系统的 HTTP 响应缓存,因此您可以毫不费力地重播抓取。跨度>
  • 我不喜欢 httpcache 的地方在于它存储了数千个文件,而且它们不是人类可读的。我更喜欢一个单一的、人类可读的文件。

标签: python web-scraping scrapy reproducible-research


【解决方案1】:

如果 HTML 页面存储在您运行 Scrapy 的本地 PC 上,您可以像这样抓取 URI:

file:///tmp/page1.html

使用 Scrapy。在这个例子中,我假设一个这样的页面存储在文件/tmp/page1.html中。

第二种选择是使用任何方式获取文件内容并手动构建Selector 对象,如下所示:

import scrapy

# read the content of the page into page_content variable
root_sel = scrapy.Selector(text=page_content)

然后您可以正常处理root_sel选择器,例如

title = root_sel.css('h1.title').extract_first()

【讨论】:

  • 我尝试了选项 1 来存储所有 URI。问题是某些 URI 包含特殊字符,我的备份解决方案无法处理它们。
  • 关于第二个选项,有没有类似于“scrapy crawl spider -o items.json”的命令行启动spider的方法?
  • 还有像 lxml 或 BeautifulSoup 这样的库可以更好地实现这一点吗?
  • @David 您可以使用通常的scrapy crawl spider 方式与第二个选项。所有内容加载(从存储的 HTML 页面读取)和解析都可以在 start_requests 方法内的循环中进行。
猜你喜欢
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2023-04-04
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多