Использование scrapy для извлечения необработанного HTML-содержимого большого (r) целевого числа страниц - PullRequest
0 голосов
/ 12 февраля 2019

Для проекта классификации мне нужен необработанный HTML-контент примерно 1000 веб-сайтов.Мне нужна только целевая страница и не более, поэтому сканер не должен переходить по ссылкам!Я хочу использовать скрап для этого, но не могу собрать код.Поскольку я прочитал в документации, что файлы JSON сначала сохраняются в памяти, а затем сохраняются (что может вызвать проблемы при сканировании большого количества страниц), я хочу сохранить файл в формате «.js».Я использую запрос Anaconda для выполнения своего кода.

Я хочу, чтобы в результирующем файле было два столбца, один с именем домена, а второй с содержимым raw_html на каждом сайте

domain, html_raw
 ..., ...
 ..., ...

Я нашел много примеров Spider, но я не могу понять, как собрать все воедино.Вот как далеко я продвинулся: (

Запустите проект:

scrapy startproject dragonball

Действительный паук (который может быть совершенно неверным):

import scrapy

class DragonSpider(scrapy.Spider):
    name = "dragonball"

    def start_requests(self):
        urls = [
            'https://www.faz.de',
            'https://www.spiegel.de',
            'https://www.stern.de',
            'https://www.brandeins.de',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        ???

Я перехожу кПапка дракона и выполните файл с:

scrapy crawl dragonball -o dragonball.jl

Каждая помощь будет оценена по достоинству:)

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Если вы действительно хотите сохранить все в одном файле, вы можете использовать следующее (включая часть ответа vezunchik):

    def parse(self, response):
        yield {
            'domain': urlparse(response.url).netloc,
            'html_raw': response.body.decode('utf-8'),
        }

Как уже упоминалось, это не очень хорошая идея вв долгосрочной перспективе, в результате вы получите огромный файл.

0 голосов
/ 12 февраля 2019

Советую хранить html в файлах и записывать имена файлов в csv.Хранить данные в формате domain, html_raw.

будет проще. Вы можете загружать файлы с общим with open('%s.html' % domain, 'w') as f: f.write(response.body) или загружать их с помощью конвейера FILES, см. Документацию здесь: https://docs.scrapy.org/en/latest/topics/media-pipeline.html

Домен, который выможно получить с:

from urllib.parse import urlparse
domain = urlparse(response.url).netloc
...