2

我必须从以下网站的表中提取数据:

http://www.mcxindia.com/SitePages/indexhistory.aspx

当我点击 GO 时,我得到一个动态附加到页面的表格。我想将这些数据从页面导出到 csv 文件(我知道如何处理),但源代码不包含任何数据点。

我曾尝试查看 javascript 代码,当我在生成表格后检查元素时,我得到了数据点,但不在源代码中。我在 Python 中使用机械化。

我认为这是因为页面是动态加载的。我应该做什么/使用什么?

4

5 回答 5

2

mechanize 不能/不能评估 javascript。我见过的评估 javascript 的最简单方法是使用 Selenium,它将在您的计算机上打开一个浏览器并与 python 通信。

我在这里回答了一个类似的问题

于 2013-07-30T05:39:33.680 回答
1

这有效!

import httplib 
import urllib 
import urllib2 
from BeautifulSoup import BeautifulSoup
import mechanize
br = mechanize.Browser()
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
url = 'http://www.mcxindia.com/SitePages/indexhistory.aspx'
br.open(url)
response = br.response().read()
br.select_form(nr=0)
br.set_all_readonly(False)
br.form['mTbFromDate']='08/01/2013'
br.form['mTbToDate']='08/08/2013'
response = br.submit(name='mBtnGo').read()
print response
于 2013-08-08T15:55:42.173 回答
1

为避免使用 javascript 感知传输,您需要:

  1. 在浏览器中安装 Web 调试器。
  2. 转到那个页面。按 F12 打开调试器。重新加载页面。
  3. 分析“网络”选项卡的内容。通常 ajax 页面将数据下载为 html 片段或 json。只需查看response按“开始”后发出的每个请求的选项卡,您就会发现熟悉的数据。
  4. urllib/urllib2现在您可以为该网址创建简单的下载器。
  5. 解析该数据并转换为 csv。

http://www.mcxindia.com/SitePages/indexhistory.aspx在每个“GO”上发送POST带有搜索参数的请求,并接收您需要解析并转换为 csv 的 html 片段。

因此,如果要模拟POST- 你不需要新的浏览器窗口。

于 2013-07-30T07:02:48.773 回答
1

我同意 Matthew Wesly 的评论。我们将使用 Selenium 获取动态页面,iMacro 就像一个插件。它根据我们的记录捕获动态页面响应。它还具有 JS 脚本功能。

我想,为了便于提取,我们将使用 urllib2 和 urllib 包进行正常的内容获取逻辑。

首先获取页面'viewstate'参数。即从主页获取所有隐藏元素信息,并像JS脚本一样传递表单信息。

并且还准确地传递 Content-Type 键值。在这里,您的回复采用“text/plain; charset=utf-8”的形式。

于 2013-07-30T06:41:51.637 回答
0

在处理动态网页时,我个人做的最好的事情是使用 PyQt webkit 并尝试模仿浏览器,然后将 URL 传递给浏览器,最后在所有 Javascript 渲染后获取 HTML。

示例代码-

import sys
from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QUrl
from PyQt4.QtWebKit import QWebPage
import bs4 as bs




class Client(QWebPage):
    def __init__(self, url):
        self.app = QApplication(sys.argv)
        QWebPage.__init__(self)
        self.loadFinished.connect(self.on_page_load)
        self.mainFrame().load(QUrl(url))
        self.app.exec()

    def on_page_load(self):
        self.app.quit()


url = //your URL
client_response = Client(url)
source = client_response.mainFrame().toHtml()
soup = bs.BeautifulSoup(source, "lxml")
// BeautifulSoup stuff
于 2017-07-11T15:28:48.043 回答