使用Python requests进行Etrade抓取时遇到跨域URL问题

2 投票
1 回答
676 浏览
提问于 2025-04-19 03:14

我正在尝试从etrade网站抓取一些基本的股票信息(我知道他们有一个API,但我想先搞清楚怎么抓取数据)。我用requests模块成功登录了,代码如下:

import requests
from bs4 import BeautifulSoup, Comment
symbol = 'A'
payload = {'USER':etradeUsername, 'PASSWORD':etradePassword, 'countrylangselect':'us_english', 'TARGET':'/e/t/pfm/portfolioview'}
with requests.Session() as c:
    c.post('https://us.etrade.com/login.fcc', data=payload)
    r=c.get('https://us.etrade.com/e/t/pfm/portfolioview')
    #r=c.get('https://www.etrade.wallst.com/v1/stocks/snapshot/snapshot.asp?symbol=' + symbol + '&rsO=new')

    etradeMarkup = BeautifulSoup(r.text)
    #print r.headers
    file1 = open("etrade.html","w")
    file1.write("<html><body><head><meta charset='UTF-8'></head>" + str(etradeMarkup.prettify().encode("utf-8")) + "</body></html>")
    file1.flush()
    file1.close()

我写文件是为了查看抓取器获取了什么数据。

我能正常看到投资组合页面,所以我知道登录是成功的。接下来那行被注释掉的代码是我想抓取的目标页面。我在浏览器中成功登录后可以看到www.etrade.wallst.com...的页面,但抓取器却被重定向到了etrade.com的登录页面。

我觉得可能是有一个会话转移或者cookie变量在不同的域之间移动,而我的浏览器知道怎么处理这些,但我的代码却不知道。

我在Python和HTTP知识上遇到了瓶颈,希望有人能指点我一下,帮我解决这个问题。

非常感谢你能提供的任何帮助。(我刚接触Python和抓取,所以请多多包涵 :)

1 个回答

0

我发现还有另一个页面需要设置 cookies。我原本以为跳转到 etrade 登录页面是因为需要从 etrade 登录后的部分获取 cookies,但我错了。其实这个页面根本不需要 etrade 的登录,只需要另一个页面来获取 cookies。通过在浏览器中打开 https://us.etrade.com/e/t/invest/markets?ploc=c-MainNav 这个链接,我成功获取了查看目标页面所需的数据,而不再被程序强制跳回登录页面。

with requests.Session() as c:

    #  adding this line was the key
    c.get('https://us.etrade.com/e/t/invest/markets?ploc=c-MainNav') 

    r=c.get('https://www.etrade.wallst.com/v1/stocks/snapshot/snapshot.asp?symbol=' + symbol + '&rsO=new')

    etradeMarkup = BeautifulSoup(r.text)

撰写回答