{ "cells": [ { "cell_type": "markdown", "metadata": { "collapsed": true, "pycharm": { "name": "#%% md\n" } }, "source": [ "# On your way to scraping French forums 🇬🇧\n", "\n", "[Xiaoou WANG](https://scholar.google.fr/citations?user=vKAMMpwAAAAJ&hl=en)\n", "\n", "Be sure to have read the first tutorial [here](./01_lemonde_en.md).\n", "\n", "## Get pages\n", "\n", "The construction of the scraper for the forum `doctissimo` is actually simpler. Let's look at the link of the second page of the \"pain dos\" section as an example:\n", "\n", "[https://forum.doctissimo.fr/sante/douleur-dos/liste_sujet-2.htm](https://forum.doctissimo.fr/sante/douleur-dos/liste_sujet-2.htm)\n", "\n", "First I write a function to generate the links including page numbering:" ] }, { "cell_type": "code", "execution_count": 3, "outputs": [ { "data": { "text/plain": "['https://forum.doctissimo.fr/sante/douleur-dos/liste_sujet-0.htm',\n 'https://forum.doctissimo.fr/sante/douleur-dos/liste_sujet-1.htm']" }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "links_page = [\"https://forum.doctissimo.fr/sante/douleur-dos/liste_sujet-\" +\n", " str(i) + \".htm\" for i in range(10)]\n", "links_page[:2]" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "markdown", "source": [ "Then I go on with a second function retrieving the threads on each page.\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%% md\n" } } }, { "cell_type": "code", "execution_count": 6, "outputs": [ { "data": { "text/plain": "'https://forum.doctissimo.fr/sante/douleur-dos/osteopathie-sujet_165606_1.htm'" }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from urllib.request import urlopen # standard python module\n", "from bs4 import BeautifulSoup\n", "from urllib.error import HTTPError\n", "\n", "def get_post_links(link):\n", " try:\n", " html = urlopen(link)\n", " except HTTPError as e:\n", " print(\"text url not valid\")\n", " soup = BeautifulSoup(html, \"html.parser\")\n", " temp = soup.find_all(scope=\"row\")\n", " test = set()\n", " for post in temp:\n", " if post.find('a'):\n", " test.add(post.find('a').get('href'))\n", " return test\n", "\n", "url = \"https://forum.doctissimo.fr/sante/douleur-dos/liste_sujet-2.htm\"\n", "\n", "links_threads = get_post_links(url)\n", "list(links_threads)[0]" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "markdown", "source": [ "## Scrape interactions/posts\n", "\n", "Now it's just a matter of scrape the posts from the first page of each thread. It is quite straightforward because the text of each post is in a span tag where the itemprop property equals text. The code says a little more about tag structure.\n", "\n", "The code block below allows to print:\n", "\n", "1. the author\n", "2. the publication date and time\n", "3. the text body\n", "\n", "of each post published on [https://forum.doctissimo.fr/sante/douleur-dos/osteopathie-sujet_165606_1.htm](https://forum.doctissimo.fr/sante/douleur-dos/osteopathie-sujet_165606_1.htm)." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 26, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\t\tMélène4822\t\t\t\n", "\t\tMélène4822\t\t\t\n", "\t06/09/2020 à 18h28\n", "\t\t\t\t\t\t\t\t\t\t\tLe lien a été copié dans votre presse-papier\t\t\t\t\t\t\t\t\t\t\n", "\n", "\t\t\t\t\t\t\t\t\t\t\tLe lien a été copié dans votre presse-papier\t\t\t\t\t\t\t\t\t\t\n", " Bonjour à tous,Avez-vous déjà eu recours à un ostéopathe pour votre mal de dos ?Et, si oui, en êtes-vous satisfait ?Ou, au contraire, y a-t-il contre-indication ?(J'ai une hernie discale en L5S1, à laquelle s'ajoute un problème de hanche)J'ai rendez-vous avec une ostéopathe demain et je ne suis pas très rassurée même si, paraît-il, elle emploie les méthodes douces actuelles.Merci de vos réponses et bonne soirée à vous\n", "\t\tLordMaxence\t\t\t\n", "\t\tLordMaxence\t\t\t\n", "\t20/11/2020 à 16h00\n", "\t\t\t\t\t\t\t\t\t\t\tLe lien a été copié dans votre presse-papier\t\t\t\t\t\t\t\t\t\t\n", "\n", "\t\t\t\t\t\t\t\t\t\t\tLe lien a été copié dans votre presse-papier\t\t\t\t\t\t\t\t\t\t\n", " Bonjour,Comme j'ai répondu dans un autre post je ne vais pas faire de doublon. Tu pourras lire si tu veux.L'ostéopathe va t'étirer et te soulager. J'en voyais un pour mes maux de dos. Mais une fois par mois. Trop peu, les douleurs revenaient vite...L'idéal est de s'étirer tous les jours le matin dans le lit. Pas sur un sol dur. Muscles chauds.Et le soir également au début dans le lit pour s'endormir, le temps que les douleurs disparaissent.Et surtout, bien gérer sa respiration afin de se détendre.Pour les étirements du dos, il y a pleins de liens sur le net.Mais au besoin, je peux rechercher pour te donner ceux que je fais. Qui sont basiques pour la plupart.Mais depuis que je m'étire tous les jours, plus de douleur.Bien cordialement.\n" ] } ], "source": [ "def read_html(link):\n", " try:\n", " html = urlopen(link)\n", " except HTTPError as e:\n", " print(\"text url not valid\")\n", " return BeautifulSoup(html, \"html.parser\")\n", "\n", "content = read_html(\"https://forum.doctissimo.fr/sante/douleur-dos/osteopathie-sujet_165606_1.htm\")\n", "\n", "for post in content.find_all(class_=\"md-post__content\"):\n", " for meta in post.find_previous(\"header\").find_all(\"span\"):\n", " print(meta.get_text().replace(\"\\n\",\"\"))\n", " text = post.find(itemprop=\"text\").get_text()\n", " body = text.replace(\"\\n\",\"\")\n", " # replace " with quotes\n", " s = \""\"\n", " post_body = body.replace(s, '\"')\n", " print(post_body)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "markdown", "source": [ "## Perspectives\n", "\n", "Now it's up to you to do some corpus analysis :D" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%% md\n" } } } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 }