Лучшим подходом было бы избегать использования селена. Это полезно, если вам требуется обработка 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
.