Запуск Scrapy в Spyder / Anaconda - паук работает / CrawlSpider не работает - PullRequest
0 голосов
/ 10 июля 2020

Я только начал использовать Scrapy. Мне удалось успешно написать и запустить scrapy.Spider, но при этом возникли проблемы, поэтому я начал изучать CrawlSpider.

К сожалению, когда я хочу запустить CrawlSpider с помощью Spyder, скрипт запускается и завершается без исключение и ничего не поцарапав. Не уверен, почему это происходит.

Следующий сценарий работает, но выдает исключения для некоторых страниц, которые я не смог исправить. Кроме того, поскольку нет внутренних правил, первый пакет ссылок не фильтруется и, следовательно, попробуйте очистить ссылки, которые ссылаются на файлы, такие как PDF.

import scrapy
from scrapy.crawler import CrawlerProcess
import re

class ScraperWithLimit(scrapy.Spider):
    name = "ScraperWithLimit"
    allowed_domains = ['wordperfect.com']
    start_urls = [
        'https://www.wordperfect.com/en/'
    ]
    
    custom_settings = {
        'DEPTH_LIMIT': 5
    }
    
    def parse(self, response):
        #for next_page in response.css('a'):
        for next_page in response.selector.xpath('//a[not(contains(@href, "#")) and not(contains(@href, "mailto"))and not(contains(@href, "javascript")) and string-length(normalize-space(@href)) > 0]'):
            if next_page is not None:
                m = re.search(r"""(?i)\.(?:mng|pct|bmp|gif|jpg|jpeg|png|pst|psp|tif|tiff|ai|drw|dxf|eps|ps|svg|mp3|wma|ogg|wav|ra|aac|mid|au|aiff|3gp|asf|asx|avi|mov|mp4|mpg|qt|rm|swf|wmv|m4a|m4v|xls|xlsx|ppt|pptx|pps|doc|docx|odt|ods|odg|odp|css|pdf|exe|bin|rss|zip|rar)$""", next_page.get())
                if m == None:
                    yield response.follow(next_page, self.parse)
        
        body_text_list_raw = response.selector.xpath('//body//text()[not(parent::script) and not(parent::noscript) and string-length(normalize-space(.)) > 0]').getall()
        body_text_list = [re.sub(r"\s\s+", " ", re.sub(r"(?:\\(?:r|n|t|f|v))+", "", i)).strip() for i in body_text_list_raw]
            
        body_text_full = ' '.join(body_text_list)
        
        obj = {"url": response.request.url}
        obj['output'] = {"body_text_list": body_text_list,
                         "body_text_full": body_text_full}
        yield obj

process = CrawlerProcess(settings={
    "FEEDS": {
        "items.json": {"format": "json"},
    },
})

process.crawl(ScraperWithLimit)
process.start() # the script will block here until the crawling is finished

Когда я запускаю тот же код с помощью CrawlSpider, он инициирует , записывает несколько строк журнала и завершает работу, ничего не делая. Понятия не имею, почему:

import scrapy
from scrapy.crawler import CrawlerProcess
import re
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class MySpider(CrawlSpider):
    name = 'crawler'
    allowed_domains = ['wordperfect.com']
    start_urls = ['https://www.wordperfect.com/en/']
    
    custom_settings = {
        'DEPTH_LIMIT': 5
    }

    rules = (
        Rule(LinkExtractor(deny=('(?:#|^mailto|javascript)'), deny_extensions=()), callback='parse_item', follow=True)
    )

    def parse_item(self, response):
        body_text_list_raw = response.selector.xpath('//body//text()[not(parent::script) and not(parent::noscript) and string-length(normalize-space(.)) > 0]').getall()
        body_text_list = [re.sub(r"\s\s+", " ", re.sub(r"(?:\\(?:r|n|t|f|v))+", "", i)).strip() for i in body_text_list_raw]
            
        body_text_full = ' '.join(body_text_list)
        
        obj = {"url": response.request.url}
        obj['output'] = {"body_text_list": body_text_list,
                         "body_text_full": body_text_full}
        return obj
            
process = CrawlerProcess(settings={
    "FEEDS": {
        "items.json": {"format": "json"},
    },
})

process.crawl(MySpider)
process.start() # the script will block here until the crawling is finished

Результат:

2020-07-10 07:00:25 [scrapy.utils.log] INFO: Scrapy 2.2.0 started (bot: scrapybot)
2020-07-10 07:00:25 [scrapy.utils.log] INFO: Versions: lxml 4.4.1.0, libxml2 2.9.9, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted 20.3.0, Python 3.7.3 (default, Mar 27 2019, 17:13:21) [MSC v.1915 64 bit (AMD64)], pyOpenSSL 19.0.0 (OpenSSL 1.1.1g  21 Apr 2020), cryptography 2.8, Platform Windows-10-10.0.18362-SP0
2020-07-10 07:00:25 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor
2020-07-10 07:00:25 [scrapy.crawler] INFO: Overridden settings:
{}
2020-07-10 07:00:25 [scrapy.extensions.telnet] INFO: Telnet Password: /password/ (not sure what this is...)
2020-07-10 07:00:25 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.feedexport.FeedExporter',
 'scrapy.extensions.logstats.LogStats']
...