单击 Scrapy 中的按钮

Posted

技术标签:

【中文标题】单击 Scrapy 中的按钮【英文标题】:Click a Button in Scrapy 【发布时间】:2011-10-04 16:19:33 【问题描述】:

我正在使用 Scrapy 抓取网页。我需要的一些信息只有在你点击某个按钮时才会弹出(当然点击后html代码中也会出现)。

我发现 Scrapy 可以处理表单(如登录),如 here 所示。但问题是没有表格可以填写,所以这不是我需要的。

我怎样才能简单地点击一个按钮,然后显示我需要的信息?

我必须使用像 mechanize 或 lxml 这样的外部库吗?

【问题讨论】:

【参考方案1】:

Scrapy 无法解释 javascript

如果您绝对必须与页面上的 javascript 交互,那么您希望使用 Selenium。

如果使用 Scrapy,问题的解决方案取决于按钮在做什么。

如果只是显示之前隐藏的内容,你可以毫无问题地抓取数据,它不会出现在浏览器中也没关系,HTML 仍然存在。

如果它在按下按钮时通过 AJAX 动态获取内容,最好的办法是使用 Firebug 等工具查看按下按钮时发出的 HTTP 请求。然后,您可以直接从该 URL 请求数据。

我必须使用像 mechanize 或 lxml 这样的外部库吗?

如果您想解释 javascript,是的,您需要使用不同的库,尽管这两个库都不符合要求。他们都不知道任何关于 javascript 的事情。硒是要走的路。

如果你能提供你正在抓取的页面的 URL,我可以看看。

【讨论】:

这不是我实际问题的真正答案,但它仍然解决了我的问题。我在 Chrome 中跟踪了站点请求,并找到了一个链接,该链接在单独的页面中显示了信息。谢谢!但我不会将您的答案标记为已接受,因为其他人可能确实需要单击按钮。 @naeg 我认为答案正确地总结了它。您不能使用 Scrapy 单击按钮。您可以发送请求并接收响应。您可以使用单独的 javascript 引擎来解释响应。 看来 Acorn 编辑了他的答案,现在它是对我的问题的完整且被接受的答案:) 你也可以使用 Scrapy-splash : blog.scrapinghub.com/2015/03/02/…【参考方案2】:

Selenium 浏览器提供了非常好的解决方案。这是一个例子(pip install -U selenium):

from selenium import webdriver

class northshoreSpider(Spider):
    name = 'xxx'
    allowed_domains = ['www.example.org']
    start_urls = ['https://www.example.org']

    def __init__(self):
        self.driver = webdriver.Firefox()

    def parse(self,response):
            self.driver.get('https://www.example.org/abc')

            while True:
                try:
                    next = self.driver.find_element_by_xpath('//*[@id="BTN_NEXT"]')
                    url = 'http://www.example.org/abcd'
                    yield Request(url,callback=self.parse2)
                    next.click()
                except:
                    break

            self.driver.close()

    def parse2(self,response):
        print 'you are here!'

【讨论】:

如果您在通过 selenium 单击按钮后生成 url 到 parse2,它是否会通过单击显示的内容传递 html? @jose 我不确定,但应该很容易测试【参考方案3】:

要正确和充分地使用 JavaScript,您需要一个完整的浏览器引擎,而这只有使用 Watir/WatiN/Selenium 等才能实现。

【讨论】:

【参考方案4】:

虽然这是一个旧线程,但我发现使用 Helium(基于 Selenium 构建)非常有用,并且比使用 Selenium 更容易/简单得多。它将类似于以下内容:

from helium import *

start_firefox('your_url')
s = S('path_to_your_button')
click(s)
...

【讨论】:

以上是关于单击 Scrapy 中的按钮的主要内容,如果未能解决你的问题,请参考以下文章

Scrapy InitSpider无法单击正确的登录按钮

对于scrapy/selenium,有没有办法回到上一页?

Scrapy - 使用多个按钮提交表单

单击按钮时附加新文本字段并通过单击 Laravel 4 中的按钮删除

当我单击目标 C 中的一个按钮(添加按钮)时,如何创建一组按钮?

如何在单击按钮时暂停读取文本文件并在 mfc vc++ 中的单击按钮时恢复它?