使用Python抓取数据点

时间:2014-01-19 12:57:20

标签: python web-scraping beautifulsoup

我希望在网址http://www.cavirtex.com/orderbook上使用Python抓取数据点。

我希望收集的数据点是最低出价,目前看来是这样:

<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

1 个答案:

答案 0 :(得分:1)

以下是从“购买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上安装Selenium for Python,请从命令行运行:

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 ,则上述代码应该有效。

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