A Scrapper with python

Overview

Scrapper-en-python

Scrapper des données signifie récuperer des données pour les traiter ou les analyser. En python, il y'a 2 grands moyens de scrapper, tout d'abord en utilisant la librairie selenium, qui va simuler un navigateur, ou en utilisant request pour récuperer le code source et BeautifulSoup4 pour le traiter. Dans ce tuto, nous verrons uniquement la première méthode, pourquoi ? Car nous allons nous connecter à un compte et qu'il est bien plus simple de le faire avec selenium en envoyant des touches de clavier dans les input que d'envoyer des requêtes HTTP.

Utiliser selenium :

Pour uriliser selenium, nous allons tout d'abord l'installer avec pip install Selenium, puis nous allons avoir besoin de "WebDriver", c'est une petit programme qui est crée par le navigateur et qui permet de le controler. Dans notre tuto nous allons utiliser firefox, donc il nous faudra les "geckodriver", vous pouvez l'installer en ligne a partir de ce lien : https://github.com/mozilla/geckodriver/releases (il vous faudra bien évidemment Firefox installé).

Le code et les explications :

tout d'abord, nous allons importer le webdriver selenium et le module Key qui nous permettra de simuler des touches de clavier, pour cela nous allons rédiger comme cela :

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

nous allons maintenant définir le chemin d'accès au geckodriver pour que notre programme puisse l'utiliser,

path= "CHEMIN D'ACCES DE VOTRE GECKODRIVER"

nous allons maintenant définir la variable driver, qui nous permettra de démarrer notre navigateur et d'intéragir avec le site :

driver = webdriver.Firefox(executable_path=path)

la variable "executable_path" indique à selenium que notre geckodriver se trouve à la variable "path", qui souvenez vous, contient notre chemin d'accès. Nous pouvons maintenant aller sur notre site, pour ma part, je vais prendre ecoledirecte, qui est un site qui répértorie les notes, devoirs, et agenda des élèves (ce site est mis en place par les établissements scolaires), mon objectif va être de calculer ma moyenne générale, car celle-ci n'est pas affiché sur le site. Néanmoins nous avons les notes de chaque matière, (voir image ci-dessous) alt text

phase pratique :

Tout d'abord, il faut analyser le site, pour acceder à cette fameuse page contenant les notes (https://www.ecoledirecte.com/Eleves/0001/Notes), il faut passer une page de connexion qui demande un nom d'utilisateur et un mot de passe, ensuite, il faut récuperer les moyennes dans le code source, créer une variable nbrMoyenne contenant le nombre de moyenne, les additioner puis divisier le tout par nbrMoyenne. Ok, challenge accepted.

nous allons indiquer à selenium sur quelle page il doit se rendre (en l'occurence https://www.ecoledirecte.com/Eleves/0001/Notes) :

driver.get("https://www.ecoledirecte.com/Eleves/0001/Notes")

ensuite, nous allons chercher le xpath des éléments input qui nous intéressent (langage d'interrogation simple d'emploi, selon wikipédia).

Pour faire simple, le XPATH est un chemin qui permet de sélectionner un élément de la page web à partir des balyses. Par exemple, si on a un site web :

<html>
  <body>
    <div>
      <h1>Titre1</h1>
    </div>
    <div>
      <img src="symfunc.fr">
    </div>
  <body>
</html>

Le XPATH de l'élément Titre1 correspond à :

/html/body/div/h1

Et celui de l'image est :

/html/body/div[2]/img

Pour récuperer ce fameux xpath, il suffit d'aller sur le site qui nous intéresse, faire clique droit inspecter l'élément sur l'input qui nous intéresse, et dans le code source, clique droit -> copy -> full xpath (sinon voir image en dessous).

alt text

Bon, que faire de ce xpath ? nous allons le mettre dans une variable qui s'appelera username,

username = driver.find_element_by_xpath('/html/body/div[2]/div[1]/div/div/div[1]/div[3]/form/input[1]')

Comme vous le voyez, on utilise driver, qui est notre variable de navigateur, puis nous lui demandons de trouver l'élément grâce au xpath.

Nous allons répeter l'opération pour le mot de passe :

password = driver.find_element_by_xpath('/html/body/div[2]/div[1]/div/div/div[1]/div[3]/form/input[2]')

Et voila, selenium sait ou sont les éléments que nous avons demandé, maintenant, il s'agirait de les remplir avec nos informations de connexion non ? pour cela rien de plus simple :

username.send_keys("VOTRE NOM D'UTILISATEUR")
password.send_keys("VOTRE MOT DE PASSE")

Ensuite pour nous connecter, nous pouvons soit utiliser la touche entrée du clavier, soit trouver le bouton de connexion et cliquer dessus, personnelement j'ai opté pour la seconde option car cela nous permet de voir l'intéraction avec les éléments :

login = driver.find_element_by_xpath('/html/body/div[2]/div[1]/div/div/div[1]/div[3]/form/button').click()

Et oui, pour cliquer on doit juste rajouter le .click() à la fin de notre variable, fastoche non ?

Dans notre exemple, vu que nous avons demandé la page "https://www.ecoledirecte.com/Eleves/0001/Notes", le site va nous rediriger automatiquement sur l'onglet note, sinon vous pouvez utiliser le .click() et le xpath pour trouver la page dans un menu. Nous sommes maintenant sur la fameuse page de notes. C'est maintenant que ça devient intéressant. En analysant le code source, nous pouvons voir que les moyennes sont contenus dans des balises , sous forme de texte. Voilà le code source

alt text

Comme nous pouvons le voir, la balise n'a pas d'ID ou de classe. Mais la balise a la classe "relevemoyenne", parfait, pourquoi ? Car toutes les autres ont aussi la balise, ce qui va nous permettre de tout récupérer d'un coup en utilisant la commande

moyennes = driver.find_elements_by_class_name("relevemoyenne")

Comme vous le voyez, elements prend un S, cela dit à selenium de lister tous les éléments possédant la même classe, mais si vous faites print(moyennes) vous verrez que cela n'affiche que du texte incompréhensible. C'est normal, selenium à récuperer les éléments mais pas le texte, pour récuperer celui-ci, nous allons faire :

for elem in moyennes:
    print(elem.text)

Soit pour tous les éléments dans moyennes, écrire : le texte contenu dans ces éléments. Et là si vous faites un print(), magie ! Ca fonctionne. Mais ne criez pas victoire trop vite ce n'est pas fini. Nous voulons calculer la moyenne général. Et pour cela, nous allons supprimer l'élément 0 de notre liste de moyennes, pourquoi ? Car il avait aussi la classe "relevemoyenne" mais c'est le texte Moyenne au dessus des vrais moyennes. Voila comment nous allons faire :

ls = []
for elem in moyennes:
  ls.append(elem.text.replace(",","."))

Là, je remplace les , de mes moyennes par des . sinon python ne comprend pas que ce sont des nombres, puis je les ajoutes à la liste ls[] que j'ai crée juste avant

del ls[0]
del ls[-1]

Je supprime l'élément 0 qui est "MOYENNES" et l'élément -1 (dernier élément de la liste) qui est vide car je suis dispensé de sport et je n'ai donc aucune moyenne

ls = [ float(x) for x in ls ]

je convertis mes valeurs en "float" (nombre décimaux)

nbrMoyenne = len(ls)
ls = sum(ls)
ls = ls / nbrMoyenne
print(ls)
driver.quit()
  • Je définis le nombre de moyennes dans ma liste avec nbrMoyenne
  • J'additionne tous les éléments de ma liste
  • Je divise la somme de l'adition par le nombre de moyennes
  • J'écris le résultat dans ma console
  • Et enfin, je quitte Firefox.

Et voilà ! j'ai ma moyenne général. Alors oui, il y'a un inconvéniant à cette méthode, c'est le temps. En effet, vu que Selenium simule un navigateur, il prend énormement de temps à charger les pages, c'est pour ça que parfois vous aurez l'erreur "Unable to locate element:". Pour y remédier importer le module time et faites des pauses entre chaque page que vous charger, ce qui donnerait ça :

import time
  
//PAGE
time.sleep(2)
//AUTRE PAGE
time.sleep(2)

Voilà ! J'espère que ce cours vous aura été utile. (Et voilà le code final que vous pouvez retrouver aussi dans main.py)

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

path ="VOTRE PATH GECKODRIVER"

driver = webdriver.Firefox(executable_path=path)

driver.get('https://www.ecoledirecte.com/Eleves/0001/Notes')

username = driver.find_element_by_xpath('/html/body/div[2]/div[1]/div/div/div[1]/div[3]/form/input[1]')
password = driver.find_element_by_xpath('/html/body/div[2]/div[1]/div/div/div[1]/div[3]/form/input[2]')

username.send_keys("VOTRE USERNAME")
password.send_keys("VOTRE MOT DE PASSE")

login = driver.find_element_by_xpath('/html/body/div[2]/div[1]/div/div/div[1]/div[3]/form/button').click()
time.sleep(5)
  
#j'ai mis ça en commentaire car cela me permettai d'avoir les notes du premier trimestres, plus complètes que celles du second
#trimestre = driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[2]/eleve-note/div/div/ul/li[1]/a').click()
#time.sleep(5)

moyennes = driver.find_elements_by_class_name("relevemoyenne")
ls = []
for elem in moyennes:
  ls.append(elem.text.replace(",","."))
del ls[0]
del ls[-1]
ls = [ float(x) for x in ls ]
nbrMoyenne = len(ls)
ls = sum(ls)
ls = ls / nbrMoyenne
print(ls)
driver.quit()

Merci à BiMathAx pour l'ajout d'informations !

Owner
Lun4rIum
Lun4rIum
A pure-python HTML screen-scraping library

Scrapely Scrapely is a library for extracting structured data from HTML pages. Given some example web pages and the data to be extracted, scrapely con

Scrapy project 1.8k Dec 31, 2022
Bigdata - This Scrapy project uses Redis and Kafka to create a distributed on demand scraping cluster

Scrapy Cluster This Scrapy project uses Redis and Kafka to create a distributed

Hanh Pham Van 0 Jan 06, 2022
京东秒杀商品抢购Python脚本

Jd_Seckill 非常感谢原作者 https://github.com/zhou-xiaojun/jd_mask 提供的代码 也非常感谢 https://github.com/wlwwu/jd_maotai 进行的优化 主要功能 登陆京东商城(www.jd.com) cookies登录 (需要自

Andy Zou 1.5k Jan 03, 2023
Dictionary - Application focused on word search through web scraping

Dictionary - Application focused on word search through web scraping, in addition to other functions such as dictation, spell and conjugation of syllables.

Juan Manuel 2 May 09, 2022
Find thumbnails and original images from URL or HTML file.

Haul Find thumbnails and original images from URL or HTML file. Demo Hauler on Heroku Installation on Ubuntu $ sudo apt-get install build-essential py

Vinta Chen 150 Oct 15, 2022
VG-Scraper is a python program using the module called BeautifulSoup which allows anyone to scrape something off an website. This program lets you put in a number trough an input and a number is 1 news article.

VG-Scraper VG-Scraper is a convinient program where you can find all the news articles instead of finding one yourself. Installing [Linux] Open a term

3 Feb 13, 2022
UsernameScraperTool - Username Scraper Tool With Python

UsernameScraperTool Username Scraper for 40+ Social sites. How To use git clone

E4crypt3d 1 Dec 20, 2022
A Telegram crawler to search groups and channels automatically and collect any type of data from them.

Introduction This is a crawler I wrote in Python using the APIs of Telethon months ago. This tool was not intended to be publicly available for a numb

39 Dec 28, 2022
The first public repository that provides free BUBT website scraping API script on Github.

BUBT WEBSITE SCRAPPING SCRIPT I think this is the first public repository that provides free BUBT website scraping API script on github. When I was do

Md Imam Hossain 3 Feb 10, 2022
🐞 Douban Movie / Douban Book Scarpy

Python3-based Douban Movie/Douban Book Scarpy crawler for cover downloading + data crawling + review entry.

Xingbo Jia 1 Dec 03, 2022
A scrapy pipeline that provides an easy way to store files and images using various folder structures.

scrapy-folder-tree This is a scrapy pipeline that provides an easy way to store files and images using various folder structures. Supported folder str

Panagiotis Simakis 7 Oct 23, 2022
Rottentomatoes, Goodreads and IMDB sites crawler. Semantic Web final project.

Crawler Rottentomatoes, Goodreads and IMDB sites crawler. Crawler written by beautifulsoup, selenium and lxml to gather books and films information an

Faeze Ghorbanpour 1 Dec 30, 2021
LSpider 一个为被动扫描器定制的前端爬虫

LSpider LSpider - 一个为被动扫描器定制的前端爬虫 什么是LSpider? 一款为被动扫描器而生的前端爬虫~ 由Chrome Headless、LSpider主控、Mysql数据库、RabbitMQ、被动扫描器5部分组合而成。

Knownsec, Inc. 321 Dec 12, 2022
Complete pipeline for crawling online newspaper article.

Complete pipeline for crawling online newspaper article. The articles are stored to MongoDB. The whole pipeline is dockerized, thus the user does not need to worry about dependencies. Additionally, d

newspipe 4 May 27, 2022
WebScraper - A script that prints out a list of all EXTERNAL references in the HTML response to an HTTP/S request

Project A: WebScraper A script that prints out a list of all EXTERNAL references

2 Apr 26, 2022
This was supposed to be a web scraping project, but somehow I've turned it into a spamming project

Introduction This was supposed to be a web scraping project, but somehow I've turned it into a spamming project.

Boss Perry (Pez) 1 Jan 23, 2022
京东抢茅台,秒杀成功很多次讨论,天猫抢购,赚钱交流等。

Jd_Seckill 特别声明: 请添加个人微信:19972009719 进群交流讨论 目前群里很多人抢到【扫描微信添加群就好,满200关闭群,有喜欢薅信用卡羊毛的也可以找我交流】 本仓库发布的jd_seckill项目中涉及的任何脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性

50 Jan 05, 2023
Web Scraping Framework

Grab Framework Documentation Installation $ pip install -U grab See details about installing Grab on different platforms here http://docs.grablib.

2.3k Jan 04, 2023
Using Python and Pushshift.io to Track stocks on the WallStreetBets subreddit

wallstreetbets-tracker Using Python and Pushshift.io to Track stocks on the WallStreetBets subreddit.

91 Dec 08, 2022
Linkedin webscraping - Linkedin web scraping with python

linkedin_webscraping This is the first step of a full project called "LinkedIn J

Pedro Dib 4 Apr 24, 2022