在使用Python打开页面后,如何向页面发送POST请求?

时间:2013-05-17 12:52:45

标签: python post python-2.7 web-scraping httprequest

我希望在使用Python(使用urllib2.urlopen)打开后向页面发送POST请求。网页为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检查页面后我发现当我点击发送此POST请求的按钮时发送了carrierID:68

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

请帮我解决这个问题。

2 个答案:

答案 0 :(得分: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',
 ... 

答案 1 :(得分:0)

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