9

我正在使用需要启用烹饪和 java 脚本的 Scrapy 抓取网站。我认为我不必实际处理 javascript。我所需要的只是假装好像启用了 javascript。

这是我尝试过的:1)通过以下设置启用Cookie

COOKIES_ENABLED = True
COOKIES_DEBUG = True

2) 使用 cookie 下载中间件

DOWNLOADER_MIDDLEWARES = {
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 400,
    'scrapy.contrib.downloadermiddleware.cookies.CookiesMiddleware':700
}

3) 发送 'X-JAVASCRIPT-ENABLED': 'True'

DEFAULT_REQUEST_HEADERS={
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
    'X-JAVASCRIPT-ENABLED': 'True'
}

但他们都没有和我一起工作。你能提出任何想法或给我一些方向吗?

提前感谢您的回复。

4

3 回答 3

6

您应该尝试使用scrapyjs的Splash JS 引擎。以下是如何在您的蜘蛛项目中设置它的示例:

SPLASH_URL = 'http://192.168.59.103:8050'
DOWNLOADER_MIDDLEWARES = {
    'scrapyjs.SplashMiddleware': 725,
}

Scrapy hub是 Scrapy 背后的同一家公司,它有特殊的实例来运行你的蜘蛛,并启用了启动。

然后 yieldSplashRequest而不是Request像这样在你的蜘蛛中:

import scrapy
from scrapy_splash import SplashRequest

class MySpider(scrapy.Spider):
    start_urls = ["http://example.com", "http://example.com/foo"]

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url, self.parse,
                endpoint='render.html',
                args={'wait': 0.5},
            )

    def parse(self, response):
        # response.body is a result of render.html call; it
        # contains HTML processed by a browser.
        # …
于 2015-08-21T19:12:13.183 回答
4

AFAIK,没有通用的解决方案。您必须调试该站点,以查看它如何确定您的客户端不支持/启用 Javascript。

我不认为服务器会查看X-JAVASCRIPT-ENABLED标题。当页面在真正的启用 javascript 的浏览器中加载时,也许有一个由 Javascript 设置的 cookie?也许服务器会查看user-agent标题?

另请参阅此回复

于 2013-05-07T06:04:25.963 回答
1

Scrapy 不支持 java 脚本。

您可以使用其他一些带有 Scrapy 的库来执行 JS,例如 Webkit、Selenium 等,

并且您不需要启用 cookie ( COOKIES_ENABLED = True),甚至不需要添加DOWNLOADER_MIDDLEWARESsettings.py因为它们已经在默认的 scrapy 设置中可用

于 2013-05-06T13:08:06.240 回答