Причёсываем код
Получилась довольно длинная простыня кода, поэтому её стоит структурировать и разбить на отдельные части. Чрезмерным абстрагированием заниматься не будем, просто разделим уже имеющуюся логику, чтобы с ней было проще работать.
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from xlsxwriter import Workbook
class PikabuParser:
def __init__(self, driver):
self.driver = driver
def load(self, url):
self.driver.get(url)
def load_comments(self):
comments_button_selector = 'button.comments__more-button'
button = self.driver.find_element(By.CSS_SELECTOR, comments_button_selector)
actions = ActionChains(driver)
actions.click(button).perform()
def extract_comments(self):
container_selector = 'div.comments__container'
container = driver.find_element(By.CSS_SELECTOR, container_selector)
inner_html = container.get_attribute('innerHTML')
soup = BeautifulSoup(inner_html, features='html.parser')
comment_selector = 'div.comment__body'
comments = soup.select(comment_selector)
comments_content = []
for comment in comments:
user_name = comment.select('div.comment__user')[0]['data-name']
user_link = comment.select('a.user')[0]['href']
body = '\n'.join(comment.select('div.comment__content')[1].stripped_strings)
comments_content.append({
'user_name': user_name,
'user_link': user_link,
'body': body
})
return comments_content
def save_to_xlsx(filename, data, headers):
workbook = Workbook(filename)
worksheet = workbook.add_worksheet()
worksheet.write_row(0, 0, headers)
for row, record in enumerate(data, 1):
worksheet.write_row(row, 0, record.values())
workbook.close()
driver = webdriver.Chrome()
parser = PikabuParser(driver)
url = 'https://pikabu.ru/story/trebuetsya_prograbloger__blogramist_zarplata_100k_9220311'
parser.load(url)
parser.load_comments()
comments = parser.extract_comments()
save_to_xlsx('comments.xlsx', comments,
['Имя пользователя', 'Ссылка', 'Комментарий'])