好的,在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年的数据。感谢您的时间/耐心/帮助!
答案 0 :(得分:3)
我不知道你在做什么,但当我打电话给你的剧本我得到了回复 - 但它是默认网站,上面有过去3个月的信息。
要获取过去4年的数据,您需要稍微更改一下您的查询。如果您在浏览器的开发人员工具中查看XHR请求,您会发现发送到服务器的数据是4y|false|DDD
而不是'ddlTimeFrame': '4y'
。
第二个更改是您必须与content-type
请求一起发送的POST
标题:
session.headers['content-type'] = 'application/json'
data = "4y|false|DDD"
通过这两项小改动,您可以获得所需的数据。