Scrapy: сохранение сайта - PullRequest
       13

Scrapy: сохранение сайта

0 голосов
/ 10 июня 2018

Я пытаюсь сохранить копию проекта 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 является проблемой здесь.Может потребоваться переназначить / заменить ссылки в сохраненной структуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...