Как сделать Scrapy общего назначения? - PullRequest
1 голос
/ 18 февраля 2020

Я использую Scrapy для удаления текста с веб-сайтов. Я хотел бы, чтобы Scrapy очищал текст с разных URL-адресов с различной структурой, не меняя код для каждого веб-сайта.

Следующий пример работает в моем блокноте Jupyter для данного URL (http://quotes.toscrape.com/tag/humor/). Но это не работает для другого (например: https://en.wikipedia.org/wiki/Web_scraping). У меня вопрос: как заставить его работать на (большинстве) других сайтов, не проверяя каждый сайт вручную и не меняя код все время? Я думаю, мне нужно внести изменения в def parse(self, response), но пока я не смог найти хороший пример, как это сделать.

Модули:

import scrapy
import scrapy.crawler as crawler
from multiprocessing import Process, Queue
from twisted.internet import reactor

Паук:

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = ['http://quotes.toscrape.com/tag/humor/']

    def parse(self, response):
        for quote in response.css('div.quote'):
            print(quote.css('span.text::text').extract_first())

Оболочка для запуска в Jupyter:

def run_spider(spider):
    def f(q):
        try:
            runner = crawler.CrawlerRunner()
            deferred = runner.crawl(spider)
            deferred.addBoth(lambda _: reactor.stop())
            reactor.run()
            q.put(None)
        except Exception as e:
            q.put(e)

    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    result = q.get()
    p.join()

    if result is not None:
        raise result

Получите результат:

 print('Extracted text:')
 run_spider(QuotesSpider)

Извлеченный текст:

“The person, be it gentleman or lady, who has not pleasure in a good novel, ..."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...