Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在python中尝试使用scrapy splash读取分页的asp页面_Javascript_Python_Scrapy_Scrapy Splash - Fatal编程技术网

Javascript 在python中尝试使用scrapy splash读取分页的asp页面

Javascript 在python中尝试使用scrapy splash读取分页的asp页面,javascript,python,scrapy,scrapy-splash,Javascript,Python,Scrapy,Scrapy Splash,我正在尝试使用scrapy和splash从特定网站的员工页面检索员工、职务和电子邮件。我在docker中使用splash,因为电子邮件隐藏在动态javascript代码后面 蜘蛛在工作人员的第一页上工作,但我似乎无法让它在第二或第三页上工作。我打开了开发人员工具,复制了当您单击其中一个分页链接时发送的请求,然后尝试在spider中复制该请求。我似乎遇到的问题是,对该请求的响应只返回整个页面的代码子集(仅返回该页面的工作人员),而不是像附带的javascript这样的所有内容。因此,当它被传递到s

我正在尝试使用scrapy和splash从特定网站的员工页面检索员工、职务和电子邮件。我在docker中使用splash,因为电子邮件隐藏在动态javascript代码后面

蜘蛛在工作人员的第一页上工作,但我似乎无法让它在第二或第三页上工作。我打开了开发人员工具,复制了当您单击其中一个分页链接时发送的请求,然后尝试在spider中复制该请求。我似乎遇到的问题是,对该请求的响应只返回整个页面的代码子集(仅返回该页面的工作人员),而不是像附带的javascript这样的所有内容。因此,当它被传递到splash时,它没有必要的脚本来创建动态代码。我还注意到请求中似乎有一个重定向到父页面的cookie条目。我曾尝试将该cookie包含在请求中,或将cookie从第一个请求传递到分页页面,但它似乎不起作用。我还在splash请求中尝试了一些lua脚本,但这似乎也没有得到我想要的。下面我已经包括了蜘蛛,因为我现在有它

我不确定是否有某种方法可以在后续请求中重新使用javascript,或者以某种方式重新编辑cookie以获得所需的其余代码。任何帮助都将不胜感激。我意识到分页可能不是循环浏览页面的正确方式,但我想一旦我读懂了数据,我就可以继续这样做了

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}
                    }
                })

嗯,经过一点修补,我找到了如何使用我一直在玩的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'
                                    )

使用lua可能有一种方法,但如果我是你的话,我只想切换到selenium。我想避免使用大量的库,尤其是需要用户输入的任何库。不过,我将研究硒元素,看看如果没有其他建议出现,它是否有用。