Python Scrapy Splash使用javascript href点击链接
我正在使用Scrapy Splash来刮取包含以下元素的页面: 第1页,共349页 | 1. | 2. | 3. | 4. | 5. | 6. | 7. | 8. | 9 | 10 | 下一个 › 我想“单击”带有文本“Next”的锚,并让javascript执行以获取下一页 这就是我的刮刀的样子: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
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我想将javascriptjavascript:doSubmit('frmRow',1,0)
作为参数传递给Lua脚本,然后让Lua脚本执行它(即模拟“单击”),然后以html形式返回新页面,在Lua脚本中的return
语句中。让我确认一下:您想传入另一个参数:args={…,'javascript':'doSubmit…}
,然后在Lua脚本中访问该值。然后在Lua脚本中,它必须运行doSubmit('frmRow',1,0)
?另外,它真的需要一个参数吗?也就是说,您是否计划传入其他Javascript代码段?您是否询问如何将其他参数传入Lua脚本?或者关于如何编写Lua脚本来单击链接?@malberts我想将javascriptjavascript:doSubmit('frmRow',1,0)
作为参数传递给Lua脚本,然后让Lua脚本执行它(即模拟“单击”),然后以html形式返回新页面,在Lua脚本中的return
语句中。让我确认一下:您想传入另一个参数:args={…,'javascript':'doSubmit…}
,然后在Lua脚本中访问该值。然后在Lua脚本中,它必须运行doSubmit('frmRow',1,0)
?另外,它真的需要一个参数吗?也就是说,您是否也计划传递其他Javascript代码片段?