2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Программа парсер не видит некоторые страницы сайта
Сообщение04.02.2022, 12:31 


30/03/20
363
Доброе утро. Я нашёл готовый скрипт для парсинга всех курсов сайта stepik.org, запустил его и он, проработав около суток, составил список всех курсов, однако я обнаружил что среди найденных им курсов нет по меньшей мере одного, а раз так то может не оказаться и ста одного. Для работы скрипта надо указать начальный номер страницы сайта с которого начинаем поиски и конечный номер на котором заканчиваем. Я попробовал бить локально по малому диапазону вокруг нужной страницы и обнаружил что парсер в большинстве случаев её видит, но не всегда. В первом запуске увидел, во втором нет, начиная с третьего - да, причём начиная с третьего парсер начал видеть что страницы рядом с ней тоже содержат в себе курсы, а не являются пустыми
Вот код скрипта:
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
from bs4 import BeautifulSoup
import requests
import time

def stepik_parser_kursi_loop():
        start = int(input('Введите начальное число: ')) #начальное число в адресе, с которого будем начинать парсинг
        number = int(input('Введите конечное число: ')) #конечное число в адресе, с которого будем начинать парсинг
        text_file = open('stepik.txt', 'a', encoding='utf-8')
        for i in range(start, number+1):
                url = 'https://stepik.org/course/' + str(i) + '/promo'
                hdr = {'User-Agent': 'Mozilla/5.0'}
                r = requests.get(url, headers=hdr)
                soup = BeautifulSoup(r.text, 'lxml')
                title = soup.find('h1', attrs={'class': 'course-promo__header'})
                leaners = soup.find('div', attrs={'class': 'course-promo-summary__students'})
                if title != None and leaners != None:
                        try:
                                text_file.write(url + '\n') #пишем в файл адрес
                                text_file.write(title.get_text() + '\n') #пишем в файл название курса
                                text_file.write(leaners.get_text().strip() + '\n') #пишем в файл количество учащихся
                        except:
                                print('error')
                        time.sleep(1)
                if i%100 == 0:
                        print(i) #смотрим, сколько урлов уже прошло, выводится число кратное 100
        return True

stepik_parser_kursi_loop()
 


Я решил что проблема может быть в условии
Используется синтаксис Python
if title != None and leaners != None:
и немного переделал код, убрал условие, а ещё удвоил задержку времени между отправлением запросов:
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
import sys

from bs4 import BeautifulSoup
import requests
import time


def stepik_parser_kursi_loop():
    start = int(input('Введите начальное число: '))
    number = int(input('Введите конечное число: '))
    text_file = open('stepik.txt', 'w', encoding='utf-8')
    for i in range(start, number + 1):
        url = 'https://stepik.org/course/' + str(i) + '/promo'
        hdr = {'User-Agent': 'Mozilla/5.0'}
        r = requests.get(url, headers=hdr)
        soup = BeautifulSoup(r.text, 'lxml')
        title = soup.find('h1', attrs={'class': 'course-promo__header'})
        learners = soup.find('div', attrs={'class': 'course-promo-summary__students'})
        try:
            text_file.write(url + '\n')
        except:
            text_file.write('error' + '\n')
        try:
            text_file.write(title.get_text() + '\n')
        except:
            text_file.write('error' + '\n')
        try:
            text_file.write(learners.get_text().strip() + '\n')
        except:
            text_file.write('error' + '\n')
        time.sleep(2)
        if i % 100 == 0:
            print(i)
        sys.stdout.flush()


stepik_parser_kursi_loop()


Но это не помогло, при парсинге начиная со страницы номер 1 страница 3078 опять была парсером не замечена. Что сделано не так? Как исправить парсер чтобы он всегда видел все страницы сайта, а не в зависимости от диапазона задаваемых значений или номера попытки?

 Профиль  
                  
 
 Re: Программа парсер не видит некоторые страницы сайта
Сообщение05.02.2022, 08:01 


12/07/15
2907
г. Чехов
Проблема не с 3078-м курсом, а чуть ранее: 3074, 3075, 3076... У вас парсер заваливается....

 Профиль  
                  
 
 Re: Программа парсер не видит некоторые страницы сайта
Сообщение06.02.2022, 15:46 


30/03/20
363
Mihaylo в сообщении #1548042 писал(а):
У вас парсер заваливается....

Что это значит, почему это происходит и как это исправить?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group