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