Skip to main content
 首页 » 编程设计

python之使用 Python 抓取数据点

2025年05月04日7exmyth

我希望使用 Python 从 url http://www.cavirtex.com/orderbook 中抓取数据点.

我要抓取的数据点是最低出价,目前看起来是这样的:

<tr> 
 <td><b>Jan. 19, 2014, 2:37 a.m.</b></td> 
 <td><b>0.0775/0.1146</b></td> 
 <td><b>860.00000</b></td> 
 <td><b>66.65 CAD</b></td> 
</tr> 

相关点是 860.00 。我希望将其构建到一个脚本中,该脚本可以向我发送一封电子邮件,提醒我与其他交易所相比存在某些价格差异。

我是个菜鸟,所以如果您能在解释中提供您的思考过程,说明您为什么做了某些事情,我们将不胜感激。

这是我目前所拥有的,它会正确地返回标题的名称,但我在获取表格数据时遇到了问题。

import urllib2, sys 
from bs4 import BeautifulSoup 
 
site= "http://cavirtex.com/orderbook" 
hdr = {'User-Agent': 'Mozilla/5.0'} 
req = urllib2.Request(site,headers=hdr) 
page = urllib2.urlopen(req) 
soup = BeautifulSoup(page) 
print soup.title 

请您参考如下方法:

这是从“购买 BTC”表中抓取最低出价的代码:

from selenium import webdriver 
 
fp = webdriver.FirefoxProfile() 
browser = webdriver.Firefox(firefox_profile=fp) 
browser.get('http://www.cavirtex.com/orderbook') 
 
lowest_bid = float('inf') 
elements = browser.find_elements_by_xpath('//div[@id="orderbook_buy"]/table/tbody/tr/td') 
 
for element in elements: 
    text = element.get_attribute('innerHTML').strip('<b>|</b>') 
    try: 
        bid = float(text) 
        if lowest_bid > bid: 
            lowest_bid = bid 
    except: 
        pass 
 
browser.quit() 
print lowest_bid 

为了在 Windows PC 上安装用于 Python 的 Selenium,从命令行运行:

pip install selenium(或者 pip install selenium --upgrade 如果您已经安装了它)。

如果您想要“卖出 BTC”表格,请将“orderbook_buy”更改为“orderbook_sell”。

如果您想要“最后交易”表,则将“orderbook_buy”更改为“orderbook_trades”。

注意:

如果您认为性能很重要,那么您可以通过 URL-Connection 而不是 Selenium 来实现数据抓取,并让您的程序运行得更快。但是,由于您不得不应用繁琐的 XML 解析,您的代码最终可能会变得更加“困惑”...

以下是将之前的输出通过电子邮件发送给自己的代码:

import smtplib,ssl 
 
def SendMail(username,password,contents): 
    server = Connect(username) 
    try: 
        server.login(username,password) 
        server.sendmail(username,username,contents) 
    except smtplib.SMTPException,error: 
        Print(error) 
    Disconnect(server) 
 
def Connect(username): 
    serverName = username[username.index("@")+1:username.index(".")] 
    while True: 
        try: 
            server = smtplib.SMTP(serverDict[serverName]) 
        except smtplib.SMTPException,error: 
            Print(error) 
            continue 
        try: 
            server.ehlo() 
            if server.has_extn("starttls"): 
                server.starttls() 
                server.ehlo() 
        except (smtplib.SMTPException,ssl.SSLError),error: 
            Print(error) 
            Disconnect(server) 
            continue 
        break 
    return server 
 
def Disconnect(server): 
    try: 
        server.quit() 
    except smtplib.SMTPException,error: 
        Print(error) 
 
serverDict = { 
    "gmail"  :"smtp.gmail.com", 
    "hotmail":"smtp.live.com", 
    "yahoo"  :"smtp.mail.yahoo.com" 
} 
 
SendMail("your_username@your_provider.com","your_password",str(lowest_bid)) 

如果您的电子邮件提供商是 gmail 或 hotmail 或 yahoo,则上述代码应该有效。

请注意,根据您的防火墙配置,它可能会在您第一次尝试时征求您的许可...