【问题标题】:Python Requests: How to get value of Blank Hidden InputPython 请求:如何获取空白隐藏输入的值
【发布时间】:2021-09-20 03:55:22
【问题描述】:

我正在尝试抓取这个网站:https://case.occ.ok.gov/ords/f?p=1004:203

难题的缺失部分是在发出最终请求之前弄清楚如何“获取”数据负载中的p_request 参数。在查看“主”页面时,此字段为空,因此无法使用该字段传递给我的 POST 请求。

下面的代码不起作用,因为我在有效负载中有一个空白的p_request 参数,尽管我通过开发者控制台的测试知道,如果我能够获得p_request 字段,它将起作用。

# Query Main Site to Build Payload
url = 'https://case.occ.ok.gov/ords/f?p=1004:203'
r = requests.get(url)
soup = BeautifulSoup(r.text,'lxml')

# Get Cookie
cookies = {}
cookdat = r.cookies
cookies['ORA_WWV_APP_1004'] = cookdat.get('ORA_WWV_APP_1004')
cookies['X-Oracle-BMC-LBS-Route'] = cookdat.get('X-Oracle-BMC-LBS-Route')

# Create Payload
inputs = soup.select('input')
d_inputs = {i['id']:i.get('value','') for i in inputs}

data = [
  ('p_flow_id', '1004'),
  ('p_flow_step_id', '203'),
  ('p_instance', '%s'%d_inputs['pInstance']),
  ('p_debug', ''),
  ('p_request', ''),
  ('p_widget_name', 'worksheet'),
  ('p_widget_mod', 'PULL'),
  ('p_widget_action', ''),
  ('p_widget_num_return', '100000'),
  ('x01', '8980043036046866'),
  ('x02', '8985720770049096'),
  ('f01', 'R8980010866046866_column_search_current_column'),
  ('f01', 'R8980010866046866_search_field'),
  ('f01', 'R8980010866046866_row_select'),
  ('f02', ''),
  ('f02', ''),
  ('f02', '50'),
  ('p_json', '{"pageItems":{"itemsToSubmit":[{"n":"P203_LASTNAME","v":"%s"},{"n":"P203_FIRSTNAME","v":""},{"n":"P203_SEARCH_CRITERIA","v":"1"}],"protected":"%s","rowVersion":"","formRegionChecksums":[]},"salt":"%s"}'%(letter,d_inputs['pPageItemsProtected'],d_inputs['pSalt'])),
]

# POST request retrieve data
r = requests.post('https://case.occ.ok.gov/ords/wwv_flow.ajax', cookies=cookies, data=data)
print(r.text)

在开发者控制台中,我看到这个字段在进行我想要的提交类型时出现,即使它在主页上是空白的:

我如何“检索”这个字段,这是请求工作所必需的?

【问题讨论】:

  • 你想从那个页面抓取什么?你面临什么问题?我们没有时间检查您提供的所有代码并检查每一行。所以,请尝试以非常简单的方式提供足够的详细信息,我正在尝试这样做,这是我的代码,我正面临这个问题,我有这个想法,我在研究时发现了这个。
  • 我发现参数p 的模式在第一个1004:203: 中是这样的,总是相同的,即。直到他们手动更新,但这也在<html> 标签中。像这样<html class="page-203 app-1004" lang="en"><head>: 之后有 si 14 个随机数,对于可以在 ID 为 pInstanceinput 标记中找到的每个搜索,这将是不同的,但这是转折
  • 当您提交form 时,它首先将您在data 变量中提供的请求+数据发送到https://case.occ.ok.gov/ords/wwv_flow.accept,并且仅重定向到具有这些参数的网站。因此,我认为您还必须将更改后的数据发送到flow_accept,然后只有您才能在参数网站中获得结果。参数网站的意思是:https://case.occ.ok.gov/ords/f?p=1004:203:18186253354351::NO::: url,包含您要发送的所有参数。
  • 感谢您深入了解!是的,我也看到了,初始 POST 转到 flow_accept,我假设我会从帖子的响应中获取 instance_id。但是,我在该网站上玩耍时注意到的是,即使我更改了搜索词,instance_id 也保持不变,但是以某种方式进行搜索会更改实例的状态,如果我请求该 instance_id,我将获得新的搜索词。例如。如果我去(在浏览器中)提交新搜索,然后在 Python 中拉取 instance_id,即使 instance_id 没有改变,它也会返回新数据。
  • 是的!我也注意到了这一点。我认为他们将其保存在他们的服务器或web-storage 中。但最重要的是,你的问题解决了吗?

标签: python web-scraping python-requests


【解决方案1】:

这对我有用

import requests
import json
from bs4 import BeautifulSoup

# globals
users = []
letter = "A"

# session
session = requests.Session()

# get page
auth = session.get('https://case.occ.ok.gov/ords/f?p=1004:203')
soup = BeautifulSoup(auth.text, 'html.parser')

inputs = soup.select('input')
d_inputs = {i['id']: i.get('value', '') for i in inputs}

# create params
params = {
  'p_flow_id': d_inputs['pFlowId'],
  'p_flow_step_id': d_inputs['pFlowStepId'],
  'p_instance': d_inputs['pInstance'],
  'p_debug': '',
  'p_request': 'Search',
  'p_reload_on_submit': d_inputs['pReloadOnSubmit'],
  'p_page_submission_id': d_inputs['pPageSubmissionId'],
  'p_json': json.dumps({"pageItems": {
    "itemsToSubmit": [
      {"n": "P203_LASTNAME", "v": "{}".format(letter)},
      {"n": "P203_FIRSTNAME", "v": ""},
      {"n": "P203_SEARCH_CRITERIA", "v": "1"}
    ],
    "protected": d_inputs['pPageItemsProtected'],
    "rowVersion": "",
    "formRegionChecksums": []
    },
    "salt": d_inputs['pSalt']
  })
}

# Send request to APEX
session.post(
  'https://case.occ.ok.gov/ords/wwv_flow.accept', data=params
)

# get page with data (first)
data_page = session.get(
  'https://case.occ.ok.gov/ords/f?p=1004:203:{}::NO:::'.format(
    d_inputs['pInstance']
  )
)

table_soup = BeautifulSoup(data_page.text, 'html.parser')

# new params
inputs = table_soup.select('input')
d_inputs = {i['id']: i.get('value', '') for i in inputs}
json_ajax_data = json.loads(data_page.text.split(
    'interactiveReport('
)[1].split(');})();')[0])

# get data for next pages
params_news = {
    'p_flow_id': params['p_flow_id'],
    'p_flow_step_id': params['p_flow_step_id'],
    'p_instance': params['p_instance'],
    'p_debug': '',
    'p_request': 'PLUGIN={}'.format(json_ajax_data['ajaxIdentifier']),
    'p_widget_name': 'worksheet',
    'p_widget_mod': 'ACTION',
    'p_widget_action': 'PAGE',
    'p_widget_action_mod': 'pgR_min_row=51max_rows=50rows_fetched=50',
    'p_widget_num_return': 50,
    'x01': d_inputs['R8980010866046866_worksheet_id'],
    'x02': d_inputs['R8980010866046866_worksheet_id'],
    'p_json': params['p_json']
}

# get next page data
next_page = session.post(
  'https://case.occ.ok.gov/ords/wwv_flow.ajax', data=params_news
)

next_page_soup = BeautifulSoup(next_page.text, 'html.parser')
next_page_table_with_data = table_soup.find('table', {'class': 'a-IRR-table'})
next_page_rows = next_page_table_with_data.find_all('tr')

# parse rows
for row_next_page in next_page_rows:
  cells_next_page = row_next_page.find_all('td')
  if len(cells_next_page) > 0:
    users.append(
      {
        'name': cells_next_page[0].text, 'surname': cells_next_page[1].text
      }
    )

print(users)
[
   {'name': 'ANDERSON', 'surname': 'MICHAEL L AND KAREN'}, 
   {'name': 'ALVAREZ', 'surname': 'PETRA'},
   ...
]

【讨论】:

  • 感谢您的帮助,这可以获取我能够执行的结果的第一页,但我想通过切换选项以通过 @987654323 列出“全部”来获取所有结果@ ,这似乎需要另一条信息:p_request
  • @DavidYang 对不起,我用wwv_flow.ajax将我的代码更改为wotk
  • 提取json_ajax_data 的部分是我正在寻找的缺失部分!现在为我工作,虽然我没有使用您逐页浏览的方法,而是将页面长度设置为 100000
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多