如何使用请求POST方法从网站获取搜索结果?

时间:2019-10-10 08:15:56

标签: python beautifulsoup python-requests

我正在尝试获取网站搜索结果的输出,我正在使用请求发布方法来做到这一点。在下面,您可以从网址中看到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)

预期结果将以表格形式出现,我在网站上添加搜索前后的屏幕截图, 突出显示的是我需要获取的表格 < / p>

enter image description here enter image description here

1 个答案:

答案 0 :(得分: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后单击“提交”。)

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

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

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

inspecting network tab