Python Scrapy Splash使用javascript href点击链接

Python Scrapy Splash使用javascript href点击链接,python,scrapy,Python,Scrapy,我正在使用Scrapy Splash来刮取包含以下元素的页面: 第1页,共349页 | 1. | 2. | 3. | 4. | 5. | 6. | 7. | 8. | 9 | 10 | 下一个 › 我想“单击”带有文本“Next”的锚,并让javascript执行以获取下一页 这就是我的刮刀的样子: script = """ function main(splash) splash:init_cookies(splash.args.coo

我正在使用Scrapy Splash来刮取包含以下元素的页面:

第1页,共349页

| 1. | 2. | 3. | 4. | 5. | 6. | 7. | 8. | 9 | 10 | 下一个 ›

我想“单击”带有文本“Next”的锚,并让javascript执行以获取下一页

这就是我的刮刀的样子:

script = """
    function main(splash)
        splash:init_cookies(splash.args.cookies)
        assert(splash:go(splash.args.url))
        splash:wait(0.5)
        local element = splash:select('div.result-content-columns div.result-title')
        local bounds = element:bounds()
        element:mouse_click{x=bounds.width/2, y=bounds.height/2}

         return {
            cookies = splash:get_cookies(),
            html = splash:html()
            }
    end
"""

class MySpider(scrapy.Spider):
   custom_settings = {
                'DOWNLOADER_MIDDLEWARES' : {
                            'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
                            'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
                            'scrapy_splash.SplashCookiesMiddleware': 723,
                            'scrapy_splash.SplashMiddleware': 725,
                            'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
                            },

               'SPLASH_URL': 'http://192.168.59.103:8050',

               'SPIDER_MIDDLEWARES': {
                        'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
                        },

                'DUPEFILTER_CLASS':  'scrapy_splash.SplashAwareDupeFilter',

                'HTTPCACHE_STORAGE': 'scrapy_splash.SplashAwareFSCacheStorage',
                }


    def star_requests(self):
          yield SplashRequest(url=some_url, meta={'cookiejar': 1},
                                callback=self.parse,
                                cookies={'store_language':'en'},
                                endpoint='render.html',
                                args={'wait': 5},
                            )

    def parse(self, response):
           self.extract_data_from_page(response)

            href = response.xpath('//div[@class="paging"]/p/a[contains(text(),"Next")]/@href')
            if href:
                new_url = href.extract_first()
                yield SplashRequest(new_url, self.parse,
                                    cookies={'store_language':'en'},
                                    endpoint='execute', args={'lua_source': self.script})

Lua脚本不正确(我从一个不相关的示例中复制了它)。我的问题是,如何将所需的参数传递给Lua脚本,以便运行javascript?

您可以通过将值添加到SplashRequest的
参数中,向Lua脚本传递附加参数()

javascript = "doSubmit('frmRow',1,0)"

yield SplashRequest(new_url, self.parse,
                    cookies={'store_language':'en'},
                    endpoint='execute',
                    args={'lua_source': self.script, 'javascript': javascript})
在Lua脚本中,您可以在
args
中获取值,并使用以下命令执行Javascript:


通过将值添加到SplashRequest的
args
,可以将其他参数()传递给Lua脚本:

javascript = "doSubmit('frmRow',1,0)"

yield SplashRequest(new_url, self.parse,
                    cookies={'store_language':'en'},
                    endpoint='execute',
                    args={'lua_source': self.script, 'javascript': javascript})
在Lua脚本中,您可以在
args
中获取值,并使用以下命令执行Javascript:


您是否询问如何将其他参数传递到Lua脚本中?或者关于如何编写Lua脚本来单击链接?@malberts我想将javascript
javascript:doSubmit('frmRow',1,0)
作为参数传递给Lua脚本,然后让Lua脚本执行它(即模拟“单击”),然后以html形式返回新页面,在Lua脚本中的
return
语句中。让我确认一下:您想传入另一个参数:
args={…,'javascript':'doSubmit…}
,然后在Lua脚本中访问该值。然后在Lua脚本中,它必须运行
doSubmit('frmRow',1,0)
?另外,它真的需要一个参数吗?也就是说,您是否计划传入其他Javascript代码段?您是否询问如何将其他参数传入Lua脚本?或者关于如何编写Lua脚本来单击链接?@malberts我想将javascript
javascript:doSubmit('frmRow',1,0)
作为参数传递给Lua脚本,然后让Lua脚本执行它(即模拟“单击”),然后以html形式返回新页面,在Lua脚本中的
return
语句中。让我确认一下:您想传入另一个参数:
args={…,'javascript':'doSubmit…}
,然后在Lua脚本中访问该值。然后在Lua脚本中,它必须运行
doSubmit('frmRow',1,0)
?另外,它真的需要一个参数吗?也就是说,您是否也计划传递其他Javascript代码片段?