【问题标题】:Scraping .aspx page with python使用 python 抓取 .aspx 页面
【发布时间】:2017-09-24 22:04:39
【问题描述】:

我是网络抓取游戏的新手。我正在尝试废弃以下网站: http://www.foodemissions.com/foodemissions/Calculator.aspx

利用网上找到的资源,我整理了以下 HTTP POST 请求:

import urllib
from bs4 import BeautifulSoup

headers = {
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko)  Chrome/24.0.1312.57 Safari/537.17',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Accept-Encoding': 'gzip,deflate,sdch',
    'Accept-Language': 'en-US,en;q=0.8',
    'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3'
}

class MyOpener(urllib.FancyURLopener):
    version = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17'

myopener = MyOpener()
url = 'http://www.foodemissions.com/foodemissions/Calculator.aspx'
# first HTTP request without form data
f = myopener.open(url)
soup_dummy = BeautifulSoup(f,"html5lib")
# parse and retrieve two vital form values
viewstate = soup_dummy.select("#__VIEWSTATE")[0]['value']
viewstategen = soup_dummy.select("#__VIEWSTATEGENERATOR")[0]['value']

soup_dummy.find(id="ctl00_MainContent_category")

#search for the string 'input' to find the form data
formData = (
    ('__VIEWSTATE', viewstate),
    ('__VIEWSTATEGENERATOR', viewstategen),
    ('ctl00$MainContent$transport', '200'),
    ('ctl00$MainContent$quantity','1'),
    ('ctl00$MainContent$wastepct','100')
)

encodedFields = urllib.urlencode(formData)
# second HTTP request with form data
f = myopener.open(url, encodedFields)
soup = BeautifulSoup(f,"html5lib")
trans_emissions = soup.find("span", id="ctl00_MainContent_transEmissions")
print(trans_emissions.text)

即使我更改了ctl00$MainContent$transport 元素,我的最终打印命令的输出似乎也没有改变。关于为什么会这样的任何指示?

谢谢!

【问题讨论】:

  • 我对BeautifulSoup了解不多,但你是发帖还是get?
  • 我正在尝试发帖
  • 顺便说一句,请确保您对字段进行编码:encodedFields = encodedFields.encode('ascii'),否则当您尝试 POST 时会引发类型错误。

标签: python asp.net beautifulsoup


【解决方案1】:

您需要通过将按钮名称添加到 __EVENTTARGET 隐藏输入中,让 ASP.NET 应用“认为”您单击了计算按钮。

formData = (
    ('__VIEWSTATE', viewstate),
    ('__VIEWSTATEGENERATOR', viewstategen),
    ('ctl00$MainContent$transport', '100'),
    ('ctl00$MainContent$quantity','150'),
    ('ctl00$MainContent$wastepct','200'),
    ('__EVENTTARGET', 'ctl00$MainContent$calculate')
)

【讨论】:

  • 工作就像一个魅力!谢谢@kblok。
  • 另一个快速问题;你怎么知道__EVENTTARGETct100$MainContent$calculate 相关联?我在页面源中看不到它们之间的任何联系。
  • @varun 因为这是 ASP.NET 内部结构的一部分。为了实现服务器控件事件,例如calculate.click,ASP.NET 需要以某种方式知道哪个是执行帖子的控件。正在使用 __EVENTTARGET 和 __EVENTARGUMENTS(如果需要)解决这个问题,但点击没有参数。
  • @hardkoded 感谢您的回答。我现在正在做类似的事情,但是这段代码不起作用,它说: AttributeError: 'NoneType' object has no attribute 'tex
  • @hardkoded 你能看看这个问题吗,stackoverflow.com/questions/71165790/…
猜你喜欢
  • 2021-06-09
  • 2016-11-27
  • 2018-12-25
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
相关资源
最近更新 更多