我希望在使用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
。
我想模拟这种浏览器行为。
请帮我解决这个问题。
答案 0 :(得分:1)
对于网页抓取,我更喜欢使用requests和pyquery。首先下载数据:
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请求执行此操作。