【问题标题】:How to use Requests POST method to get the search result from website?如何使用 Requests POST 方法从网站获取搜索结果?
【发布时间】:2019-10-10 08:15:56
【问题描述】:

我正在尝试获取网站搜索结果的输出,我正在使用请求发布方法来执行此操作。您可以在下面看到来自 url 的 FORM 和 INPUT html。我需要在表单的输入中获取每个搜索结果。

我已经尝试了下面的代码但它什么也没返回

import requests
from bs4 import BeautifulSoup

# FORM from website
# <form name="form1" method="post" action="payerOrVoenChecker.jsp">

# INPUT from the website
# <input type="text" name="voen" size="38" style="BACKGROUND-COLOR: #ffffff; BORDER-BOTTOM-STYLE: groove;
# BORDER-LEFT-STYLE: groove; BORDER-RIGHT-STYLE: groove; BORDER-TOP-STYLE: groove; COLOR: #000000; FONT-FAMILY:
# Tahoma, Arial; FONT-SIZE: 12px" value="">

request_headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.9',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Host': 'www.e-taxes.gov.az',
    'Origin': 'https://www.e-taxes.gov.az',
    'Referer': 'https://www.e-taxes.gov.az/ebyn/payerOrVoenChecker.jsp',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-User': '?1',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'YOUR USER AGENT',
}

voens = {2000460031,
         1000877741,
         1000877741,
         1500403661,
         1000877741,
         3000489411,
         1000877741,
         1802142932,
         }

tip = ['L',
       'P',
       ]

form_data = {
    'tip': tip,
    'voenOrName': 'V',
    'voen': voens,
    'name': '',
    'submit': '  Yoxla   ',
}


url = 'https://www.e-taxes.gov.az/ebyn/payerOrVoenChecker.jsp'

for voen in voens:
    form_data['voen'] = voen
    form_data['tip'] = tip
    response = requests.post(url, data=form_data, headers=request_headers)
    s = BeautifulSoup(response.content, 'lxml')
    sContent = s.findAll('table', {'class': 'com'})[0].findAll('tr', recursive=False)[1]
    outcome = sContent.get_text().strip()
    # .find("tr", recursive=False)
    print(outcome)

预期的结果会是表格形式,我添加的是网站搜索前后的截图,突出显示的是我需要获取的表格

【问题讨论】:

  • 我在回答中提供的代码是为了演示。将'YOUR USER AGENT' 部分更改为您自己的用户代理。从浏览器的开发人员工具的网络选项卡中复制它。否则,它可能无法正常工作。

标签: python beautifulsoup python-requests


【解决方案1】:

您缺少要在 POST 请求正文中发送的其他项目。

试试这个:

request_headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.9',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Host': 'www.e-taxes.gov.az',
    'Origin': 'https://www.e-taxes.gov.az',
    'Referer': 'https://www.e-taxes.gov.az/ebyn/payerOrVoenChecker.jsp',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-User': '?1',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'YOUR USER AGENT',
}

form_data = {
    'tip': 'L',
    'voenOrName': 'V',
    'voen': '1700393071',
    'name': '',
    'submit': '  Yoxla   ',
}

response = requests.post(url, data=form_data, headers=request_headers)

解决这些问题的最佳方法是在浏览器的开发人员工具中切换到网络选项卡。 Chrome 和 Firefox 的快捷键都是 F12。

  • 打开开发者工具后,转到网络选项卡。
  • 现在,提交您想要自动化的所有请求(例如,在这种情况下,在填写 ID 后单击提交)。

它将向您显示浏览器在后台发送的所有请求的列表。点击与您的 URL 匹配的那个。

将在右侧打开一个窗格,显示使用的方法(GET / POST)、请求中传递了哪些标头、发送了哪些数据(在 POST 的情况下)等。

我所做的只是从该选项卡中粘贴请求标头和表单数据。

【讨论】:

  • 有效,但我可以美化它,因为它返回所有内容(页面的整个 html),但我只需要答案
  • 我也可以使用多个 ('voen': xxxx) id 号码来搜索
  • @ValiValizada 对于多个 ID,您必须遍历所有 ID,然后在单独的 POST 请求中发送每个 ID。至于漂亮地打印 HTML 响应,请尝试print(soup.prettify())
  • @ValiValizada 在 for 循环中,将 ID 分配给 'form_data' 的 'voen' 键,如下所示:form_data['voen'] = voen。你不应该像那样在 POST 请求中传递一个列表。
  • @ValiValizada 通过this BeautifulSoup documentations.findAll 返回项目列表。您在该列表中使用find 方法,这是第一个错误。另一方面,first 只获取第一个标签,这不是一个列表,因此最后的 [1] 也会失败。您可能正在寻找的是s.findAll('table', {'class': 'com'})[0].findAll('tr', recursive=False)[1]
猜你喜欢
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2014-02-23
相关资源
最近更新 更多