Попытка чтения страниц с разбивкой по страницам asp с помощью scla spla sh in python - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь использовать scrapy и spla sh для извлечения персонала, названий должностей и электронных писем со страницы персонала определенного веб-сайта. https://www.kennedaleisd.net/Page/3884. Я использую spla sh с docker, поскольку электронные письма скрыты за кодом Dynami c javascript.

Паук работает на первой странице персонала, но я не могу заставить его работать на 2-й или 3-й странице. Я открыл инструменты разработчика и скопировал запрос, который отправляется, когда вы нажимаете одну из ссылок на страницы, а затем пытаетесь повторить этот запрос в пауке. Кажется, у меня проблема в том, что ответ на этот запрос возвращает только подмножество кода для всей страницы (только персонал для этой страницы), а не все как в javascript. Поэтому, когда он передается в spla sh, он не имеет необходимого сценария для создания динамического c кода. Я также заметил, что запрос, по-видимому, имеет запись повара ie RedirectTo, которая возвращается на родительскую страницу. Я пытался включить этого повара ie в запросы или передавать файлы cookie из первого запроса на страницы, разбитые на страницы, но, похоже, это не сработало. Я также попытался выполнить некоторые сценарии lua в запросе spla sh, но, похоже, это также не дало мне того, чего я хотел. Ниже я включил паука, как он есть сейчас.

Я не уверен, есть ли какой-нибудь способ повторно использовать javascript с последующими запросами или для пользователя, который каким-либо образом повторно вызывает команду cook ie, чтобы получить остальную часть необходимого кода. Любая помощь будет оценена. Я понимаю, что разбиение на страницы, вероятно, не является правильным способом для l oop просмотра страниц, но я решил, что смогу поработать над этим, как только получу считанные данные.

import scrapy
from scrapy_splash import SplashRequest


class TestSpider(scrapy.Spider):
    name = 'TestSpider'
    start_urls = ['https://www.kennedaleisd.net/Page/3884']

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, self.parse, meta={
                'splash': {
                    'endpoint': 'render.html',
                    'args': {'wait': 0.5}
                }
            })

    def parse(self, response):

        for item in response.css('div.staff'):

            name = item.css('li.staffname::text').get()
            title = item.css('li.staffjob::attr(data-value)').get()
            email = item.css('li.staffemail a::attr(href)').get()
            staffURL = response.request.url

            yield {
                'name': name,
                'title': title,
                'email': email,
                'staffURL': staffURL
            }

        if response.css('a.ui-page-number-current-span::text').get() == '1':
            pagination_results = response.css(
                'li.ui-page-number a:not([class^="ui-page-number-current-span"])::text').getall()

            base_url = 'https://www.kennedaleisd.net//cms/UserControls/ModuleView/ModuleViewRendererWrapper.aspx?DomainID=2042&PageID=3884&ModuleInstanceID=6755&PageModuleInstanceID=7911&Tag=&PageNumber='
            # backend_url = '&RenderLoc=0&FromRenderLoc=0&IsMoreExpandedView=false&EnableQuirksMode=0&Filter=&ScreenWidth=922&ViewID=00000000-0000-0000-0000-000000000000&_=1584114139549'

            for i in pagination_results:

                next_page = base_url + str(i)  # + backend_url

                yield response.follow(next_page, callback=self.parse, meta={
                    'splash': {
                        'endpoint': 'render.html',
                        'args': {'wait': 3}
                    }
                })

1 Ответ

0 голосов
/ 16 марта 2020

Что ж, после небольшого количества попыток я понял, как справиться с этим сценарием lua, с которым я играл. Я все еще предпочел бы другой метод, если есть что-то более официальное, чем использование сценариев.

import scrapy
from scrapy_splash import SplashRequest

script_frontend = """
function main(splash)
  splash:init_cookies(splash.args.cookies)
  assert(splash:go{
    splash.args.url,
    headers=splash.args.headers,
    http_method=splash.args.http_method,
    body=splash.args.body,
    })
  assert(splash:wait(3))

  assert(splash:select('#ui-paging-container > ul > li:nth-child("""

script_backend = """) > a'):mouse_click())
  assert(splash:wait(3))

  local entries = splash:history()
  local last_response = entries[#entries].response
  return {
    url = splash:url(),
    headers = last_response.headers,
    http_status = last_response.status,
    cookies = splash:get_cookies(),
    html = splash:html(),
  }
end
"""

class TestSpider(scrapy.Spider):
    name = 'TestSpider'
    start_urls = ['https://www.kennedaleisd.net/Page/3884']

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, self.parse, meta={
                'splash': {
                    'endpoint': 'render.html',
                    'args': {'wait': 0.5}
                }
            })

    def parse(self, response):

        for item in response.css('div.staff'):

            name = item.css('li.staffname::text').get()
            title = item.css('li.staffjob::attr(data-value)').get()
            email = item.css('li.staffemail a::attr(href)').get()
            staffURL = response.request.url

            yield {
                'name': name,
                'title': title,
                'email': email,
                'staffURL': staffURL
            }

        if response.css('a.ui-page-number-current-span::text').get() == '1':
            pagination_results = response.css(
                'li.ui-page-number a:not([class^="ui-page-number-current-span"])::text').getall()

            for i in pagination_results:

                script = script_frontend + str(i) + script_backend

                yield SplashRequest(self.start_urls[0], self.parse,
                                    endpoint='execute',
                                    cache_args=['lua_source'],
                                    args={'lua_source': script},
                                    headers={'X-My-Header': 'value'},
                                    session_id='foo'
                                    )
...