Python:输入信息后从Web抓取数据

时间:2014-12-27 06:41:07

标签: python web-scraping html-parsing lxml lxml.html

任何人都可以帮我修改这个Python程序,以便正确地将信息提交到"日期范围"查询,然后提取"关闭"返回数据。我正在从以下网址抓取数据:

http://finance.yahoo.com/q/hp?s=%5EGSPC+Historical+Prices

这是我当前的代码,它返回" []"。

from lxml import html
import requests


def historic_quotes(symbol, stMonth, stDate, stYear, enMonth, enDate, enYear):
    url = 'https://finance.yahoo.com/q/hp?s=%s+Historical+Prices' % (symbol)

    form_data = {
        'a': stMonth,  #00 is January, 01 is Feb., etc.
        'b': stDate,
        'c': stYear,
        'd': enMonth,  #00 is January, 01 is Feb., etc.
        'e': enDate,
        'f': enYear,
        'submit': 'submit',
    }
response = requests.post(url, data=form_data)

tree = html.document_fromstring(response.content)
p = tree.xpath('//*[@id="yfncsumtab"]/tbody/tr[2]/td[1]/table[4]/tbody/tr/td/table/tbody/tr[2]/td[7]/text()')
print p

historic_quotes('baba',00,11,2010,00,11,2012)

我是一个整体的Python新手,非常感谢任何和所有的帮助。谢谢你的阅读!

另外,我现在意识到html源代码可能有所帮助,但它很大 - 所以这里有一个XPATH:

//*[@id="daterange"]/table

预期输出是"关闭"的列表来自不同日期的值。如前所述,当前的输出只是" []"。我相信form_data中的某些内容可能不正确,也许是"提交"。

2 个答案:

答案 0 :(得分:2)

主要问题是您需要发出GET个请求,而不是POST

另外,@ Paul Lo对日期范围是正确的。例如,我在2010年至2015年期间查询。

此外,您必须将查询参数作为字符串传递。 00评估为0requests将int 0转换为"0"字符串。因此,您将00作为参数值发送,而不是0一个月。

这是一个固定版本,其中包含修改后的部分:

from lxml import html
import requests

def historic_quotes(symbol, stMonth, stDate, stYear, enMonth, enDate, enYear):
    url = 'https://finance.yahoo.com/q/hp?s=%s+Historical+Prices' % symbol

    params = {
        'a': stMonth,
        'b': stDate,
        'c': stYear,
        'd': enMonth,
        'e': enDate,
        'f': enYear,
        'submit': 'submit',
    }
    response = requests.get(url, params=params)

    tree = html.document_fromstring(response.content)
    for amount in tree.xpath('//table[@class="yfnc_datamodoutline1"]//tr[td[@class="yfnc_tabledata1"]]//td[5]/text()'):
        print amount

historic_quotes('baba', '00', '11', '2010', '00', '11', '2015')

打印:

105.95
105.95
105.52
108.77
110.65
109.25
109.02
105.77
104.70
105.11
104.97
103.88
107.48
105.07
107.90
...
90.57

答案 1 :(得分:1)

我怀疑阿里巴巴(BABA)在2010/1/11至2012/1/11期间有最新数据。 您可能需要首先检查response.content中的原始数据,然后尝试更改范围:historic_quotes('baba',00,11,2014,00,11,2015)