使用Python 3.4和beautifulsoup刮取动态网页

时间:2015-07-27 16:49:31

标签: python-3.x web-scraping beautifulsoup

好的,在Windows 7 VM上使用Python 3.4和beautifulsoup4。在使用下拉列表进行选择时,无法抓取数据。作为一种学习体验,我正在尝试编写一个可以在此页面上选择4年选项的scraper:www.nasdaq.com/symbol/ddd/historical并打印结果表的行。到目前为止,它只打印出默认的3个月表,以及一些我不想要的垃圾。最后我想抓取这些数据并使用mysql python连接器将其写入数据库,但是现在我只想弄清楚如何在下拉列表中进行4年选择。 (另外,想要摆脱使其成为b'blahblah格式的文本编码。到目前为止我的代码:

from bs4 import BeautifulSoup
import requests

url = 'http://www.nasdaq.com/symbol/ddd/historical'
with requests.Session() as session:
    session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36'}
    response = session.get(url)
    soup = BeautifulSoup(response.content)
    data = {
        'ddlTimeFrame': '4y'
    }
    response = session.post(url, data=data)
    soup = BeautifulSoup(response.content)
    for mytable in soup.find_all('tbody'):
        for trs in mytable.find_all('tr'):
            tds = trs.find_all('td')
            row = [elem.text.strip().encode('utf-8') for elem in tds]
            print (row)

我没有错误,但它没有打印出4年的数据。感谢您的时间/耐心/帮助!

1 个答案:

答案 0 :(得分:3)

我不知道你在做什么,但当我打电话给你的剧本我得到了回复 - 但它是默认网站,上面有过去3个月的信息。

要获取过去4年的数据,您需要稍微更改一下您的查询。如果您在浏览器的开发人员工具中查看XHR请求,您会发现发送到服务器的数据是4y|false|DDD而不是'ddlTimeFrame': '4y'

第二个更改是您必须与content-type请求一起发送的POST标题:

session.headers['content-type'] = 'application/json'
data = "4y|false|DDD"

通过这两项小改动,您可以获得所需的数据。