Как очистить всплывающее окно, используя Python и Селен - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь очистить данные Ngo, такие как имя, номер мобильного телефона, город и т. Д. От https://ngodarpan.gov.in/index.php/search/. В нем указаны названия НПО в табличном формате, и при нажатии на каждое имя открывается всплывающая страница.В приведенном ниже коде я извлекаю атрибут onclick для каждой неправительственной организации. Я выполняю запрос с последующим почтовым запросом для извлечения данных.Я пытался получить к нему доступ с помощью селена, но данные json не поступают.

list_of_cells = []
for cell in row.find_all('td'):
        text = cell.text.replace(" ", "") 
        list_of_cells.append(text)
 list_of_rows.append(list_of_cells)
 writer=csv.writer(f)
 writer.writerow(list_of_cells)

Реализуя вышеуказанную часть, мы можем получить полную информацию о таблице всех страниц. На этом веб-сайте 7721 страница.мы можем просто изменить number_of_pages var.

Но наш мотив - найти номер телефона / электронный идентификатор Ngo, что является основной целью, которую мы получим после нажатия на ссылку ngo name name. Но это не просто ссылка для ссылки, аapi get req, сопровождаемый пост-запросом для извлечения data.find в сетевом разделе inspect

driver.get("https://ngodarpan.gov.in/index.php/search/") # load the web page
sleep(2)
....
....
driver.find_element(By.NAME,"commit").submit()
for page in range(number_of_pages - 1):
    list_of_rows = []
    src = driver.page_source # gets the html source of the page
    parser = BeautifulSoup(src,'html.parser') 
    sleep(1)
    table = parser.find("table",{ "class" : "table table-bordered table-striped" })
    sleep(1)
    for row in table.find_all('tr')[:]:
        list_of_cells = []
        for cell in row.find_all('td'):
                x = requests.get("https://ngodarpan.gov.in/index.php/ajaxcontroller/get_csrf")
                dat=x.json()
                z=dat["csrf_token"]
                print(z) # prints csrf token
                r= requests.post("https://ngodarpan.gov.in/index.php/ajaxcontroller/show_ngo_info", data = {'id':'','csrf_test_name':'z'})
                json_data=r.text  # i guess here is something not working it is printing html text but we need text data of post request like mob,email,and here it will print all the data .
                with open('data1.json', 'a') as outfile:
                    json.dump(json_data, outfile)
    driver.find_element_by_xpath("//a[contains(text(),'»')]").click()

Нет такого сообщения об ошибке, код выполняется, но печатает html-контент

<html>
...
...
<body>
        <div id="container">
                <h1>An Error Was Encountered</h1>
                <p>The action you have requested is not allowed.</p>    </div>
</body>
</html>

Ответы [ 3 ]

0 голосов
/ 10 июля 2019

Это можно сделать намного быстрее, избегая использования Selenium. Похоже, что их сайт постоянно запрашивает токен перед каждым запросом, возможно, вы можете пропустить это.

Ниже показано, как получить JSON, содержащий номер мобильного телефона и адрес электронной почты:

from bs4 import BeautifulSoup
import requests
import time

def get_token(sess):
    req_csrf = sess.get('https://ngodarpan.gov.in/index.php/ajaxcontroller/get_csrf')
    return req_csrf.json()['csrf_token']


search_url = "https://ngodarpan.gov.in/index.php/ajaxcontroller/search_index_new/{}"
details_url = "https://ngodarpan.gov.in/index.php/ajaxcontroller/show_ngo_info"

sess = requests.Session()

for page in range(0, 10000, 10):    # Advance 10 at a time
    print(f"Getting results from {page}")

    for retry in range(1, 10):

        data = {
            'state_search' : 7, 
            'district_search' : '',
            'sector_search' : 'null',
            'ngo_type_search' : 'null',
            'ngo_name_search' : '',
            'unique_id_search' : '',
            'view_type' : 'detail_view',
            'csrf_test_name' : get_token(sess), 
        }

        req_search = sess.post(search_url.format(page), data=data, headers={'X-Requested-With' : 'XMLHttpRequest'})
        soup = BeautifulSoup(req_search.content, "html.parser")
        table = soup.find('table', id='example')

        if table:
            for tr in table.find_all('tr'):
                row = [td.text for td in tr.find_all('td')]
                link = tr.find('a', onclick=True)

                if link:
                    link_number = link['onclick'].strip("show_ngif(')")
                    req_details = sess.post(details_url, headers={'X-Requested-With' : 'XMLHttpRequest'}, data={'id' : link_number, 'csrf_test_name' : get_token(sess)})
                    json = req_details.json()
                    details = json['infor']['0']

                    print([details['Mobile'], details['Email'], row[1], row[2]])
            break
        else:
            print(f'No data returned - retry {retry}')
            time.sleep(3)

Это даст вам следующий вид вывода для первой страницы:

['9871249262', 'pnes.delhi@yahoo.com', 'Pragya Network Educational Society', 'S-52559, Narela, DELHI']
['9810042046', 'mathew.cherian@helpageindia.org', 'HelpAge India', '9270, New Delhi, DELHI']
['9811897589', 'aipssngo@yahoo.com', 'All India Parivartan Sewa Samiti', 's-43282, New Delhi, DELHI']
0 голосов
/ 11 июля 2019

Я пытаюсь перебрать все страницы и извлечь данные за одну попытку После извлечения данных с одной страницы другие страницы не перебираются

....
....

    ['9829059202', 'cecoedecon@gmail.com', 'CECOEDECON', '206, Jaipur, RAJASTHAN']
    ['9443382475', 'odamindia@gmail.com', 'ODAM', '43/1995, TIRUCHULI, TAMIL NADU']
    ['9816510096', 'shrisaisnr@gmail.com', 'OPEN EDUCATIONAL DEVELOPMENT RESEARCH AND WELFARE', '126/2004, SUNDERNAGAR, HIMACHAL PRADESH']
    ['9425013029', 'card_vivek@yahoo.com', 'Centre for Advanced Research and Development', '25634, Bhopal, MADHYA PRADESH']
    ['9204645161', 'secretary_smvm@yahoo.co.in', 'Srijan Mahila Vikas Manch', '833, Chakradharpur, JHARKHAND']
    ['9419107550', 'amarjit.randwal@gmail.com', 'J and K Sai Star Society', '4680-S, Jammu, JAMMU & KASHMIR']
    No data returned - retry 2
    No data returned - retry 2
    No data returned - retry 2
    No data returned - retry 2
    No data returned - retry 2
...
...
0 голосов
/ 09 июля 2019

Переключение на iframe через Selenium и python

Вы можете использовать XPath для поиска:

iframe = driver.find_element_by_xpath("//iframe[@name='Dialogue Window']")

Затем переключитесь на:

driver.switch_to.frame(iframe)

Вот как вернуться к стандартному содержимому (из):

driver.switch_to.default_content()

Я полагаю, что в вашем случае имя «Диалогового окна» будет CalendarControlIFrame

Как только вы переключитесь на этот фрейм, вы сможете использовать Beautiful Soup для получения html фрейма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...