Ошибка в работе парсера, запись в Excel файл

from bs4 import BeautifulSoup
import requests as req
import pandas as pd

link = 'https://habr.com/ru/top/page2/'


def make_Hyperlink(text, link):
    return '=HYPERLINK("%s", "%s" )' % (link.format(link), text)


def goParse(link):
    titles, links, times, hyperlinks = [], [], [], []
    counter = 1
    while (True):
        print(counter)
        res = req.get(link + str(counter))
        html = BeautifulSoup(res.text, 'lxml')
        times += html.find_all('span', class_='post_time')
        links_a = html.find_all('a', class_='post__title_link')
        page = html.find_all('a', id='next_page')
        for a in links_a:
            hyperlinks.append(make_Hyperlink(a.text, a['href']))
        if page == 'None':
            break
        else:
            counter += 1

    for i, time in enumerate(times):
        times[i] = time.text
    df = pd.DataFrame()
    df['Время'] = times
    df['Ссылки и заголовки'] = hyperlinks

    writer = pd.ExcelWriter('./habr.xlsx', engine='xlsxwriter')
    df.to_excel(writer, sheet_name='лист 1', index=False)
    writer.sheets['лист 1'].set_column('A:A', 20)
    writer.sheets['лист 1'].set_column('B:B', 140)
    writer.save()

goParse(link)

Работает только счётчик и ему плевать сколько там всего страниц, он идет бесконечно, даже эксель файл не создается.


Ответы (1 шт):

Автор решения: Jack_oS

Вы к изначальной ссылке вида

link = 'https://habr.com/ru/top/page2/'

дописываете counter

res = req.get(link + str(counter))

в итоге получаете 404 для адреса:

'https://habr.com/ru/top/page2/2'

Меняйте номер страницы в goParse():

def goParse():
    titles, links, times, hyperlinks = [], [], [], []
    page_num = 2
    while True:
        print(page_num)
        res = requests.get(f'https://habr.com/ru/top/page{page_num}/')
        html = BeautifulSoup(res.text, 'lxml')
        times += html.find_all('span', class_='post_time')
        links_a = html.find_all('a', class_='post__title_link')
        page = html.find_all('a', id='next_page')
        for a in links_a:
            hyperlinks.append(make_Hyperlink(a.text, a['href']))
        if page == 'None':
            break
        else:
            page_num += 1

    print(hyperlinks)

PS page_num должен начинаться с 2


UPD запуск goParse() с while page_num < 5: (страницы 2-4) отдает hyperlinks с 38 ссылками/тайтлами:

[
    '=HYPERLINK("https://habr.com/ru/post/538870/", "Кодирование Рида-Соломона для чайников" )', 
    '=HYPERLINK("https://habr.com/ru/company/audiomania/blog/540612/", "Что послушать, когда пишешь код: бесплатные миксы, заглушка для второго монитора и эмбиент-плеер" )', 
    '=HYPERLINK("https://habr.com/ru/post/541322/", "Author.today — пираты под флагом копирайта?" )', '=HYPERLINK("https://habr.com/ru/company/itelma/blog/540784/", "Тренды 2021 в индустрии полупроводников" )', 

...

    '=HYPERLINK("https://habr.com/ru/post/540130/", "Скромное обаяние конспирологии" )', 
    '=HYPERLINK("https://habr.com/ru/post/541330/", "[приглашение] Запись саундтреков в жанре киберпанк для OSINT инструмента" )', 
    '=HYPERLINK("https://habr.com/ru/company/rostelecom/blog/541208/", "Как мы автоматизировали тестирование верстки сайта с помощью скриншотов" )'
]
→ Ссылка