Scrapy 刮花设置输入值?

Scrapy 刮花设置输入值?,scrapy,splash-screen,scrapy-splash,Scrapy,Splash Screen,Scrapy Splash,我已经成功地用scrapy splash加载javascript生成的html。现在我想设置一对输入值,它们不是表单的一部分。只要我输入一个值,网站上的内容就会改变。我还没有找到一种方法来设置输入值并重新捕获调整后的html。这可能吗 class ExampleSpider(scrapy.Spider): name = "example" allowed_domains = ["example.com"] start_urls = ( 'https://example.com', )

我已经成功地用scrapy splash加载javascript生成的html。现在我想设置一对输入值,它们不是表单的一部分。只要我输入一个值,网站上的内容就会改变。我还没有找到一种方法来设置输入值并重新捕获调整后的html。这可能吗

class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["example.com"]
start_urls = (
    'https://example.com',
)

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

def parse(self, response):
    page = response.url.split("/")[-2]
    filename = 'screener-%s.html' % page
    with open(filename, 'wb') as f:
        f.write(response.body)
    self.log('Saved file %s' % filename)

您需要按照注释中的建议将输入放入lua_脚本中,下面是单击按钮的示例:

script ="""
        function main(splash)
           local url = splash.args.url
           assert(splash:go(url))


           assert(splash:runjs('document.getElementsByClassName("nameofbutton").click()'))
           assert(splash:wait(0.75))


           -- return result as a JSON object
           return {
               html = splash:html()
           }
        end
        """
然后按如下方式执行脚本:

def start_requests(self):
    for url in self.start_urls:
        yield scrapy.Request(url, self.parse_item, meta={
            'splash': {
                'args': {'lua_source': self.script},
                'endpoint': 'execute',
            }
        })

我自己还没有做过,但是您应该能够使用lua添加脚本。用lua_源键在meta dict中传递它。这一切都来自内存,因此可能不正确。