{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "kl_py_web_scrawler.ipynb", "provenance": [], "collapsed_sections": [], "include_colab_link": true }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "id": "N74ro5r6i6eg", "colab_type": "text" }, "source": [ "
\n", " \n", " \n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "# Python alapok WEB lapról adatgyüjtés\n", "\n", "
(.*?)
\", html, flags=re.DOTALL) # re.DOTALL if multi line\n", "if res :\n", " print(\"\\nAz oldal paragrafusai: \")\n", " for i in res :\n", " print(i)\n", "\n", "res = re.findall(r'href=\"(.*?)\"', html)\n", "if res :\n", " print(\"\\nAz oldal Linkjei: \")\n", " for i in res :\n", " print(i)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "!DOCTYPE html>\n", "\n", "\n", "\n", " 10: ## 10 után leállás\n", " break" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "0 /site/klajosw/home\n", "1 https://www.google.com/url?q=https%3A%2F%2Fmierdekel.hu%2Fblog%2F&sa=D&sntz=1&usg=AFQjCNFFQCtw9yuxT5rEZLBzwOTLfdbWhw\n", "2 http://klajosw.blogspot.hu/\n", "3 https://www.google.com/url?q=https%3A%2F%2Fsites.google.com%2Fsite%2Fklajosw&sa=D&sntz=1&usg=AFQjCNFFPG6KucVpHGmdzNkgKddsBQyi-A\n", "4 https://www.google.com/url?q=https%3A%2F%2Fnbviewer.jupyter.org%2Fgithub%2Fklajosw%2Fpython&sa=D&sntz=1&usg=AFQjCNGsNXOV3KuW3xm1S1z_1kTGEQoYPQ\n", "5 https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fklajosw&sa=D&sntz=1&usg=AFQjCNFUOAPFijSP8VCDVH8DJ4fkzqZXig\n", "6 https://www.google.com/url?q=https%3A%2F%2Fklajosw.github.io%2Fpython%2F&sa=D&sntz=1&usg=AFQjCNFWzoBPkEumj-ByqaDWKVO2htzfbw\n", "7 https://www.google.com/url?q=https%3A%2F%2Fwww.linkedin.com%2Fin%2Fklajosw%2F&sa=D&sntz=1&usg=AFQjCNGzwLQIyvWQNVHAiFibbgdaOAIupQ\n", "8 https://www.google.com/url?q=https%3A%2F%2Fnotebooks.azure.com%2Fklajosw&sa=D&sntz=1&usg=AFQjCNHpvjrOp2FXFDovcmNEYRC7BGfX2w\n", "9 https://goo.gl/photos/o4p8R18ndmKzJmSu7\n", "10 https://www.google.com/url?q=https%3A%2F%2Fmierdekel.hu%2Fterkep%2Fbubi%2F&sa=D&sntz=1&usg=AFQjCNFattZZlJb7jSUVJIOthZsqTJf_BQ\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "ZBqgYDOPi6eo", "colab_type": "text" }, "source": [ "---\n", "### BeautifulSoup használata\n", "\n", "---" ] }, { "cell_type": "code", "metadata": { "id": "tei6lmSyi6ep", "colab_type": "code", "colab": {}, "outputId": "7bed0e4c-3a21-457f-df75-d911c1428110" }, "source": [ "from bs4 import BeautifulSoup\n", "from urllib.request import urlopen\n", "\n", "html = urlopen(\"https://klajosw.blogspot.com/2020/03/labirintus-generalas-as-megoldas-python.html\").read().decode('utf-8')\n", "print(html[1:200]) ## tartalom első 200 karaketrének kiolvasása\n", "print('----------------')\n", "soup = BeautifulSoup(html, features='lxml') ## értelmező\n", "print(soup.h3) ## Harmadik szintű fejlécek kiírása\n", "print('----------------')\n", "print('\\nA paragrafusok kiírása', soup.p)## paragrafusok kiírása\n", "print('----------------')\n", "\n", "all_href = soup.find_all('a')\n", "print('\\nLinkek kiírása 10 db')\n", "for l in all_href[1:9]:\n", " print(l)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "!DOCTYPE html>\n", "\n", "\n", "\n", "\n", "\n", "\n", "Kruskal féle\n", "Prim féle\n", "rekurzív Backtracker\n", "Aldous-Broder\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "GopTo-doi6er", "colab_type": "code", "colab": {}, "outputId": "65b6dedd-200f-4590-8550-620fcf3d1fa8" }, "source": [ "from bs4 import BeautifulSoup\n", "from urllib.request import urlopen\n", "from urllib.request import urlretrieve\n", "import re\n", "import os\n", "\n", "\n", "html = urlopen(\"https://klajosw.blogspot.com/2020/03/labirintus-generalas-as-megoldas-python.html\").read().decode('utf-8')\n", "print(html[1:200])\n", "\n", "soup = BeautifulSoup(html, features='lxml')\n", "month = soup.find_all('li')\n", "print('----------------')\n", "print('\\nA fejezetek\\n')\n", "for d in month[1:10]:\n", " print(d.get_text())\n", " \n", " \n", "print('----------------')\n", "print('\\nA képek keresése\\n') \n", "img_links = soup.find_all(\"img\", {\"src\": re.compile('.*?\\.jpg')})\n", "for link in img_links:\n", " print(link['src']) \n", " \n", "print('----------------')\n", "print('\\nA kép letőltése IMG könyvtárba\\n') \n", "os.makedirs('./img/', exist_ok=True) ## img könyvtár létrehozása\n", "IMAGE_URL = 'https://1.bp.blogspot.com/-MkX7e5_jAU8/XqMnuEMm_ZI/AAAAAAAAclc/LRyVXVmwBPYy1qmQ8XnERnYUCswRv5bxQCLcBGAsYHQ/s400/kl_ms_00.jpg'\n", "urlretrieve(IMAGE_URL, './img/image1.png') \n", "\n", "\n", "print('----------------')\n", "print('\\nBelső linkek\\n') \n", "inter_links = soup.find_all('a', {'href': re.compile('https://klajosw.blogspot.com/.*')})\n", "for link in inter_links[0:5]: ## csak 6 darab\n", " print(link['href'])\n", " \n", "print('----------------')\n", "print('\\nKülső linkek\\n') \n", "outer_links = soup.find_all('a', {'href': re.compile('http://weblog.jamisbuck.org/.*')})\n", "for link in outer_links[1:5]: ## csak 6 darab\n", " print(link['href'])" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "!DOCTYPE html>\n", "\n", "\n", "\n", " 10: ## 10 után leállás\n", " break" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "0 /wiki/Enciklop%C3%A9dia\n", "1 /wiki/Magyar_Wikip%C3%A9dia\n", "2 /wiki/2017-es_Formula%E2%80%931_vil%C3%A1gbajnoks%C3%A1g\n", "3 /wiki/Formula%E2%80%931\n", "4 /wiki/Nemzetk%C3%B6zi_Automobil_Sz%C3%B6vets%C3%A9g\n", "5 /wiki/Formula%E2%80%931_ausztr%C3%A1l_nagyd%C3%ADj\n", "6 /wiki/Melbourne\n", "7 /wiki/Melbourne_Grand_Prix_Circuit\n", "8 /wiki/Formula%E2%80%931_abu-dzabi_nagyd%C3%ADj\n", "9 /wiki/Yas_Marina_Circuit\n", "10 /wiki/Formula%E2%80%931-es_egy%C3%A9ni_vil%C3%A1gbajnokok_list%C3%A1ja\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "2nR4V2nylTuP" }, "source": [ "## Tartalom linkek véletlen szerű bejárása" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "iQXEwh4rlTuQ", "outputId": "9d6a2ef4-f478-4ac1-a894-6749339b2597", "colab": {} }, "source": [ "from urllib.request import urlopen\n", "from bs4 import BeautifulSoup\n", "import datetime\n", "import random\n", "import re\n", "\n", "random.seed(datetime.datetime.now())\n", "szamol=0\n", "def getLinks(articleUrl):\n", " html = urlopen('http://hu.wikipedia.org{}'.format(articleUrl))\n", " bs = BeautifulSoup(html, 'html.parser')\n", " return bs.find('div', {'id':'bodyContent'}).find_all('a', href=re.compile('^(/wiki/)((?!:).)*$'))\n", "\n", "links = getLinks('/wiki/Kevin_Bacon')\n", "while len(links) > 0:\n", " newArticle = links[random.randint(0, len(links)-1)].attrs['href']\n", " print(szamol, newArticle)\n", " links = getLinks(newArticle)\n", " szamol += 1\n", " if szamol > 9: ## 10 után leállás\n", " break" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "0 /wiki/Kevin_Costner\n", "1 /wiki/1992\n", "2 /wiki/%C3%89szak-atlanti_Szerz%C5%91d%C3%A9s_Szervezete\n", "3 /wiki/Belgium\n", "4 /wiki/Hollandia\n", "5 /wiki/N%C3%A9met-r%C3%B3mai_Birodalom\n", "6 /wiki/I._Ott%C3%B3_n%C3%A9met-r%C3%B3mai_cs%C3%A1sz%C3%A1r\n", "7 /wiki/949\n", "8 /wiki/950-es_%C3%A9vek\n", "9 /wiki/990-es_%C3%A9vek\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "AsawmO6klTuR" }, "source": [ "## Rekurzív módon bejárja az egész webhelyet" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "6BpeJHYZlTuS", "outputId": "83febf92-5e85-4f57-95b6-56c79e86b5e1", "colab": {} }, "source": [ "from urllib.request import urlopen\n", "from bs4 import BeautifulSoup\n", "import re\n", "\n", "pages = set()\n", "szamol=0\n", "def getLinks(pageUrl):\n", " global pages, szamol\n", " html = urlopen('http://hu.wikipedia.org{}'.format(pageUrl))\n", " bs = BeautifulSoup(html, 'html.parser')\n", " for link in bs.find_all('a', href=re.compile('^(/wiki/)')):\n", " if 'href' in link.attrs:\n", " if link.attrs['href'] not in pages:\n", " #Wúj oldalak számlálása\n", " newPage = link.attrs['href']\n", " print(szamol, newPage)\n", " pages.add(newPage)\n", " szamol += 1\n", " if szamol > 9: ## 10 után leállás\n", " break \n", " getLinks(newPage)\n", "\n", " \n", "getLinks('')" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "0 /wiki/Wikip%C3%A9dia:Jel%C3%B6lt_lapv%C3%A1ltozatok\n", "1 /wiki/Wikip%C3%A9dia:WP\n", "2 /wiki/WP:WP\n", "3 /wiki/WP:R%C3%96V\n", "4 /wiki/Wikip%C3%A9dia:N%C3%A9vt%C3%A9r#Wikipédia-névtér\n", "5 /wiki/F%C3%A1jl:Walnut.png\n", "6 /wiki/F%C3%A1jl:Commons-logo.svg\n", "7 /wiki/Szerkeszt%C5%91:Be..anyone\n", "8 /wiki/Speci%C3%A1lis:Mi_hivatkozik_erre/F%C3%A1jl:Walnut.png\n", "9 /wiki/WP:N%C3%89VT%C3%89R\n", "10 /wiki/WP:1\n", "11 /wiki/Wikip%C3%A9dia:Az_els%C5%91_l%C3%A9p%C3%A9sek\n", "12 /wiki/WP:100K\n", "13 /wiki/WP:JEL\n", "14 /wiki/Wikip%C3%A9dia:%C3%9Cdv%C3%B6zl%C3%BCnk,_l%C3%A1togat%C3%B3!\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "M7rsnPrplTuU" }, "source": [ "## Adatgyűjtés az egész webhelyen" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "_xOizYlBlTuU", "outputId": "b77ab78b-f7a5-4f04-f18a-7c144fe7c393", "colab": {} }, "source": [ "from urllib.request import urlopen\n", "from bs4 import BeautifulSoup\n", "import re\n", "\n", "pages = set()\n", "szamol=0\n", "def getLinks(pageUrl):\n", " global pages, szamol\n", " html = urlopen('http://hu.wikipedia.org{}'.format(pageUrl))\n", " bs = BeautifulSoup(html, 'html.parser')\n", " try:\n", " print(bs.h1.get_text())\n", " print(bs.find(id ='mw-content-text').find_all('p')[0])\n", " print(bs.find(id='ca-edit').find('span').find('a').attrs['href'])\n", " except AttributeError:\n", " print('Valami hiba van!!! Folytassuk azért.')\n", " \n", " for link in bs.find_all('a', href=re.compile('^(/wiki/)')):\n", " if 'href' in link.attrs:\n", " if link.attrs['href'] not in pages:\n", " ## új lap link felismerése\n", " newPage = link.attrs['href']\n", " print('-'*20)\n", " print(newPage)\n", " pages.add(newPage)\n", " szamol += 1\n", " if szamol > 7: ## 10 után leállás\n", " break \n", " getLinks(newPage)\n", " \n", "getLinks('') " ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Kezdőlap\n", "Ezt az enciklopédiát az olvasói szerkesztik.
A magyar változatnak 471 224 szócikke van, ebből 1021 kiemelt.\n",
"
A MediaWiki FlaggedRevs (jelölt lapváltozatok) kiterjesztése segítségével a Wikipédia előtt új dimenzió nyílik: ezután meg lehet jelölni egy-egy szócikknek a közösség által ellenőrzött változatait, és az olvasónak jelezni, hogy vannak ilyen változatok, esetleg eleve azokat mutatni meg neki. Az egyes Wikipédiák (és Wikikönyvek, Wikiszótárak stb.) közösségei a közeljövőben eldönthetik, akarják-e használni ezt a kiterjesztést, és ha igen, pontosan milyen beállításokkal. A magyar Wikipédián a szavazást követően a fejlesztők 2008. november 17-én aktiválták az itt látható beállításokkal.\n", "
\n", "Valami hiba van!!! Folytassuk azért.\n", "--------------------\n", "/wiki/Wikip%C3%A9dia:WP\n", "Wikipédia:WP\n", "Ez a lap tartalmazza a Wikipédia-névtérben szereplő lapok rövidített neveit, melyekkel egyszerűbben lehet rájuk hivatkozni.\n", "
\n", "Valami hiba van!!! Folytassuk azért.\n", "--------------------\n", "/wiki/WP:WP\n", "Wikipédia:WP\n", "Ez a lap tartalmazza a Wikipédia-névtérben szereplő lapok rövidített neveit, melyekkel egyszerűbben lehet rájuk hivatkozni.\n", "
\n", "Valami hiba van!!! Folytassuk azért.\n", "--------------------\n", "/wiki/WP:R%C3%96V\n", "Wikipédia:WP\n", "Ez a lap tartalmazza a Wikipédia-névtérben szereplő lapok rövidített neveit, melyekkel egyszerűbben lehet rájuk hivatkozni.\n", "
\n", "Valami hiba van!!! Folytassuk azért.\n", "--------------------\n", "/wiki/Wikip%C3%A9dia:N%C3%A9vt%C3%A9r#Wikipédia-névtér\n", "Wikipédia:Névtér\n", "A Wikipédia minden egyes lapját, feltöltött kép- és hangállományát és minden regisztrált szerkesztőjét (programozási szakkifejezéssel: minden objektumát) a nevével azonosíthatjuk. Ha azonban egy nevet csak egyszer használhatnánk, az konfliktusokhoz vezetne. Tegyük fel például, hogy valaki egy keresztnévvel szeretne regisztrálni. Ezt nem tehetné meg, mert a keresztnevekről vannak szócikkeink. Mi történne azonban, ha valaki azelőtt regisztrálna Ferenc vagy Júlia néven, hogy a megfelelő szócikk elkészült? Akkor vagy nem lehetne már megírni a szócikket, vagy előbb át kellene nevezni a szerkesztőt, aminek ő nem biztos, hogy örülne. Sőt: semmilyen néven nem lehetne regisztrálni, amiről egyáltalán elképzelhető, hogy valaha is szócikk lesz. Például Szerkesztő:GumiBot sem lehetne, mert valaki talán majd a gumibotról akar cikket írni. Nem is beszélve arról a káoszról, amit az összes különböző nyelvű Wikipédiában használható szerkesztőnevek okoznának. Az olvasók meg lépten-nyomon furcsa, nem nekik szánt tartalmakba botlanának a kereső használatával.\n", "
\n", "Valami hiba van!!! Folytassuk azért.\n", "--------------------\n", "/wiki/F%C3%A1jl:Walnut.png\n", "Fájl:Walnut.png\n", "Walnut.png (192 × 192 képpont, fájlméret: 46 KB, MIME-típus: image/png)\n", "
\n", "Valami hiba van!!! Folytassuk azért.\n", "--------------------\n", "/wiki/F%C3%A1jl:Commons-logo.svg\n", "Fájl:Commons-logo.svg\n", "Eredeti fájl (SVG fájl, névlegesen 1 024 × 1 376 képpont, fájlméret: 932 bytes)\n", "
\n", "Valami hiba van!!! Folytassuk azért.\n", "--------------------\n", "/wiki/Szerkeszt%C5%91:Be..anyone\n", "--------------------\n", "/wiki/Speci%C3%A1lis:Mi_hivatkozik_erre/F%C3%A1jl:Walnut.png\n", "--------------------\n", "/wiki/WP:N%C3%89VT%C3%89R\n", "--------------------\n", "/wiki/WP:1\n", "--------------------\n", "/wiki/Wikip%C3%A9dia:Az_els%C5%91_l%C3%A9p%C3%A9sek\n", "--------------------\n", "/wiki/WP:100K\n", "--------------------\n", "/wiki/WP:JEL\n", "--------------------\n", "/wiki/Wikip%C3%A9dia:%C3%9Cdv%C3%B6zl%C3%BCnk,_l%C3%A1togat%C3%B3!\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "yOYpKe7UlTuW" }, "source": [ "## WEB lap feltérképezés az interneten keresztül véletren szerü sorrendben" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "H_EBGjAflTuX", "outputId": "fe5a080c-b95e-4c5c-f319-997c323dfee4", "colab": {} }, "source": [ "from urllib.request import urlopen\n", "from urllib.parse import urlparse\n", "from bs4 import BeautifulSoup\n", "import re\n", "import datetime\n", "import random\n", "\n", "pages = set()\n", "szamol=0\n", "random.seed(datetime.datetime.now())\n", "\n", "## Beolvassa az oldalon található összes belső link listáját\n", "def getInternalLinks(bs, includeUrl):\n", " includeUrl = '{}://{}'.format(urlparse(includeUrl).scheme, urlparse(includeUrl).netloc)\n", " internalLinks = []\n", " #Finds all links that begin with a \"/\"\n", " for link in bs.find_all('a', href=re.compile('^(/|.*'+includeUrl+')')):\n", " if link.attrs['href'] is not None:\n", " if link.attrs['href'] not in internalLinks: ## új belső link\n", " print('belső link : {}'.format(internalLinks))\n", " if(link.attrs['href'].startswith('/')):\n", " internalLinks.append(includeUrl+link.attrs['href'])\n", " else:\n", " internalLinks.append(link.attrs['href'])\n", " print('belső link : {}'.format(internalLinks))\n", " return internalLinks\n", " \n", "## Beolvassa az oldalon található összes külső link listáját\n", "def getExternalLinks(bs, excludeUrl):\n", " externalLinks = []\n", " ##összes link keresése\n", " ##nem tartalmaz külső URL-t\n", " for link in bs.find_all('a', href=re.compile('^(http|www)((?!'+excludeUrl+').)*$')):\n", " if link.attrs['href'] is not None:\n", " if link.attrs['href'] not in externalLinks: ## új külső link\n", " externalLinks.append(link.attrs['href']) \n", " return externalLinks\n", "\n", "def getRandomExternalLink(startingPage):\n", " html = urlopen(startingPage)\n", " bs = BeautifulSoup(html, 'html.parser')\n", " externalLinks = getExternalLinks(bs, urlparse(startingPage).netloc)\n", " if len(externalLinks) == 0:\n", " print('Nincs külső link, nézze meg a webhelyen is')\n", " domain = '{}://{}'.format(urlparse(startingPage).scheme, urlparse(startingPage).netloc)\n", " internalLinks = getInternalLinks(bs, domain)\n", " return getRandomExternalLink(internalLinks[random.randint(0,\n", " len(internalLinks)-1)])\n", " else:\n", " return externalLinks[random.randint(0, len(externalLinks)-1)]\n", " \n", "def followExternalOnly(startingSite):\n", " global szamol\n", " externalLink = getRandomExternalLink(startingSite)\n", " print('Véletlen külső link : {}'.format(externalLink))\n", " print('Véletlen belső link : {}'.format(externalLink))\n", " szamol += 1\n", " if szamol < 2: ## 10 után leállás\n", " followExternalOnly(externalLink)\n", " \n", " \n", "followExternalOnly('https://sites.google.com/site/klajosw')\n", "#followExternalOnly('https://mierdekel.hu/blog/2015/12/')\n", "#followExternalOnly('https://klajosw.blogspot.com/')" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Véletlen külső link : https://www.google.com/url?q=https%3A%2F%2Fmierdekel.hu%2Fblog%2F&sa=D&sntz=1&usg=AFQjCNFFQCtw9yuxT5rEZLBzwOTLfdbWhw\n", "Véletlen belső link : https://www.google.com/url?q=https%3A%2F%2Fmierdekel.hu%2Fblog%2F&sa=D&sntz=1&usg=AFQjCNFFQCtw9yuxT5rEZLBzwOTLfdbWhw\n", "Nincs külső link, nézze meg a webhelyen is\n" ], "name": "stdout" }, { "output_type": "error", "ename": "ValueError", "evalue": "empty range for randrange() (0,0, 0)", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m