Я пытаюсь сохранить копию проекта pyparsing
на wikispaces.com
до того, как в конце месяца они опустят вики-пространства.
Это кажется странным (возможно, моя версия Google не работает ^ _ ^), но я не могу найти примеры дублирования / копирования сайта.То есть, если посмотреть на браузер.У SO есть this и this по теме, но они просто сохраняют текст, строго структуру HTML / DOM для сайта.Если я не ошибаюсь, эти ответы не сохраняют изображения / файлы заголовочных ссылок / javascript и связанную информацию, необходимую для отображения страницы.Дальнейшие примеры, которые я видел, больше связаны с извлечением частей страницы, а не с дублированием их как есть.
Мне было интересно, имел ли кто-нибудь опыт такого рода вещей или мог бы указать мне на полезный блог /Док где-то.Я использовал WinHTTrack
в прошлом, но маршрут 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)
Попытка сделать то же самое с пауком карты сайта похожаПервая ссылка SO обеспечивает реализацию с простым пауком.
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
Также я обнаружил, что ссылки* Сохраненные <a href="...">...</a>
не указывают на правильные относительные пути.По крайней мере, при открытии сохраненных файлов ссылки указывают на путь относительно жесткого диска, а не относительно файла.При открытии страницы через http.server
ссылки указывают на мертвые места, предположительно, расширение .html
является проблемой здесь.Может потребоваться переназначить / заменить ссылки в сохраненной структуре.