Я пытаюсь очистить все курсы, доступные в категории или на всем веб-сайте. 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