单击 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 中的按钮的主要内容,如果未能解决你的问题,请参考以下文章
单击按钮时附加新文本字段并通过单击 Laravel 4 中的按钮删除