1

I'm trying to scrape this page.

I want all of the links which description contain "Populations", or at least every link on the page.

Here is my current script:

    output = ""
    base_url = argv[1]
    response = requests.get(base_url)
    soup = bs4.BeautifulSoup(response.text, 'html.parser')
    em_box = soup.find_all("", href=True)

    for link in em_box:
        if len(argv) > 2:
            if re.match(argv[2].replace("?", "\xe9"),link.text):
                output += urljoin(base_url, link.get("href")) + "\n"
        else:
            output += urljoin(base_url, link.get("href")) + "\n"

where argv[1] is my url, and argv[2] is the text I am looking for - Populations

It works so far for basic http pages. For this one it seems that beautiful soup is not able to see results links from the url. For example I cannot see my "soup" the following: https://www.insee.fr/fr/statistiques/4265511

If you can point me some tips to deal with these kind of 'dynamic' pages.

Diggy.
  • 6,744
  • 3
  • 19
  • 38
Pdeuxa
  • 651
  • 7
  • 27
  • There are many different solution. Type into google "python javascript render scrape". (e.g. https://stackoverflow.com/questions/8049520/web-scraping-javascript-page-with-python) You need to let JavaScript render the html page before applying your scraping logic. – Tin Nguyen Jun 15 '20 at 10:33

1 Answers1

3

The page uses JavaScript to load the data. You can use requests module to simulate it.

For example:

import json
import requests
import urllib.parse


url = 'https://www.insee.fr/fr/statistiques?q=population+l%C3%A9gale&taille=10000&debut=00&theme=1&categorie=5'

url2 = 'https://www.insee.fr/fr/solr/consultation?q={q}'
document_url = 'https://www.insee.fr/fr/statistiques/{id}'
params = urllib.parse.parse_qs(urllib.parse.urlsplit(url).query)
json_payload = {"q": params['q'][0],"start":"00","sortFields":[{"field":"score","order":"desc"}],"filters":[{"field":"themeId","tag":"tagThemeId","values":params['theme']},{"field":"categorieId","tag":"tagCategorieId","values":params['categorie']},{"field":"rubrique","tag":"tagRubrique","values":["statistiques"]},{"field":"diffusion","values":[True]}],"rows":"10000","facetsQuery":[]}
data = requests.post(url2.format(q=params['q'][0]), json=json_payload).json()

# uncomment this to print all data:
# print(json.dumps(data, indent=4))

for document in data['documents']:
    if 'populations' in document['titre'].lower():
        print('{:<60} {}'.format(document['titre'], document_url.format(id=document['id'])))

Prints:

Populations légales 2017                                     https://www.insee.fr/fr/statistiques/4265511
Populations légales des départements en 2017                 https://www.insee.fr/fr/statistiques/4265390
Populations légales des régions en 2017                      https://www.insee.fr/fr/statistiques/4265384
Populations légales de Nouvelle-Calédonie en 2019            https://www.insee.fr/fr/statistiques/2122859
Populations légales 2015                                     https://www.insee.fr/fr/statistiques/3292701
Populations légales 2014                                     https://www.insee.fr/fr/statistiques/2525768
Populations légales 2016                                     https://www.insee.fr/fr/statistiques/3677855
Populations légales 2008                                     https://www.insee.fr/fr/statistiques/2127739
Populations légales des collectivités d'outre-mer en 2017    https://www.insee.fr/fr/statistiques/4265419
Téléchargement des fichiers par départements des populations légales en 2017 https://www.insee.fr/fr/statistiques/4265439
Téléchargement du fichier d'ensemble des populations légales en 2017 https://www.insee.fr/fr/statistiques/4265429
Populations légales de Mayotte en 2017                       https://www.insee.fr/fr/statistiques/2120838
Les populations légales de Wallis et Futuna en 2018          https://www.insee.fr/fr/statistiques/2121453
Populations légales 2013                                     https://www.insee.fr/fr/statistiques/2119504
Téléchargement des fichiers des populations légales des collectivités d'outre-mer en 2017 https://www.insee.fr/fr/statistiques/4265451
Populations légales des circonscriptions législatives pour les élections de 2017 https://www.insee.fr/fr/statistiques/2508230
Populations légales 2012                                     https://www.insee.fr/fr/statistiques/2119686
Populations légales 2011                                     https://www.insee.fr/fr/statistiques/2119751
Les populations légales de Polynésie française en 2017       https://www.insee.fr/fr/statistiques/2122700
Populations légales 2010                                     https://www.insee.fr/fr/statistiques/2128804
Populations légales 2009                                     https://www.insee.fr/fr/statistiques/2119804
Populations légales 2007                                     https://www.insee.fr/fr/statistiques/2119897
Populations légales 2006                                     https://www.insee.fr/fr/statistiques/2119923
Populations légales des collectivités d'outre-mer en 2015    https://www.insee.fr/fr/statistiques/3545753
Téléchargement du fichier d'ensemble des populations légales en 2015 https://www.insee.fr/fr/statistiques/3545833
Téléchargement des fichiers des populations légales des collectivités d'outre-mer en 2015 https://www.insee.fr/fr/statistiques/3545835
Populations légales des villages des îles Wallis et Futuna en 2008 https://www.insee.fr/fr/statistiques/2121413
Populations légales des districts des îles Wallis et Futuna en 2008 https://www.insee.fr/fr/statistiques/2121094
Populations communales 2006                                  https://www.insee.fr/fr/statistiques/2130410
Populations communales 2006 en ZUS                           https://www.insee.fr/fr/statistiques/2130333
Populations communales 2006 en ZFU                           https://www.insee.fr/fr/statistiques/2130338
Andrej Kesely
  • 168,389
  • 15
  • 48
  • 91
  • This is perfect ! I was trying to use Tin idea; but you solved my issue. I understand what you did, but can you just explain me how you found this url: url2 = 'https://www.insee.fr/fr/solr/consultation?q={q}'. Bravo and thank you very much ! – Pdeuxa Jun 15 '20 at 11:44
  • 1
    @Pdeuxa I saw this URL when I opened Firefox Developer Tools -> Network tab (and reloaded the page). This url contains all information that is rendered dynamically on the page. (Chrome has something similar too). – Andrej Kesely Jun 15 '20 at 11:46