使用 Python 3.4 和 beautifulsoup 抓取动态网页
Scraping dynamic web pages using Python 3.4 and beautifulsoup
好的,在 windows 7 虚拟机上使用 Python 3.4 和 beautifulsoup4。无法通过下拉列表制作 selection 来抓取数据。作为一种学习经验,我正在尝试编写一个可以 select 此页面上的 4 年选项的抓取器:www.nasdaq.com/symbol/ddd/historical 并打印结果 table 的行。到目前为止,它只打印出默认的 3 个月 table,以及开头的一些我不想要的垃圾。最终我想抓取这些数据并使用 mysql python 连接器将其写入数据库,但现在我只想弄清楚如何在下拉列表。 (另外,我想摆脱导致它成为 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 年的数据。感谢您的 time/patience/help!
我不知道你在做什么,但当我调用你的脚本时,我得到了回应——但它是包含最近 3 个月信息的默认站点。
要获取过去 4 年的数据,您需要稍微更改查询。如果您在浏览器的开发人员工具中查看 XHR 请求,您会发现发送到服务器的数据是 4y|false|DDD
而不是 'ddlTimeFrame': '4y'
.
第二个更改是 content-type
header,您必须将其与 POST
请求一起发送:
session.headers['content-type'] = 'application/json'
data = "4y|false|DDD"
通过这两个小改动,您可以获得所需的数据。
好的,在 windows 7 虚拟机上使用 Python 3.4 和 beautifulsoup4。无法通过下拉列表制作 selection 来抓取数据。作为一种学习经验,我正在尝试编写一个可以 select 此页面上的 4 年选项的抓取器:www.nasdaq.com/symbol/ddd/historical 并打印结果 table 的行。到目前为止,它只打印出默认的 3 个月 table,以及开头的一些我不想要的垃圾。最终我想抓取这些数据并使用 mysql python 连接器将其写入数据库,但现在我只想弄清楚如何在下拉列表。 (另外,我想摆脱导致它成为 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 年的数据。感谢您的 time/patience/help!
我不知道你在做什么,但当我调用你的脚本时,我得到了回应——但它是包含最近 3 个月信息的默认站点。
要获取过去 4 年的数据,您需要稍微更改查询。如果您在浏览器的开发人员工具中查看 XHR 请求,您会发现发送到服务器的数据是 4y|false|DDD
而不是 'ddlTimeFrame': '4y'
.
第二个更改是 content-type
header,您必须将其与 POST
请求一起发送:
session.headers['content-type'] = 'application/json'
data = "4y|false|DDD"
通过这两个小改动,您可以获得所需的数据。