0

我想在使用 Python(使用)打开页面后向页面发送 POST 请求urllib2.urlopen。网页是http://wireless.walmart.com/content/shop-plans/?r=wm

我现在使用的代码是:

url = 'http://wireless.walmart.com/content/shop-plans/?r=wm'
user_agent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;Trident/5.0)'   
values = {'carrierID':'68',
'conditionToType':'1',
'cssPrepend':'wm20',
'partnerID':'36575'}
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
page = response.read()
walmart = open('Walmart_ContractPlans_ATT.html','wb')
walmart.write(page)

这给了我默认打开的页面,在使用 Firebug 检查页面后,我知道carrierID:68当我单击发送此 POST 请求的按钮时发送了该页面。

我想模拟这种浏览器行为。

请帮我解决这个问题。

4

2 回答 2

1

对于网页抓取,我更喜欢使用requestspyquery。首先下载数据:

import requests
from pyquery import PyQuery as pq

url = 'http://wireless.walmart.com/content/getRatePlanInfo'
payload = {'carrierID':68, 'conditionToType':1, 'cssPrepend':'wm20'}
r = requests.post(url, data=payload)
d = pq(r.text)

在此之后,您继续解析元素,例如提取所有计划:

plans = []
plans_selector = '.wm20_planspage_planDetails_sub_detailsDiv_ul_li'
plans = d(plans_selector).each(lambda i, n: plans.append(pq(n).text()))

结果:

 ['Basic 200',
 'Simply Everything',
 'Everything Data 900',
 'Everything Data 450',
 'Talk 450',
 ... 
于 2013-05-17T21:44:36.480 回答
0

我建议查看像mechanize这样的浏览器模拟器,而不是尝试使用原始 HTTP 请求来执行此操作。

于 2013-05-17T12:58:26.107 回答