Scrapy:保存网站

Scrapy:保存网站,scrapy,scrapy-spider,archiving,Scrapy,Scrapy Spider,Archiving,我正试图在他们在月底关闭wikispaces之前,在wikispaces.com上保存一份pyparsing项目的副本 这看起来很奇怪(也许我的谷歌版本坏了),但我找不到任何复制网站的例子。也就是说,当一个人在浏览器上查看它时。在这个主题上也有和,但他们只是在为站点保存文本,严格地说是HTML/DOM结构。除非我弄错了,否则这些asnwer似乎不会保存呈现页面所需的图像/标题链接文件/javascript和相关信息。我看到的更多示例更关注于提取页面的部分内容,而不是按原样复制 我想知道是否有人对

我正试图在他们在月底关闭wikispaces之前,在
wikispaces.com
上保存一份
pyparsing
项目的副本

这看起来很奇怪(也许我的谷歌版本坏了),但我找不到任何复制网站的例子。也就是说,当一个人在浏览器上查看它时。在这个主题上也有和,但他们只是在为站点保存文本,严格地说是HTML/DOM结构。除非我弄错了,否则这些asnwer似乎不会保存呈现页面所需的图像/标题链接文件/javascript和相关信息。我看到的更多示例更关注于提取页面的部分内容,而不是按原样复制

我想知道是否有人对这类事情有任何经验,或者可以给我指一个有用的博客/文档。我过去曾使用过
winhtrack
,但
robots.txt
pyparsing.wikispaces.com/auth/
路由阻止它正常运行,我想我在这方面会获得一些
scrapy
经验

对于那些有兴趣的人来说,看看我到目前为止都做了些什么。这是我的爬行蜘蛛实现,它确认了
robots.txt
文件

import scrapy
from scrapy.spiders import SitemapSpider
from urllib.parse import urlparse
from pathlib import Path
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class PyparsingSpider(CrawlSpider):
 name = 'pyparsing'
 allowed_domains = ['pyparsing.wikispaces.com']
 start_urls = ['http://pyparsing.wikispaces.com/']

 rules = (
     Rule(LinkExtractor(), callback='parse_item', follow=True),
 )

 def parse_item(self, response):
#   i = {}
#   #i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
#   #i['name'] = response.xpath('//div[@id="name"]').extract()
#   #i['description'] = response.xpath('//div[@id="description"]').extract()
#   return i
  page = urlparse(response.url)
  path = Path(page.netloc)/Path("" if page.path == "/" else page.path[1:])
  if path.parent : path.parent.mkdir(parents = True, exist_ok=True) # Creates the folder
  path = path.with_suffix(".html")
  with open(path, 'wb') as file:
   file.write(response.body)
使用站点地图爬行器尝试同样的事情也是类似的。第一个链接提供了一个带有普通spider的实现

import scrapy
from scrapy.spiders import SitemapSpider
from urllib.parse import urlparse
from pathlib import Path

class PyParsingSiteMap(SitemapSpider) :

 name = "pyparsing"
 sitemap_urls = [ 
                  'http://pyparsing.wikispaces.com/sitemap.xml', 
#                   'http://pyparsing.wikispaces.com/robots.txt', 
                ]
 allowed_domains = ['pyparsing.wikispaces.com']
 start_urls = ['http://pyparsing.wikispaces.com'] # "/home"
 custom_settings = {
  "ROBOTSTXT_OBEY" : False
 }

 def parse(self, response) :
  page = urlparse(response.url)
  path = Path(page.netloc)/Path("" if page.path == "/" else page.path[1:])
  if path.parent : path.parent.mkdir(parents = True, exist_ok=True) # Creates the folder
  path = path.with_suffix(".html")
  with open(path, 'wb') as file:
   file.write(response.body) 
这些爬行器收集的内容都不超过HTML结构


我还发现,保存的链接,
,似乎没有指向正确的相对路径。至少,打开保存的文件时,链接指向相对于硬盘驱动器的路径,而不是相对于文件的路径。当通过
http.server
打开一个页面时,链接指向死位置,这里的问题大概是
.html
扩展。可能需要重新映射/替换存储结构中的链接。

Pyparsing不再托管在wikispaces.com上。去吧,我最后没有让蜘蛛工作,所以我很高兴它搬到了Github。顺便说一句,这真是个不错的图书馆。我一直在编写一个PyQt应用程序来绘制一个使用PyLens生成的解析器/语法树,代码仍然很粗糙,但如果您感兴趣,我会在稍微整洁一点的时候发布它。如果您这样做,在绘制图形之前,在顶层元素上调用
streamline()
,这将整合
和([And([a,B])等元素,C]),D])
(由连续的“+”操作创建)到
和([A,B,C,D])