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

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

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

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

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

【问题讨论】:

    标签: python web-crawler web-scraping scrapy


    【解决方案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)
      ...
      
      

      【讨论】:

        猜你喜欢
        • 2019-11-04
        • 2019-11-07
        • 1970-01-01
        • 1970-01-01
        • 2018-04-17
        • 2016-05-11
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        相关资源
        最近更新 更多