Scrapy-Splash извлекает недостаточно текста - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь извлечь текст из реферата журнала IEEE с помощью Scrapy.
Целевой URL: https://ieeexplore.ieee.org/document/4383371/
ОС - Windows10, а Chrome используется для указания XPath для очистки.

Код выглядит следующим образом.

# -*- coding: utf-8 -*-
import scrapy, time, json, requests, urllib.request, datetime
from scrapy_splash import SplashRequest
from scrapy.crawler import CrawlerProcess
from fake_useragent import UserAgent

'''main code begins'''
class IEEE_proc_Item(scrapy.Item):
    abstract = scrapy.Field()
    URL = scrapy.Field()

class IeeeProcScraperSpider(scrapy.Spider):
    name = 'ieee_proc_scraper'
    allowed_domains = ['ieeexplore.ieee.org']

    start_urls = ['https://ieeexplore.ieee.org/document/7067026/',
                  ]

def start_requests(self):
    for url in self.start_urls:
        yield SplashRequest(url=url, callback=self.parse, args={'wait': 1},
                            errback=lambda failure, item=IEEE_proc_Item(): self._errorback(failure, item))

    def parse(self, response):
        item = IEEE_proc_Item()

        try:
            item['abstract'] = response.xpath('//p/text()').extract()
        except:
            item['abstract'] = 'None'

        try:
            item['URL'] = response.url
        except:
            item['URL'] = 'None'  
        yield item

    def _errorback(self, failure, item):
        pass

process = CrawlerProcess({
    'USER_AGENT': UserAgent().chrome,
    'FEED_FORMAT': 'json',
    'FEED_EXPORT_ENCODING': 'utf-8',
    'FEED_EXPORT_FIELDS': ['abstract', 'URL'],
    'FEED_URI': 'Test.json',
    })

process.crawl(IeeeProcScraperSpider)
process.start()

'''main code ends'''

На самом деле, в целевом URL абстрактный документ имеет уникальный путь HTML, как показано ниже, однако я пытаюсь извлечь весь текст втег <div> для простоты, потому что абстрактный текст явно помечен <div>.

Actual Xpath: //*[@id="4383371"]/div[2]/div[1]/div/div/div

Однако я получаю неожиданный вывод в виде следующего:
Вывод

2018-09-15 00:29:37 [scrapy.utils.log] INFO: Scrapy 1.5.0 started (bot: scrapybot)
2018-09-15 00:29:37 [scrapy.utils.log] INFO: Versions: lxml 4.1.1.0, libxml2 2.9.7, cssselect 1.0.3, parsel 1.4.0, w3lib 1.19.0, Twisted 18.4.0, Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)], pyOpenSSL 17.5.0 (OpenSSL 1.0.2k  26 Jan 2017), cryptography 2.1.4, Platform Windows-10-10.0.17134-SP0
2018-09-15 00:29:37 [scrapy.crawler] INFO: Overridden settings: {'FEED_EXPORT_ENCODING': 'utf-8', 'FEED_EXPORT_FIELDS': ['abstract', 'URL'], 'FEED_FORMAT': 'json', 'FEED_URI': 'Test.json', 'USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17'}
2018-09-15 00:29:37 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.feedexport.FeedExporter',
 'scrapy.extensions.logstats.LogStats']
2018-09-15 00:29:37 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2018-09-15 00:29:37 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2018-09-15 00:29:37 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2018-09-15 00:29:37 [scrapy.core.engine] INFO: Spider opened
2018-09-15 00:29:37 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2018-09-15 00:29:37 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2018-09-15 00:29:39 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://ieeexplore.ieee.org/document/4383371/> (referer: None)
2018-09-15 00:29:39 [scrapy.core.scraper] DEBUG: Scraped from <200 https://ieeexplore.ieee.org/document/4383371/>

{'URL': 'https://ieeexplore.ieee.org/document/4383371/',
 'abstract': 'For IEEE to continue sending you helpful information on our '
         'products\r'
         '                and services, please consent to our updated '
         'Privacy Policy.I have read and accepted the.SubscribeA '
         "not-for-profit organization, IEEE is the world's largest "
         'technical professional organization dedicated to advancing '
         'technology for the benefit of humanity.© Copyright 2018 IEEE - '
         'All rights reserved. Use of this web site signifies your '
         'agreement to the terms and conditions.US & Canada:Worldwide:'}
2018-09-15 00:29:39 [scrapy.core.engine] INFO: Closing spider (finished)
2018-09-15 00:29:39 [scrapy.extensions.feedexport] INFO: Stored json feed (1 items) in: IEEE_proc_abstract_1998to2018_180914.json
2018-09-15 00:29:39 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 309,
 'downloader/request_count': 1,
 'downloader/request_method_count/GET': 1,
 'downloader/response_bytes': 57312,
 'downloader/response_count': 1,
 'downloader/response_status_count/200': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2018, 9, 14, 15, 29, 39, 597179),
 'item_scraped_count': 1,
 'log_count/DEBUG': 3,
 'log_count/INFO': 8,
 'response_received_count': 1,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
'scheduler/enqueued/memory': 1,
'start_time': datetime.datetime(2018, 9, 14, 15, 29, 37, 549966)}
2018-09-15 00:29:39 [scrapy.core.engine] INFO: Spider closed (finished)

Scrapy извлекает текст только из нижнего колонтитула.Эти выходные данные выглядят как выходные данные до выполнения JS, но SplashRequest, кажется, работает правильно.
Так что теперь мне интересно, в чем причина и как я могу исправить проблему с этой веб-страницей.

I 'буду очень рад и ценим любые советы, ответы и перспективы по этому вопросу.

...