Динамический веб-соскоб - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь почистить эту страницу ("http://www.arohan.in/branch-locator.php"), в которой при выборе штата и города будет отображаться адрес, и мне нужно записать штат, город и адрес в файле csv / excel. Я могу достичь этого до шага, теперь я застрял.

Вот мой код:

from selenium import webdriver  
from selenium.webdriver.support.ui import WebDriverWait

chrome_path=  r"C:\Users\IBM_ADMIN\Downloads\chromedriver_win32\chromedriver.exe"
driver =webdriver.Chrome(chrome_path)
driver.get("http://www.arohan.in/branch-locator.php")
select = Select(driver.find_element_by_name('state'))
select.select_by_visible_text('Bihar')
drop = Select(driver.find_element_by_name('branch'))
city_option = WebDriverWait(driver, 5).until(lambda x: x.find_element_by_xpath("//select[@id='city1']/option[text()='Gaya']"))
city_option.click()

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

В слегка организованной манере:

import requests
from bs4 import BeautifulSoup

link = "http://www.arohan.in/branch-locator.php?"


def get_links(session,url,payload):
    session.headers["User-Agent"] = "Mozilla/5.0"
    res = session.get(url,params=payload)
    soup = BeautifulSoup(res.text,"lxml")
    item = [item.text for item in soup.select(".address_area p")]
    print(item)

if __name__ == '__main__':
    for st,br in zip(['Bihar','West Bengal'],['Gaya','Kolkata']):
        payload = {
            'state':st ,
            'branch':br 
        }
        with requests.Session() as session:
            get_links(session,link,payload)

Выход:

['Branch', 'House no -10/12, Ward-18, Holding No-12, Swarajpuri Road, Near Bank of Baroda, Gaya Pin 823001(Bihar)', 'N/A', 'N/A']
['Head Office', 'PTI Building, 4th Floor, DP Block, DP-9, Salt Lake City Calcutta, 700091', '+91 33 40156000', 'contact@arohan.in']
0 голосов
/ 29 августа 2018

Лучшим подходом было бы избегать использования селена. Это полезно, если вам требуется обработка JavaScript, необходимая для визуализации HTML. В вашем случае это не нужно. Необходимая информация уже содержится в HTML.

Требуется сначала сделать запрос на получение страницы, содержащей все состояния. Затем для каждого состояния запрашивайте список филиалов. Затем для каждой комбинации состояния / ветви можно сделать запрос URL, чтобы получить HTML-код, содержащий адрес. Это происходит во второй записи <li> после записи <ul class='address_area'>:

from bs4 import BeautifulSoup
import requests
import csv
import time

# Get a list of available states
r = requests.get('http://www.arohan.in/branch-locator.php')
soup = BeautifulSoup(r.text, 'html.parser')
state_select = soup.find('select', id='state1')
states = [option.text for option in state_select.find_all('option')[1:]]

# Open an output CSV file
with open('branch addresses.csv', 'w', newline='', encoding='utf-8') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow(['State', 'Branch', 'Address'])

    # For each state determine the available branches
    for state in states:
        r_branches = requests.post('http://www.arohan.in/Ajax/ajax_branch.php', data={'ajax_state':state})
        soup = BeautifulSoup(r_branches.text, 'html.parser')

        # For each branch, request a page contain the address
        for option in soup.find_all('option')[1:]:
            time.sleep(0.5)     # Reduce server loading
            branch = option.text
            print("{}, {}".format(state, branch))
            r_branch = requests.get('http://www.arohan.in/branch-locator.php', params={'state':state, 'branch':branch})
            soup_branch = BeautifulSoup(r_branch.text, 'html.parser')
            ul = soup_branch.find('ul', class_='address_area')

            if ul:
                address = ul.find_all('li')[1].get_text(strip=True)
                row = [state, branch, address]
                csv_output.writerow(row)
            else:
                print(soup_branch.title)

Предоставление вам выходного файла CSV, начиная с:

State,Branch,Address
West Bengal,Kolkata,"PTI Building, 4th Floor,DP Block, DP-9, Salt Lake CityCalcutta, 700091"
West Bengal,Maheshtala,"Narmada Park, Par Bangla,Baddir Bandh Bus Stop,Opp Lane Kismat Nungi Road,Maheshtala,Kolkata- 700140. (W.B)"
West Bengal,ShyamBazar,"First Floor, 6 F.b.T. Road,Ward No.-6,Kolkata-700002"

Вам следует замедлить работу сценария, используя time.sleep(0.5), чтобы избежать слишком большой нагрузки на сервер.

Примечание: [1:] используется в качестве первого элемента в раскрывающихся списках, это не ветвь или состояние, а запись Select Branch.

0 голосов
/ 29 августа 2018

Селен необходим? Похоже, вы можете использовать URL-адреса, чтобы получить то, что вы хотите: http://www.arohan.in/branch-locator.php?state=Assam&branch=Mirza.

Получите список комбинаций штат / ветвь, а затем используйте красивое руководство по супу, чтобы получить информацию с каждой страницы.

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