Доброе утро. Я нашёл готовый скрипт для парсинга всех курсов сайта stepik.org, запустил его и он, проработав около суток, составил список всех курсов, однако я обнаружил что среди найденных им курсов нет по меньшей мере одного, а раз так то может не оказаться и ста одного. Для работы скрипта надо указать начальный номер страницы сайта с которого начинаем поиски и конечный номер на котором заканчиваем. Я попробовал бить локально по малому диапазону вокруг нужной страницы и обнаружил что парсер в большинстве случаев её видит, но не всегда. В первом запуске увидел, во втором нет, начиная с третьего - да, причём начиная с третьего парсер начал видеть что страницы рядом с ней тоже содержат в себе курсы, а не являются пустыми
Вот код скрипта:
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()
Я решил что проблема может быть в условии
if title != None and leaners != None:
и немного переделал код, убрал условие, а ещё удвоил задержку времени между отправлением запросов:
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 опять была парсером не замечена. Что сделано не так? Как исправить парсер чтобы он всегда видел все страницы сайта, а не в зависимости от диапазона задаваемых значений или номера попытки?