Как заставить мой код выполнить следующее для l oop? - PullRequest
0 голосов
/ 27 февраля 2020

Мой код останавливается перед завершением всех задач.

Это должно быть:

1 - получение ссылки из результатов поиска занятий по фитнесу на go на страницу отдельной студии.

2 - затем от отдельной студии страница (первая для l oop): A) возьмите название студии и напишите в csv. Б) получить ссылку на фитнес-класс из расписания занятий

3 - Открыть ссылку на страницу класса и взять имя класса (второе для l oop)

Это завершает шаг 2 и вместо переходя к шагу 3, он возвращается к начальной странице результатов поиска и повторяет шаг 1 для следующей студии по порядку.

Что я делаю не так? Заранее спасибо!

from selenium import webdriver
from bs4 import BeautifulSoup as soup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait as browser_wait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
import time
import re
import csv

# initialize the chrome browser
browser = webdriver.Chrome(executable_path=r'./chromedriver')

# URL
class_pass_url = 'https://www.classpass.com'

# Create file and writes the first row, added encoding type as write was giving errors
f = open('ClassPass.csv', 'w', encoding='utf-8')
headers = 'Studio, Name, Description, Image, Address, Phone, Email, Website\n'
f.write(headers)

# classpass results page
page = "https://classpass.com/search/e8-4rb/fitness-classes/58PHLz8oWT9"

browser.get(page)

# Browser waits

browser_wait(browser, 10).until(EC.visibility_of_element_located((By.CLASS_NAME, "line")))

# Scrolls to bottom of page to reveal all classes
# browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# Extract page source and parse
page_source = browser.page_source
page_soup = soup(page_source, "html.parser")

# Parse of class listings # Looks through results and gets link to class page
sessions = page_soup.findAll('li', {'class': '_3vk1F9nlSJQIGcIG420bsK'})

for session in sessions:
    # gets link to class page and
    session_link = class_pass_url + session.a['href']
    browser.get(session_link)

    browser_wait(browser, 10).until(EC.presence_of_element_located((By.CLASS_NAME, '_1ruz3nW6mOnylv99BOA_tm')))
    # parses class page
    session_page_source = browser.page_source
    session_soup = soup(session_page_source, "html.parser")

    # get studio name
    try:
        studio = session_soup.find('h2', {'class': 'gamma'}).text
    except (AttributeError, TypeError,) as e:
        pass

    # write studio name
    f.write(
        studio.replace(',', '|') + "\n")
    print('got studio name name')


    # gets link to individual class in classes schedule table 

    classses = page_soup.findAll('section', {'class': '_33uV0qMCu2Sfk4M3oTJjVv'})

    for classs in classses:
        classs_link = class_pass_url + classs.a['href']
        browser.get(classs_link)

        browser_wait(browser, 10).until(EC.presence_of_element_located((By.CLASS_NAME, '_1ruz3nW6mOnylv99BOA_tm')))

        # parses individual class page
        classses_page_source = browser.page_source
        classses_soup = soup(classses_page_source, "html.parser")

        try:
            classs_name = session_soup.find('span', {'data-component': 'LocalizableMessage'}).text
        except (AttributeError, TypeError,) as e:
            pass

        # gets class names
        f.write(
            classs_name.replace(',', '|') + "\n")
        print('got class name')

1 Ответ

0 голосов
/ 27 февраля 2020

Я не совсем уверен в вашей цели, поскольку ваш вопрос и ваш код совершенно необъяснимы.

Но, с моей точки зрения, я думаю, что это ваша цель.

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.firefox.options import Options


def Main():
    r = requests.get(
        "https://classpass.com/search/e8-4rb/fitness-classes/58PHLz8oWT9")
    soup = BeautifulSoup(r.text, 'html.parser')
    urls = []
    for item in soup.findAll("a", {'class': '_3Rgmjog5fetGEXICK2gVhh'}):
        item = item.get("href")
        urls.append(f"https://classpass.com{item}")
    return urls


options = Options()
options.add_argument('--headless')


def Second():
    urls = Main()
    studios = []
    links = []
    driver = webdriver.Firefox(options=options)
    for url in urls:
        print(f"Extracting: {url}")
        driver.get(url)
        soup = BeautifulSoup(driver.page_source, 'html.parser')
        studio = soup.find('h2', {'class': 'gamma'}).text
        studios.append(studio)
        for item in soup.findAll("a", {'href': True}):
            item = item.get("href")
            if item.startswith("/classes/"):
                print(item)
                links.append(f"https://www.classpass.com{item}")
    driver.quit()
    return links


def Third():
    links = Second()
    driver = webdriver.Firefox(options=options)
    for link in links:
        driver.get(link)
        soup = BeautifulSoup(driver.page_source, 'html.parser')
        try:
            name = soup.find(
                'span', {'data-component': 'LocalizableMessage'}).text
            print(name)
        except:
            pass
    driver.quit()


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