2014 dxdy logo

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

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




 
 Программа парсер не видит некоторые страницы сайта
Сообщение04.02.2022, 12:31 
Доброе утро. Я нашёл готовый скрипт для парсинга всех курсов сайта 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 
Проблема не с 3078-м курсом, а чуть ранее: 3074, 3075, 3076... У вас парсер заваливается....

 
 
 
 Re: Программа парсер не видит некоторые страницы сайта
Сообщение06.02.2022, 15:46 
Mihaylo в сообщении #1548042 писал(а):
У вас парсер заваливается....

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

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group