Невозможно поймать и ввести некоторое динамически сгенерированное число в поле ввода, чтобы заполнить некоторый результат - PullRequest
2 голосов
/ 26 июня 2019

Здравствуйте. Я пытаюсь собрать информацию с веб-сайта. https://www.nsekra.com/.. Нам нужно выбрать Non-Individual из выпадающего списка, затем ввести PAN как AAAHA0064Q и captcha number, который генерирует случайное число каждый раз, когдасайт посещен или открыт.После этого нам нужно нажать кнопку Search, чтобы получить необходимую информацию.

import requests
from bs4 import BeautifulSoup

resp = requests.get('https://www.nsekra.com/')
soup = BeautifulSoup(resp.text,'lxml')
dictinfo = {i['name']:i.get('value','') for i in soup.select('input[name]')}

# trying to enter PAN as 'AAAHA0064Q'
dictinfo['txtPan']='AAAHA0064Q'

# trying to get captcha number & passing to textbox
captcha_number = soup.select_one("#lblDynamicCode").text
print('Fetched Catpcha No. -> ',captcha_number);
dictinfo['txtImageBox'] = captcha_number

# passsing pan no. & captcha number to the request method  
resp2 = requests.post('https://www.nsekra.com/',data=dictinfo)
soup2 = BeautifulSoup(resp2.text,'lxml')
name = soup2.select_one('#lblKra_name').text
print('KRA Name : '+name)

ВЫХОД

print('Fetched Catpcha No. -> ',s);

Полученный номер Catpcha -> 757205

print(soup2.prettify());

enter image description here

print('KRA Name : '+name)

KRA Имя:

Ожидаемый результат

KRA Имя: CVL KRA

Как вы можете видеть, я могу получить номер капчи, но когда я пытаюсь передать его на сайт, он регенерирует новый номер каждый раз, когда сайтпосещается.Таким образом, в основном, приведенный выше код получает номер капчи, но при посещении веб-сайта генерируется новый номер, и вместо нового номера передается старый или предыдущий номер, а не текущий номер при посещении веб-сайта.Как я могу получить и использовать это динамически генерируемое число, чтобы получить результаты, которые меня интересуют? Мне нравится придерживаться библиотеки requests, чтобы сделать это.

Ответы [ 3 ]

3 голосов
/ 29 июня 2019

Хотя вы четко упомянули, что вы хотите использовать модуль requests для получения этого имени, я в любом случае хотел бы предоставить вам решение, связанное с селеном, на тот случай, если кто-нибудь с подобной проблемой натолкнется на этот пост в поисках какого-либо решения..

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

link = "https://www.nsekra.com/"

def get_name(driver,url):

    driver.get(url)
    select = Select(wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "select[id='ddlKyc']"))))
    select.select_by_visible_text("Non-Individual")

    wait.until(EC.presence_of_element_located((By.ID,"txtPan"))).send_keys("AAAHA0064Q")
    dynamic_number = wait.until(EC.presence_of_element_located((By.ID,"lblDynamicCode"))).text
    wait.until(EC.presence_of_element_located((By.ID,"txtImageBox"))).send_keys(dynamic_number)
    wait.until(EC.presence_of_element_located((By.ID, "btnAllKRA"))).click()

    name = wait.until(EC.presence_of_element_located((By.ID, "lblKra_name"))).text
    print(name)

if __name__ == "__main__":
    driver = webdriver.Chrome()
    wait = WebDriverWait(driver,10)
    try:
        get_name(driver,link)
    finally:
        driver.quit()

Вывод:

CVL KRA
3 голосов
/ 29 июня 2019

Важной частью является выполнение ваших запросов в сеансе, а не публикация всех параметров, найденных во входных данных, в качестве данных (важно только btnAllKRA):

import requests
from bs4 import BeautifulSoup

with requests.Session() as session:     # <---- IMPORTANT!

    resp = session.get('https://www.nsekra.com/')
    soup = BeautifulSoup(resp.text,'lxml')
    dictinfo = {i['name']:i.get('value','') for i in soup.select('input[name]')}

    # trying to enter PAN as 'AAAHA0064Q'
    dictinfo['txtPan']='AAAHA0064Q'

    # trying to get captcha number & passing to textbox
    captcha_number = soup.select_one("#lblDynamicCode").text
    print('Fetched Catpcha No. -> ',captcha_number);
    dictinfo['txtImageBox'] = captcha_number

    for k in [*dictinfo.keys()]:        # <---- IMPORTANT!
        if k.lower().startswith('btn') and k.lower() != 'btnallkra':
            del dictinfo[k]

    # passsing pan no. & captcha number to the request method
    resp2 = session.post('https://www.nsekra.com/',data=dictinfo)
    soup2 = BeautifulSoup(resp2.text,'lxml')

    name = soup2.select_one('#lblKra_name').text
    print('KRA Name : '+name)

Печать:

Fetched Catpcha No. ->  314885
KRA Name : CVL KRA
0 голосов
/ 29 июня 2019

Ответ на первый запрос GET включает некоторые файлы cookie, которые выглядят как токены безопасности.

Итак, если вы используете сайт в соответствии с вашими лицензионными соглашениями при использовании python, вы можете включить те же куки во второй запрос, например, используя Session :

with requests.Session() as session:
    resp = session.get(...)
    ...
    resp2 = session.post(...)
...