Lua脚本刮scrap

时间:2019-06-25 14:59:02

标签: python lua scrapy scrapy-splash

我正在使用scrapy 1.6和splash 3.2,我有:

import scrapy
import random
from scrapy_splash import SplashRequest
from scrapy.utils.response import open_in_browser
from scrapy.linkextractors import LinkExtractor

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:48.0) Gecko/20100101 Firefox/48.0'

class MySpider(scrapy.Spider):


    start_urls = ["http://yahoo.com"]
    name = 'mytest'

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url, self.parse, endpoint='render.html', args={'wait': 2.5},headers={'User-Agent': USER_AGENT,'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'})

    def parse(self, response):
        # response.body is a result of render.html call; it
        # contains HTML processed by a browser.
        # from scrapy.http.response.html import HtmlResponse
        # ht = HtmlResponse('jj')
        # ht.body.replace =response
        open_in_browser(response)
        return None

我正在阅读https://blog.scrapinghub.com/2015/03/02/handling-javascript-in-scrapy-with-splash,并在此给出以下示例:

function main(splash)
assert(splash:go(splash.args.url))
splash:wait(0.5)
local title = splash:evaljs("document.title")
return {title=title}
end

很显然,我不能将Lua放在我的python脚本中。我在哪里放置它以及如何访问它以传递到我的启动请求?

1 个答案:

答案 0 :(得分:1)

您可以将lua脚本作为这样的字符串传递:

script = """
    function main(splash)
        assert(splash:go(splash.args.url))
        splash:wait(0.5)
        local title = splash:evaljs('document.title')
        return {title=title}
    end
"""
yield SplashRequest(
    url, self.parse, endpoint='render.html',
    args={'wait': 2.5, 'lua_source': script},
    headers={'User-Agent': USER_AGENT,'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'}
)

检查文档是否有刮擦现象:https://github.com/scrapy-plugins/scrapy-splash