-2

以前,我想我是在丛林中跳舞,因为我不清楚使用 python 在某人的网站周围腾跃的道德规范。我在 stackoverflow 上看到了一个接近我需要的答案,但它被删除了,因为 ticketmaster.com 要求发生这种情况。但是,我会把这些保留放在一边。

我想从杂货店网站自动获取一堆价格。我用 python 开始了我的项目,有点生疏。我以人类身份从浏览器会话中抓取 URL 文件,并运行了一堆循环来提取我想要的数据(很多“.find”)。问题是,当时我正在搜索 (.find()) 我手动下载的 html 文件。当我将代码切换到使用“urlopen”时,我遇到了一个我没有立即意识到的问题。

例如,此页面会根据您的浏览状态显示两种不同的内容。

http://www.hannaford.com/thumbnail/Produce/Fruits/pc/28546/46815.uts?displayAll=true

我认为应该如此,因为在这样的业务中,产品和价格可能对地理非常敏感。

我的想法是在我已经知道要选择的商店的此页面上开始“Python-ing”:www.hannaford.com/custserv/store_detail.jsp?viewStoreId=21026

我特别有这个表格:

<form action="/custserv/save_user_store.cmd" 
    method="post" name="selectThisStoreForm" 
    onsubmit="return StoreLocator.change.store(this,false,false,21026);"
        >
        <input type='hidden' name='form_state' value='selectThisStoreForm'/>
        <input name="storeId" type="hidden" value="21026"/><p class="browseStoreLink">
    <a href="javascript:void(0);" 
        onclick="this.form.submit();" 
        class="altLink"
        >
        <input class="shopNow" type="image" src="/assets/hf/assets/images/buttons/btn_shopNow.gif" border="0" alt="Shop Now"/>
    </a>
    </p>
</form>

所以我让 onsubmit 将一个 JS 函数发送到一个不打算被人类看到的页面。

Chrome 说当我与 Hannaford 交谈时,我总是有 10 个 cookie。7 个来自“hannaford.com”,3 个来自“www.hannaford.com”。

所以,只是挥舞一点:

sesh = requests.Session()
Params = {'selectThisStoreForm':''}
url = "http://www.hannaford.com/custserv/save_user_store.cmd"
sesh.post(url,param=Params)

urlopen(urlFRUITS,cookies=sesh.cookies)#??

我正在从 Sessions 中获取 cookie。我没有得到 Chrome 所说的数量。我也无法“.find”我想在每个页面中找到的标签。

4

1 回答 1

0

无需使用urllib.urlopen只需使用sesh.get([url]),cookies会自动发送。您也没有为表单发送正确的参数,请尝试:

params = { 'form_state' : 'selectThisStoreForm', 'storeid' : '21026' }
sesh.post('http://www.hannaford.com/custserv/save_user_store.cmd', params=params)
resp = sesh.get(urlFRUITS)

或者,您可以尝试使用requests库和Session对象,它会自动管理 cookie,例如:

>>> import requests
>>> s = requests.Session()
>>> r = s.get('http://www.THEWEBSITE.com/custserv/locate_store.cmd')
>>> print r.status_code
200
>>> for c in s.cookies:
>>>     print c
<Cookie JSESSIONID=<ID> for www.THEWEBSITE.com/>
<Cookie PIPELINE_SESSION_ID=<ID> for www.THEWEBSITE.com/>
>>> payload = { 'form_state' : 'selectThisStoreForm', 'storeId' : '62012' } 
>>> r = s.post('http://www.THEWEBSITE.com/custserv/save_user_store.cmd', data=payload)
>>> print r.status_code
200
>>> for c in s.cookies:
>>>    print c
<Cookie JSESSIONID=<ID> for www.THEWEBSITE.com/>
<Cookie PIPELINE_SESSION_ID=<ID> for www.THEWEBSITE.com/>
<Cookie USER_SESSION_VALIDATE_COOKIE=false for www.THEWEBSITE.com/>

在不知道你在做什么的情况下,我会尝试这个requests.Session对象。

于 2013-09-08T04:13:58.497 回答