Очистка нескольких страниц с использованием Python и BeautifulSoup - URL-адрес веб-сайта не работает

Мой код Python успешно очищает текст с https://www.groupeactual.eu/offre-emploi и сохраняет их в файл csv.

Тем не менее, на указанном выше сайте есть несколько страниц, на которых я хотел бы иметь возможность парсить.

Например, с приведенным выше URL-адресом, когда я нажимаю ссылку на страницу 2, общий URL-адрес изменяется, но когда я использую этот URL-адрес в своем коде, я получаю результаты со страницы 1.

Как можно изменить мой код, чтобы собирать данные со всех доступных перечисленных страниц?

Мой код:

from bs4 import BeautifulSoup
import requests
import pandas as pd 

response = requests.get('https://www.groupeactual.eu/offre-emploi').text

soup = BeautifulSoup(response, "html.parser")

[Rest of the code goes here .... ]

person mustaqSHAH    schedule 17.07.2020    source источник


Ответы (1)


Данные загружаются через Ajax с другого URL. Этот скрипт проходит по всем страницам и печатает заголовки, ссылки с каждой страницы:

import re
import requests
from bs4 import BeautifulSoup


data = {
    '_token': "",
    'limit': "21",
    'order': "",
    'adresse': "",
    'google_adresse': "",
    'distance': "",
    'niveau-experience': "0;10",
    'relations[besoin][contrat][debut]': "",
    'js_range_demarrage_dates': "",
    'informations[remunerations]': "10000;100000",
    'page': ""
}

headers = {
    'X-Requested-With': 'XMLHttpRequest'
}

url = 'https://www.groupeactual.eu/offre-emploi?limit=21&order=&adresse=&distance=&niveau-experience=0%3B10&relations%5Bbesoin%5D%5Bcontrat%5D%5Bdebut%5D=&js_range_demarrage_dates=&informations%5Bremunerations%5D=10000%3B100000&page=1'
api_url = 'https://www.groupeactual.eu/offre-emploi/search'


urls = []
with requests.session() as s:
    soup = BeautifulSoup(s.get(url).content, 'html.parser')
    data['_token'] = soup.select_one('meta[name="csrf-token"]')['content']

    page = 1
    while True:
        data['page'] = page
        print('Page {}...'.format(page))
        soup = BeautifulSoup(s.post(api_url, data=data, headers=headers).content, 'html.parser')
        cards = soup.select('.card')
        if not cards:
            break

        for i, card in enumerate(cards, 1):
            u = re.search(r"'(.*?)'", card['onclick']).group(1)
            print('{:<5} {:<60} {}'.format(i, card.h3.text, u))
            urls.append(u)

        page += 1

print(urls)

Отпечатки:

Page 1...
1     Coffreur bancheur (H/F)                                      https://www.groupeactual.eu/offre-emploi/coffreur-bancheur-hf-ernee-RE0046450A46458?utm_medium=api&utm_campaign=Coffreur+bancheur+%28H%2FF%29-46458
2     PEINTRE H/F                                                  https://www.groupeactual.eu/offre-emploi/peintre-hf-laval-RE0046827A50628?utm_medium=api&utm_campaign=PEINTRE+H%2FF-50628
3     PEINTRE H/F                                                  https://www.groupeactual.eu/offre-emploi/peintre-hf-augny-AG5640208TAA50789?utm_medium=api&utm_campaign=PEINTRE+H%2FF-50789
4     Technicien Fibre Optique (h/f)                               https://www.groupeactual.eu/offre-emploi/technicien-fibre-optique-hf-forbach-AG5640208BCA50790?utm_medium=api&utm_campaign=Technicien+Fibre+Optique+%28h%2Ff%29-50790
5     CONDUCTEUR D'ENGINS H/F                                      https://www.groupeactual.eu/offre-emploi/conducteur-dengins-hf-amblainville-RE0047896A51376?utm_medium=api&utm_campaign=CONDUCTEUR+D%27ENGINS+H%2FF-51376
6     Technicien Informatique (h/f)                                https://www.groupeactual.eu/offre-emploi/technicien-informatique-hf-metz-RE0047858A52066?utm_medium=api&utm_campaign=Technicien+Informatique+%28h%2Ff%29-52066
7     Opérateur Traitement de Surface H/F                          https://www.groupeactual.eu/offre-emploi/operateur-traitement-de-surface-hf-bressuire-RE0050805A53145?utm_medium=api&utm_campaign=Op%C3%A9rateur+Traitement+de+Surface+H%2FF-53145
8     CHAUFFEUR PL SPL (H/F)                                       https://www.groupeactual.eu/offre-emploi/chauffeur-pl-spl-hf-boulogne-sur-mer-RE0047560A53509?utm_medium=api&utm_campaign=CHAUFFEUR+PL+SPL+%28H%2FF%29-53509
9     Technicien d'Installations Électriques (H/F)                 https://www.groupeactual.eu/offre-emploi/technicien-dinstallations-electriques-hf-metz-RE0048762A53801?utm_medium=api&utm_campaign=Technicien+d%27Installations+%C3%89lectriques+%28H%2FF%29-53801
10    Cuisinier en industrie agroalimentaire (H/F)                 https://www.groupeactual.eu/offre-emploi/cuisinier-en-industrie-agroalimentaire-hf-talmont-saint-hilaire-RE0073692A93442?utm_medium=api&utm_campaign=Cuisinier+en+industrie+agroalimentaire+%28H%2FF%29-93442
11    Préparateur de commandes (H/F)                               https://www.groupeactual.eu/offre-emploi/preparateur-de-commandes-hf-sevremoine-RE0074893A94943?utm_medium=api&utm_campaign=Pr%C3%A9parateur+de+commandes+%28H%2FF%29-94943

... and so on (until page 135)
person Andrej Kesely    schedule 17.07.2020
comment
Спасибо за ответ, я действительно хочу сохранить URL разных страниц в списке. Как я могу это сделать ? Извините, если мой вопрос немного наивен, я новичок в кодировании! - person mustaqSHAH; 17.07.2020
comment
спасибо за ответ, но могу ли я сохранить URL-адрес номера страницы отдельных страниц в списке? - person mustaqSHAH; 17.07.2020
comment
Большое спасибо ! На самом деле мне было интересно, можно ли получить ссылки самих номеров страниц в списке, например: www.example.com/page=1, www.example.com/page=2, .... и так далее на. Я был бы очень признателен за вашу помощь! - person mustaqSHAH; 17.07.2020
comment
Когда я пытаюсь увеличить последний номер (page=...) в URL-адресе, он просто перенаправляется обратно на страницу №. 1 ! Это основная проблема, с которой я сталкиваюсь. - person mustaqSHAH; 17.07.2020
comment
@mustaqSHAH Вот что я пытаюсь сказать ... данные, которые вы ищете, загружаются из другого места (см. Мой скрипт, URL-адрес https://www.groupeactual.eu/offre-emploi/search) - person Andrej Kesely; 17.07.2020
comment
Огромное спасибо за помощь. Если это возможно для вас, не могли бы вы объяснить и научить меня, как работает код? Я действительно хочу изучить этот тип продвинутого кодирования. Если это невозможно для вас, не проблема. Хорошего дня :) - person mustaqSHAH; 17.07.2020
comment
@mustaqSHAH Вы можете открыть вкладку «Сеть» в инструментах разработчика Firefox (в Chrome тоже есть что-то подобное) и посмотреть, где страница отправляет запросы. Нажмите на следующую страницу, и вы увидите POST-запросы к https://www.groupeactual.eu/offre-emploi/search с некоторыми параметрами. - person Andrej Kesely; 17.07.2020
comment
Хорошо, я понимаю, вы можете иметь в виду инструменты для разработки Chrome! У вас есть социальные сети, где мы можем связаться? У меня много вопросов по этому типу тем. Если это не нормально для вас, не проблема. Хочу еще раз поблагодарить вас за помощь! - person mustaqSHAH; 17.07.2020
comment
У меня есть еще один вопрос, можем ли мы установить ограничение на количество страниц, на которых мы заканчиваем поиск? - person mustaqSHAH; 17.07.2020
comment
@mustaqSHAH Конечно, поместите if page==10: break в цикл while. Измените 10 на нужный номер. - person Andrej Kesely; 17.07.2020
comment
не могли бы вы объяснить последнюю часть кода, [cards = soap.select(.card) и остальные ниже], где я могу найти эти параметры? - person mustaqSHAH; 23.07.2020
comment
@mustaqSHAH cards = soup.select('.card') — это селектор CSS, он выберет все теги с class="card". Вы можете увидеть теги, если вы это сделаете, например print(soup.prettify()), и понаблюдаете за структурой HTML. - person Andrej Kesely; 23.07.2020
comment
Я просмотрел запросы в инструментах разработчика. У меня есть еще несколько вопросов, я перечислю их: (1) Как вы сформировали словарь данных, использовали ли вы метод cURL для python? (2) Как вы сформировали словарь заголовков? (3) Как и почему вы присвоили значение ключу «_token» в словаре данных? (4) Не могли бы вы объяснить, что происходит в цикле while True? - person mustaqSHAH; 23.07.2020
comment
если можно помогите пожалуйста - person mustaqSHAH; 24.07.2020