{"id":18323410,"url":"https://github.com/camara94/crawlers","last_synced_at":"2025-04-09T15:12:00.964Z","repository":{"id":100386335,"uuid":"388586175","full_name":"camara94/crawlers","owner":"camara94","description":"Web scraping is the process of using bots to extract content and data from a website. Unlike screen scraping, which only copies pixels displayed onscreen, web scraping extracts underlying HTML code and, with it, data stored in a database. The scraper can then replicate entire website content elsewhere","archived":false,"fork":false,"pushed_at":"2021-07-24T19:04:22.000Z","size":275,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-09T15:11:57.335Z","etag":null,"topics":["crawler","python","scraping","scrapy","spider"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/camara94.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-22T20:15:58.000Z","updated_at":"2023-10-18T04:21:42.000Z","dependencies_parsed_at":"2023-05-14T07:30:18.857Z","dependency_job_id":null,"html_url":"https://github.com/camara94/crawlers","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camara94%2Fcrawlers","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camara94%2Fcrawlers/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camara94%2Fcrawlers/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camara94%2Fcrawlers/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/camara94","download_url":"https://codeload.github.com/camara94/crawlers/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248055276,"owners_count":21040157,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crawler","python","scraping","scrapy","spider"],"created_at":"2024-11-05T18:28:11.415Z","updated_at":"2025-04-09T15:12:00.948Z","avatar_url":"https://github.com/camara94.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Crawler En Python\nCrawler signifie littéralement **« scanner »**. Autrement dit, il s’agit d’extraire un maximum d’informations possibles d’un site web. Cette analyse permet ainsi de connaître parfaitement la structure d’un site et de résoudre ses problèmes éventuels. Par exemple, une arborescence mal construite, un maillage interne inadéquat ou encore des balises meta dupliquées.\n\n## Importance Des Données\nL’importance de l’acquisition de données pour le **Data Scientist** n’est plus à démontrer. Le web étant une source intarissable de données de toutes sortes, le web scraping ou web crawling s’est imposé comme une technique incontournable d’acquisition de données. Scrapy est un framework Python permettant de faciliter les tâches de scraping. Dans cet article nous verrons commant utiliser Scrapy pour créer un jeu de données de textes écrits en langage naturel. Nous commencerons par voir les bases de Scrapy puis nous créerons un jeu de données constitué du site jumia.\n## Qu’est-ce que Scrapy ?\n**Scrapy** est un framework Python qui sert à faire du web scraping. Scrapy est adapté aux grands projets de web scraping. En effet, les projets Scrapy ont une structure assez clair qui facilite la maintenance et le passage à l’échelle. En plus, le framework offre une certaine rapidité due à l’asynchronisme des requêtes (Scrapy utilise [Twisted](https://twistedmatrix.com/trac/)). Bref! Je vous propose de jeter un œil à la structure de Scrapy.\n\n## Data flow de Scrapy\n![sycle de vie](images/scrapy_architecture_02.png)\n\n\n## Création D'un Projet Crawl \nAvant de créer le projet, il faut s’assurer d’avoir Scrapy installé. Utilisez la ligne de commande suivante pour l’installer :\u003cbr\u003e\n\u003ccode\u003e\npip install scrapy\n\u003c/code\u003e\u003cbr\u003eOu avec conda :\u003cbr\u003e\n\u003ccode\u003e\nconda install -c conda-forge scrapy\n\u003c/code\u003e\u003cbr\u003e\nMaintenant nous pouvons générer notre projet avec la ligne de commande suivante :\u003cbr\u003e\n\u003ccode\u003escrapy startproject jumia\u003c/code\u003e\u003cbr\u003e\n**“jumia”** est le nom du projet, mais on pourrait l'appeler comme bon nous semble.\n\n### Un Dossier jumia est créé.\n![arborescence](images/arborescence.png)\n\n### scrapy.py\nLa racine du projet contient le fichier scrapy.cfg qui est un fichier de configuration qui contient des variables telles que le nom du module qui contient les paramètres du projet et d’autres variables de déploiement.\n### \u0026#95;\u0026#95;init\u0026#95;\u0026#95;.py\nLa racine contient un autre dossier datasets qui contient le projet en lui même. Ce dossier qui est un package Python (d’où le __init__.py) contient le package spiders (qui pour l’heure est vide) ainsi que les modules : **items**, **middlewares**, **pipelines** et **settings**.\n\n### Le Fichier middlewares.py \nLe module **middlewares** contient les middlewares du projet. Les middlewares pour les spiders et pour le downloader sont créés par défaut. Mais il est possible d’en créer un nouveau.\n\n### Le Fichier items.py\nLe module **items** définit les modèles des données que doivent respecter les items scrapés. Un item est un objet Python style **“clé-valeur”** qui représente un échantillon élémentaire du jeu de données. Si on considère notre jeu de données comme étant au format **CSV**, un item serait une ligne de ce **CSV**.\n\n### Le Fichier pipelines.py\nLe module **pipelines** contient les pipelines pour chaque item (modèle de données) défini dans le module items. Ces pipelines permettent de faire des traitements sur l’ensemble des items scrapés. Cela est pratique pour faire du nettoyage de données.\n\n### Le Fichier settings.py\nLe fichier **settings.py** contient des variables qui sont utilisées par l’engine et le reste du projet.\n\n## Création D’Un Item\nOn commence par créer le modèle de données qu’on veut. On fait cela en créant une classe qui hérite de **“scrapy.Item”** et précisant les 3 champs qu’on souhaite avoir.\n\n\u003cpre\u003e\n\u003ccode\u003e\nimport scrapy\n \nclass ArticleItem(scrapy.Item):\n    designation = scrapy.Field()\n    image = scrapy.Field() \n    prix = scrapy.Field()\n\u003c/code\u003e\n\u003c/pre\u003e\n\n## Création d’un Spider\nLe point d’entrée du projet est le dossier **spider**. Nous allons créer un nouveau fichier dans le dossier spiders que l’on va appeler **“article.py“**. Évidemment, vous êtes libre de l’appeler comme vous voulez.\n\nDans ce fichier, on va créer le spider à proprement dit qui n’est rien d’autre qu’une classe héritant de la classe **Spider** de **scrapy**.\n\n\u003cpre\u003e\n\u003ccode\u003e\nfrom scrapy import Request, Spider\nfrom ..items import ArticleItem\n \nclass SpiderArticle(Spider):\n    # Nom du spider\n    name = \"article\"\n    # URL de la page à scraper\n    url = \"https://www.jumia.com.tn/\"\n \n    def start_requests(self):\n        yield Request(url=self.url, callback=self.parse_films)\n \n    def parse_films(self, response):\n        listArticle = response.css(\"article.pr\")\n        for article in listArticle:\n            designation = article.css(\"div.name::text\").extract_first()\n            image = article.css(\"img.img\").attrib('data-src')\n            prix = article.css(\"div.prc::text\").extract_first()\n\n            item = ArticleItem()\n \n            item['designation'] = title\n            item['image'] = image\n            item['prix'] = prix\n \n            yield item\n\u003c/code\u003e\n\u003c/pre\u003e\n\n## Lancement Du Projet\nPour lancer notre spider et avoir les données scrapées dans un fichier **CSV**, on fait la commande suivante :\n\n\u003ccode\u003escrapy crawl article -o article.csv\u003c/code\u003e\n\n## Conclusion\nScrapy est un **framework** Python qui facilite énormément les tâches de **web scraping**. Dans cet article, nous avons vu le principe global de fonctionnement de Scrapy. Puis nous avons vu un exemple de web crawling avec le framework qui nous a permis de créer un jeu de données. Le but de cet article était de faire une introduction au framework Scrapy. Pour une version plus complète du projet de scraping du site **jumia**, [cliquez ici](https://github.com/camara94/crawlers).\n\nScrapy est un outil robuste et assez facile à prendre en main. Si vous faites souvent de l’extraction de données sur le web, cet outil peut sûrement vous simplifier la vie.\n\n## Ressources\n1. [https://github.com/camara94/crawlers](https://github.com/camara94/crawlers)\n2. [https://ledatascientist.com/introduction-au-web-scraping-avec-python/](https://ledatascientist.com/introduction-au-web-scraping-avec-python/)\n3. [https://docs.scrapy.org/en/latest/topics/selectors.html](https://docs.scrapy.org/en/latest/topics/selectors.html)\n4. [https://twistedmatrix.com/trac/](https://twistedmatrix.com/trac/)\n5. [https://www.datacamp.com/community/tutorials/making-web-crawlers-scrapy-python](https://www.datacamp.com/community/tutorials/making-web-crawlers-scrapy-python)\n6. [prjumia.com.tn](prjumia.com.tn)\n   \n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcamara94%2Fcrawlers","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcamara94%2Fcrawlers","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcamara94%2Fcrawlers/lists"}