之前,我认为我在丛林中跳舞,因为我不清楚用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说当我和汉纳福德会面时,我总是有10个饼干。 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说它确实得到的数量。我也无法“找到”我想在每个页面中找到的标签。
答案 0 :(得分:0)
无需使用urllib.urlopen
只需使用sesh.get([url])
,Cookie就会自动发送。您也没有为表单发送正确的参数,请尝试:
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
对象。