Как я могу очистить данные, которые генерируются после нажатия «загрузить больше» и URL-адрес остается неизменным? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь очистить все курсы, доступные в категории или на всем веб-сайте. https://www.classcentral.com/subject. Однако на веб-сайте отображаются только 55 курсов одновременно (включая рекламу), и вам нужно нажать кнопку «Загрузить еще», которая генерируетЕще 50 курсов и т. Д. Я использовал селен для нажатия кнопки «загрузить больше», а затем вызвал функцию parse_subject для себя, чтобы получить точки данных загруженных курсов. Но скребок бесконечно очищает только первые 55 курсов.я заставляю скребок очищать следующий набор из 50 курсов, не чистя первый набор снова и снова, и продолжаю делать это до тех пор, пока не останется больше курсов? пожалуйста, помогите

Вот код для «загрузки следующих 50 курсов [всего] "

<button id="show-more-courses" class="btn-blue-outline width-14-16 medium- 
up-width-1-2 btn--large margin-top-medium text-center" data-page="2" 
style="" data-track-click="listing_click" data-track-props="{ 
"type": "Load More Courses", "page": "2" }}">
   <span class="small-up-hidden text--bold">Load more</span>
   <span class="hidden small-up-inline-block text--bold">
              Load the next 50 courses of 1127
          </span>
</button>

вот мой код

import scrapy
from scrapy.http import Request
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
class SubjectsSpider(scrapy.Spider):
    name = 'subjects'
    allowed_domains = ['class-central.com']
    start_urls = ['http://class-central.com/subjects']

    def __init__(self,subject=None):
        self.subject=subject

    def parse(self, response):
        if self.subject:
            print("True")
            subject_url=response.xpath('//*[contains(@title, "'+  self.subject + '")]/@href').extract_first()
            yield Request(response.urljoin(subject_url),callback=self.parse_subject,dont_filter=True)
        else:
            self.logger.info('Scraping all subjects')
            subjects=response.xpath('//*[@class="unit-block unit-fill"]/a/@href').extract()
            for subject in subjects:
                self.logger.info(subject)
                yield Request(response.urljoin(subject), callback=self.parse_subject,dont_filter=True)


    def parse_subject(self,response):
        subject_name=response.xpath('//title/text()').extract_first()
        subject_name=subject_name.split(' | ') [0]
        courses = response.xpath('//*[@itemtype="http://schema.org/Event"]')
        for course in courses:
            course_name = course.xpath('.//*[@itemprop="name"]/text()').extract_first()
            course_url = course.xpath('.//*[@itemprop="url"]/@href').extract_first()
            absolute_course_url = response.urljoin(course_url)

            yield{
            'subject_name':subject_name,
            'course_name':course_name,
            'absolute_course_url':absolute_course_url,
        }
    #for loading more courses
        global driver #declared global so that browser window does not close after finishing request.
        driver=webdriver.Chrome('C:/webdrivers/chromedriver')
        driver.get(response.url)
        print(driver.current_url)
        try:
            button_element = driver.find_element_by_id('show-more-courses')
        #button_element.click()
            driver.execute_script("arguments[0].click();",button_element)
            yield Request(response.url,callback=self.parse_subject,dont_filter=True)
        except NoSuchElementException:
            pass

1 Ответ

0 голосов
/ 20 июня 2019

Я считаю, что вы должны использовать селен, только если нет решения с запросами. Библиотека запросов намного быстрее и надежнее. Вот некоторый код, который проходит по всем страницам, а затем вы можете использовать Beautiful Soup для анализа HTML. Однако вам нужно будет установить Beautiful Soup, прежде чем использовать его, если хотите.


import requests
from bs4 import BeautifulSoup

for page in range(1, 10): #Change 10 to however many times you need to press "Load Next 50 Courses"
    params={'page': str(page)}
    next_page = requests.get("https://www.classcentral.com/subject/cs", params=params)
    soup = BeautifulSoup(next_page.text, 'html.parser')
    #Parse through html

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