Использование Selenium для парсинга веб-страниц: пошаговое руководство
Введение
Мы знаем, что парсинг веб-страниц стал значительным инструментом для извлечения данных с веб-сайтов, позволяя нам получать информацию, анализировать тренды и принимать обоснованные решения. В этом блоге мы рассмотрим реальный пример парсинга веб-страниц с использованием фреймворка Selenium в Python (Jupyter Notebook). Нашей целью является: извлечение контактной информации о членах законодательного собрания с официального сайта Законодательного собрания Теланганы.
Парсинг профилей членов Законодательного собрания
Предоставленный Python-код демонстрирует, как парсить необходимые данные из профилей членов с веб-сайта Законодательного собрания Теланганы. Вот обзор основных шагов:
Настройка окружения
- Чтобы начать, убедитесь, что у вас установлены необходимые библиотеки:
#Вы можете установить эти библиотеки с помощью pip:
!pip install selenium
- Импортируйте необходимые библиотеки и установите параметры Chrome.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
import pandas as pd
option = webdriver.ChromeOptions()
from selenium.webdriver.common.by import By
import numpy as np
- Инициализируйте экземпляр Chrome WebDriver с использованием ChromeDriverManager.
option.add_experimental_option("excludeSwitches", ["enable-automation"])
option.add_experimental_option('useAutomationExtension', False)
option.add_argument("--disable-infobars")
option.add_argument("start-maximized")
option.add_argument("--disable-extensions")
#chrome to stay open
option.add_experimental_option("detach", True)
# Pass the argument 1 to allow and 2 to block
option.add_experimental_option("prefs", {
"profile.default_content_setting_values.notifications": 2
})
PATH = "путь к Chrome Driver\\chromedriver.exe"
driver = webdriver.Chrome(PATH,options=option)
- Перейдите по целевому URL.
URL="https://legislature.telangana.gov.in/assemblymemprofile?selectedtab=m"
driver.get(URL)
time.sleep(4)
- Извлеките все веб-ссылки на странице, а затем отфильтруйте только те, которые ведут на отдельные профили членов.
link1=[]
links = driver.find_elements(by='tag name', value='a')
for link in links:
href = link.get_attribute("href")
if href and "memid" in href:
link1.append(href)
- Переберите каждую ссылку на профиль члена и извлеките соответствующую информацию, такую как имя, адрес, контактный номер и электронная почта. Наконец, сохраните полученные данные в списки.
data2=[]
nm1=[]
for m in range(len(link1)):
time.sleep(1)
driver.get(link1[m])
time.sleep(1)
nm=driver.find_element('xpath','//*[@id="mlapersonalprofile"]/div[1]/table/tbody/tr[1]/td[2]/div').text
nm=nm.split("\n")
nm1.append(nm)
# Locate the table by some attribute (e.g., class or ID)
table = driver.find_element(by='id', value='mlapersonalprofile') # Replace 'table-id' with the actual ID of the table
dt1 = table.find_elements(by='tag name', value='th')
tab1 = []
for j in range(len(dt1)):
#print(dt1[j].text)
tab=dt1[j].text
if tab in ['Permanent Address','Contact Number','Email Id']:
print(j)
row = dt1[j].find_element('xpath',"./ancestor::tr")
# Find data cells (<td>) within the same row
data = row.find_elements(by='tag name', value='td')
for k in data:
data1=k.text
data1=data1.replace('\n'," ")
data2.append(data1)
driver.back()
Обработка и анализ данных
После парсинга данных, код обрабатывает и организует их с помощью библиотеки pandas и numpy. Парсинг данных включает имена участников, партии, избирательные округа, адреса, контактные номера и адреса электронной почты.
Полученные данные будут выглядеть примерно так:
Теперь, так как мы хотим получить данные в трех столбцах, где первый элемент списка (data2) будет в первом столбце, второй элемент - во втором столбце, а третий элемент - в третьем столбце, а остальные элементы - в следующих столбцах.
#переформатирование
data3=[data2[i:i+3] for i in range(0, len(data2), 3)]
df=pd.DataFrame(data3)
df.columns=['Адрес','Контактный номер','Email']
df
Полученный датафрейм после переформатирования будет выглядеть так:
Объединение данных с избирательными округами и названиями партий, извлеченными в список 'nm1':
df2=pd.DataFrame(nm1)
df2.columns=['Депутат','Партия','Избирательный округ']
df2['Партия']=df2['Партия'].str.replace('(',"").str.replace(')',"")
df2
df=pd.concat([df2,df],axis=1)
Итоговый датафрейм:
Сохранение данных в CSV-файл
После обработки и организации данных они сохраняются в CSV-файле для дальнейшего анализа и хранения. Функция DataFrame.to_csv()
используется для записи данных в CSV-файл на локальной системе.
df.to_csv("Путь для сохранения файла\\Telangana_MLAContactDetails.csv", index=False)
Заключение
В этом блог-посте мы рассмотрели, как использовать Selenium в Python для парсинга веб-страниц. Автоматизируя процесс навигации по страницам и извлечения нужной информации, мы можем эффективно собирать структурированные данные для анализа и принятия решений. Мы рассмотрели предоставленный код на Python, который демонстрирует, как извлечь необходимую информацию о членах законодательного собрания с веб-сайта, обработать данные и сохранить их в CSV-файле. Парсинг веб-страниц открывает возможности для извлечения и анализа данных, позволяя нам получать ценные сведения с веб-сайтов. Также следует отметить, что парсинг веб-страниц несет этическую ответственность. Всегда соблюдайте условия использования веб-сайта, следуйте bewt практикам и убедитесь, что ваши действия по парсингу не перегружают сервер. Учитывая эти моменты, можно использовать мощь парсинга веб-страниц для получения ценных сведений из обширного мира интернета в минимальные сроки.
References:
Простыми словами
Спасибо, что вы являетесь частью нашего сообщества! Перед тем, как уйти:
- Обязательно поставьте лайк и подпишитесь на автора! 👏
- Вы можете найти еще больше контента на PlainEnglish.io** 🚀**
- Подпишитесь на наш бесплатный еженедельный бюллетень. 🗞️
- Следите за нами в Twitter, LinkedIn, YouTube и Discord**.**