【问题标题】:Scraping Multiple Page using Python and BeautifulSoup - Website url does not work使用 Python 和 BeautifulSoup 抓取多个页面 - 网站 url 不起作用
【发布时间】:2020-11-07 09:05:26
【问题描述】:

我的 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 .... ]

【问题讨论】:

    标签: python html web-scraping page-numbering


    【解决方案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)
    

    【讨论】:

    • 谢谢你的回答,我其实是想把不同页面的url存储在一个列表中。我怎样才能做到这一点 ?对不起,如果我的问题有点天真,我是编码新手!
    • 谢谢您的回复,但是我可以将各个页面的页码的url存储在一个列表中吗?
    • 非常感谢!实际上我想知道是否可以在列表中获取页码本身的链接,例如: www.example.com/page=1 , www.example.com/page=2, .... 等等在。非常感谢您的帮助!
    • 当我尝试增加 URL 中的最后一个数字 (page=...) 时,它只是重定向回页码。 1!这是我面临的主要问题。
    • @mustaqSHAH 这就是我想说的...您要查找的数据是从其他地方加载的(请参阅我的脚本,URL 是 https://www.groupeactual.eu/offre-emploi/search
    猜你喜欢
    • 1970-01-01
    • 2018-02-21
    • 2014-12-17
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多