首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Python刮取数据点

使用Python刮取数据点
EN

Stack Overflow用户
提问于 2014-01-19 12:57:20
回答 1查看 242关注 0票数 2

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

我正在寻找的数据点是最低出价,目前的报价如下:

代码语言:javascript
运行
复制
<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。我希望把它构建成一个脚本,它可以给我发一封电子邮件,提醒我与其他交易所相比,某些价差。

我是相当的诺比,所以如果在你的解释中,你可以提供你的思考过程,为什么你做了某些事情,这将是非常感谢的。

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

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-19 13:51:04

这里是从‘购买BTC’表中抓取最低出价的代码:

代码语言:javascript
运行
复制
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上安装,从命令行运行:

pip install selenium (如果您已经拥有它,也可以使用pip install selenium --upgrade )。

如果您想要“出售BTC”表,请将"orderbook_buy“改为"orderbook_sell”。

如果希望使用“最后的交易”表,请将"orderbook_buy“更改为"orderbook_trades”。

注:

如果您认为性能非常关键,那么您可以通过URL连接而不是Selenium实现数据抓取,并使程序运行得更快。但是,您的代码最终可能会变得非常“混乱”,因为您将不得不应用冗长的XML解析.

这里是用电子邮件将前面的输出发送给自己的代码:

代码语言:javascript
运行
复制
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))

如果您的电子邮件提供者是gmailhotmailyahoo,则上述代码应该可以工作。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21217034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档