Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单击Scrapy中的按钮_Python_Web Crawler_Web Scraping_Scrapy - Fatal编程技术网

Python 单击Scrapy中的按钮

Python 单击Scrapy中的按钮,python,web-crawler,web-scraping,scrapy,Python,Web Crawler,Web Scraping,Scrapy,我正在使用Scrapy来抓取网页。我需要的一些信息只有在单击某个按钮时才会弹出(当然,单击后也会出现在HTML代码中) 我发现Scrapy可以处理表单(如登录),如图所示。但问题是没有表格可以填写,所以这不是我需要的 我怎么能简单地点击一个按钮,然后显示我需要的信息 我必须使用像mechanize或lxml这样的外部库吗?Scrapy无法解释javascript 如果您必须与页面上的javascript交互,那么您需要使用Selenium 如果使用Scrapy,问题的解决方案取决于按钮的作用 如

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

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

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


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

Scrapy无法解释javascript

如果您必须与页面上的javascript交互,那么您需要使用Selenium

如果使用Scrapy,问题的解决方案取决于按钮的作用

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

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

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

如果您想解释javascript,是的,您需要使用不同的库,尽管这两个库都不适合。他们俩都不懂javascript。硒是一条出路


如果你能给出你正在抓取的页面的URL,我可以看一看。

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

Selenium
浏览器提供了非常好的解决方案。下面是一个示例(
pip安装-U selenium
):


这不是我实际问题的真正答案,但它解决了我的问题。我在Chrome中找到了该站点的请求,并在一个单独的页面中找到了一个显示信息的链接。谢谢但我不会将你的答案标记为已接受,因为其他人可能真的需要单击按钮。@naeg我认为答案的总结是正确的。您不能用Scrapy单击按钮。您可以发送请求并接收响应。您可以使用单独的javascript引擎来解释响应。似乎Acorn编辑了他的答案,现在它是对我的问题的完整且被接受的答案:)您也可以使用Scrapy splash:如果您在单击selenium的按钮以解析2后生成url,它是否通过点击显示的内容传递html?@jose我不确定,但它应该很容易测试
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!'