使用 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"

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