Scrapy Splas Spider не переходит по ссылкам для получения новых страниц - PullRequest
0 голосов
/ 25 февраля 2019

Я получаю данные со страницы, которая использует Javascript для ссылки на новые страницы.Я использую Scrapy + splash для получения этих данных, однако по какой-то причине ссылки не отслеживаются.

Вот код моего паука:

import scrapy
from   scrapy_splash import SplashRequest       

script = """
    function main(splash, args)
        local javascript = args.javascript
        assert(splash:runjs(javascript))
        splash:wait(0.5)

        return {
               html = splash:html()
        }
    end
"""


page_url = "https://www.londonstockexchange.com/exchange/prices-and-markets/stocks/exchange-insight/trade-data.html?page=0&pageOffBook=0&fourWayKey=GB00B6774699GBGBXAMSM&formName=frmRow&upToRow=-1"


class MySpider(scrapy.Spider):
    name = "foo_crawler"          
    download_delay = 5.0

    custom_settings = {
                'DOWNLOADER_MIDDLEWARES' : {
                            'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
                            'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
                            'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
                            },
                 #'DUPEFILTER_CLASS': 'scrapy.dupefilters.BaseDupeFilter'
                }




    def start_requests(self):
        yield SplashRequest(url=page_url, 
                                callback=self.parse
                            )



    # Parses first page of ticker, and processes all maturities
    def parse(self, response):
        try:
            self.extract_data_from_page(response)

            href = response.xpath('//div[@class="paging"]/p/a[contains(text(),"Next")]/@href')
            print("href: {0}".format(href))

            if href:
                javascript = href.extract_first().split(':')[1].strip()

                yield SplashRequest(response.url, self.parse, 
                                    cookies={'store_language':'en'},
                                    endpoint='execute', 
                                    args = {'lua_source': script, 'javascript': javascript })

        except Exception as err:
            print("The following error occured: {0}".format(err))



    def extract_data_from_page(self, response):
        url = response.url
        page_num = url.split('page=')[1].split('&')[0]
        print("extract_data_from_page() called on page: {0}.".format(url))
        filename = "page_{0}.html".format(page_num)
        with open(filename, 'w') as f:
            f.write(response.text)




    def handle_error(self, failure):
        print("Error: {0}".format(failure))

Только первыйстраница выбрана, и я не могу получить последующие страницы, «щелкнув» по ​​ссылкам внизу страницы.

Как это исправить, чтобы я мог щелкать по страницам, указанным внизустраницы?

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Вы можете использовать переменную строки запроса page.Начинается с 0, поэтому первая страница - page=0.Вы можете проверить общее количество страниц, просмотрев:

<div class="paging">
  <p class="floatsx">&nbsp;Page 1 of 157 </p>
</div>

Таким образом, вы знаете, как называть страницы 0-156.

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

Ваш код выглядит нормально, единственное, что полученные запросы имеют одинаковый URL-адрес, поэтому дублирующий фильтр игнорирует их.Просто раскомментируйте DUPEFILTER_CLASS и попробуйте снова.

custom_settings = {
    ...
    'DUPEFILTER_CLASS': 'scrapy.dupefilters.BaseDupeFilter',
}

РЕДАКТИРОВАТЬ: чтобы просматривать страницы данных без запуска javascript, вы можете сделать так:

page_url = "https://www.londonstockexchange.com/exchange/prices-and-markets/stocks/exchange-insight/trade-data.html?page=%s&pageOffBook=0&fourWayKey=GB00B6774699GBGBXAMSM&formName=frmRow&upToRow=-1"

page_number_regex = re.compile(r"'frmRow',(\d+),")
...
def start_requests(self):
    yield SplashRequest(url=page_url % 0,
                        callback=self.parse)
...
if href:
    javascript = href.extract_first().split(':')[1].strip()
    matched = re.search(self.page_number_regex, javascript)
    if matched:
        yield SplashRequest(page_url % matched.group(1), self.parse,
                            cookies={'store_language': 'en'},
                            endpoint='execute',
                            args={'lua_source': script, 'javascript': javascript})

Я с нетерпением жду решенияиспользуя javascript, хотя.

...