Делаю парсер hh ,но мой парсер собирает не все ссылки на странице

Делаю парсер hh на Python.На странице hh находится 50 карточек ,я пытаюсь получить все 50 ссылок на них,но при выполнении моей программы я получаю только 20 ссылок из 50.Может новые карточки подгружаются динамически,хотя в коде элемента присутствуют все 50 карточек.Кто может сказать в чем дело?

def pars3():
    url='https://ekaterinburg.hh.ru/search/vacancy?area=3&clusters=true&enable_snippets=true&ored_clusters=true&text=Python&search_period=7&hhtmFrom=vacancy_search_list'
    head={'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'}
    respons=requests.get(url,headers=head)
    src=respons.text

   
    m=[]
 
    soup=BeautifulSoup(src,'html.parser')
    zapros=soup.find_all('div',class_='vacancy-serp-item')
    for i in zapros:
        a=i.find_all('a',class_='bloko-link')
        for z in a:
            if z['href'][0]=='h' and z['href']!='https://feedback.hh.ru/article/details/id/5951':
                m.append(z['href'])



    return m

Как сделать так чтобы парсер стянул всю информацию с сайта ??


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

Автор решения: Дмитрий

По вопросу не совсем понятно, какую именно информацию Вам нужно вытянуть с сайта. Можно сделать следующим образом:

import requests
from bs4 import BeautifulSoup
from time import sleep


headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'}


list = []

for page in range(1, 3):
    url = f'https://ekaterinburg.hh.ru/search/vacancy?area=3&clusters=true&enable_snippets=true&ored_clusters=true&text=Python&search_period=7&page={page}&hhtmFrom=vacancy_search_list'
    r = requests.get(url, headers=headers).text
    soup = BeautifulSoup(r, 'lxml')
    card=soup.find_all('div',class_='vacancy-serp-item')
    for url in card:
        sleep(1)
        card_url = url.find('a', class_='bloko-link').get('href')
        list.append(card_url)

Получаем ссылки на каждую карточку, и записываем их в список. После этого проходимся ещё одним циклом. Но там нужно опять делать запрос, уже на полученные ссылки. И из карточки вытягивайте уже нужную вам информацию.

for data in list:
   sleep(1)
   r1 = requests.get(data, headers=headers).text
   soup = BeautifulSoup(r1, 'lxml')

Ну и, чтобы не нагружать сайт и оптимизировать работу программы, не держать все данные в памяти в процессе обработки, можно сделать функцию-генератор. Примерно как здесь: как правильно сделать код парсера для python

→ Ссылка