tag:crieit.net,2005:https://crieit.net/tags/PHP8/feed 「PHP8」の記事 - Crieit Crieitでタグ「PHP8」に投稿された最近の記事 2022-09-25T11:27:24+09:00 https://crieit.net/tags/PHP8/feed tag:crieit.net,2005:PublicArticle/18294 2022-09-18T16:37:31+09:00 2022-09-25T11:27:24+09:00 https://crieit.net/posts/PHP-6326cabb4a630 なにも知らない PHP スクレイピング。マンガ カウンティング <h2 id="preface"><a href="#preface">preface</a></h2> <p>うっかり <a target="_blank" rel="nofollow noopener" href="https://github.com/kuz-sysadmin/ksphp-en/">1995 -2002 くらいまで</a>の<a href="https://crieit.net/posts/BBS-programming">掲示板</a> / <a target="_blank" rel="nofollow noopener" href="http://f16.aaacafe.ne.jp/~stwalker/">文化</a>に興味をもってしまった(スレッドフロート型掲示板という言葉が英語なのか日本語なのかという疑問がきっかけだった。)ことから Perl という古語を自習していて、並列して <a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/news/report/2015/12/1401">PHP</a> についてのことも知りたいとおもい( 2001 以降、perl + c 言語製 2 ちゃんねる から、PHP 5 製ふたばちゃんねるの<a target="_blank" rel="nofollow noopener" href="https://github.com/futoase/futaba-ng">ソースコード</a>からのフォークで <a target="_blank" rel="nofollow noopener" href="https://news.ycombinator.com/item?id=7639238">4 chan</a> 、<a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/2019_El_Paso_shooting">8 chan</a> と推移するため)、まずベーシックなスクレイピングするプログラムを書いてみる。</p> <p>Rf. <a target="_blank" rel="nofollow noopener" href="https://scrapbox.io/004040/はじめてのあやしいわーるど:システム">はじめてのあやしいわーるど:システム</a><br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/VVuPIOWj--s">【ゆっくりネット史解説】4スレ目~あやしいわーるど~</a><br /> くずはすくりぷと Rev.0.1 Preview 9 (2000.9.3)<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/7m3tu">https://rentry.co/7m3tu</a><br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/ukw3f/">https://rentry.co/ukw3f/</a><br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/ssno4">https://rentry.co/ssno4</a></p> <p>あめぞう歴史<br /> <a target="_blank" rel="nofollow noopener" href="http://history.amebbs.com/">http://history.amebbs.com/</a></p> <hr /> <p>PHP は、バージョンが違うとまるで別物のように思えるので、バージョンは 8 系とする。apache などの web サーバーは必要ない。</p> <p>要約すると、<br /> PHP scraping<br /> で検索すると表示されたページ。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.utakata.work/entry/php/webscraping-with-php-html-parser">https://www.utakata.work/entry/php/webscraping-with-php-html-parser</a><br /> ここに掲載しているコードをコピペで実行してみたら、理解できました。PHP 全く知らなかったですが。</p> <p>以下は、実は <a href="https://crieit.net/posts/Bank-6249a7b59dfd9">漫画Bank / La « mangabank.org » a disparu.</a> という記事(ない)からの続きになっています。</p> <h2 id="PHP 8 インストール for debian"><a href="#PHP+8+%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB+for+debian">PHP 8 インストール for debian</a></h2> <pre><code>sudo apt install -y gnupg2 ca-certificates apt-transport-https software-properties-common lsb-release </code></pre> <pre><code>echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list </code></pre> <pre><code>wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add - </code></pre> <pre><code>sudo apt update </code></pre> <pre><code>sudo apt-get --no-install-recommends install php8 </code></pre> <p>とすることで、<a target="_blank" rel="nofollow noopener" href="https://ja.getdocs.org/how-to-install-php-8-1-and-set-up-a-local-development-environment-on-ubuntu-22-4?amp=1">apache 抜きで PHP8 がインストールされる</a>かもしれない。<br /> されないかもしれない。そこは追求する必要があって、まだこれで完璧というとこまで到達できない。バージョン管理の phpenv があるらしいのでいずれはそれで。</p> <p>パッケージマネージャーは、<a target="_blank" rel="nofollow noopener" href="https://ja.m.wikipedia.org/wiki/Composer">composer</a> というものがあるので、バージョン 2 系のものを使う。なぜなら、php-html-parser というモジュールを使いたいからで、composer2 では無事にインストールできたから。</p> <p>スクレイピングについては、色々と常識と非常識があって、それらは考慮したいが、知らない、知る前にやってしまう、やってしまった方がいいこともある。というスタンスで、できるだけ非常識にならないように、<a href="https://crieit.net/posts/4daedd75f0cec1b328d4e661d9337bd3">非常識のキョクホクのサイト</a>をスクレイピングしてみる。</p> <p>さて。</p> <p>composer 2 自体のインストールは、省略。これもまた、どうするのがベストかわからない。簡単な方法でできればよし。できなければ深掘りしていくことになるが、インストールはできないということはないはず。</p> <p>php-html-parser のインストール。https://github.com/paquettg/php-html-parser</p> <pre><code class="terminal">~$ composer require paquettg/php-html-parser </code></pre> <p>php-html-parser とは jQuery のような感じで、html を扱うものだと思う。<br /> そういうものは、いろんな言語であって、go だと <a target="_blank" rel="nofollow noopener" href="https://pkg.go.dev/github.com/PuerkitoBio/goquery">goquery</a>、Lua だと <a target="_blank" rel="nofollow noopener" href="https://craigbarnes.gitlab.io/lua-gumbo/#examples">lua-gumbo</a>、Nim だと <a target="_blank" rel="nofollow noopener" href="https://github.com/GULPF/nimquery">nimquery</a>、julia だと <a target="_blank" rel="nofollow noopener" href="https://github.com/JuliaWeb/Gumbo.jl">Gumbo</a> とかで、それぞれ自分自身を解説するとき jQuery みたいなやつだからーとだけかいてあることが多いために使い方を調べるのには苦労する。<br /> だけれども、一度どこかでその無限に時間を浪費するかのような道通ると、どこかで別のに出会っても、多少違うがほとんど同じという経験をする。おそらくそのために解説が省かれるのだと思う。だいたいおなじなので、どれかで分かりやすい解説が見つかれば一通りやってみるのがいい。</p> <p>つまりは、html のタグとかタグ内の要素だとかで検索してずるずるっと引っ張ってきて、タグで挟まれたテキストを抽出したり、タグを付け足したりということをするためのものだ。<br /> 全然わからなければ、正規表現のようなもので代用することもある程度可能なので、正規表現に無限に時間をかける道も通っておいたらいいのかもしれない。</p> <p>たとえば、ながいながい html ドキュメントに、</p> <pre><code class="html"><a href="http://example.com/">リンク</a> </code></pre> <p>みたいな箇所がたくさんあって、これらをずるっと全部抜き出して、配列に入れて吟味したい場合に<code>find("a")</code>みたいにして a タグのものすべてを簡単にひっぱってこれるといいね、ということを満たすもので、タグの中の attribute <code>href</code> で判別して、それが含まれるもの全部をひっぱってくるとかの用途に使う。</p> <pre><code class="php">$url_1 = "https://search.brave.com/search?q=kadokawa+川上"; $dom = new Dom(); $dom->loadFromUrl($url_1, $options); $element_a = $dom->find('a'); // a tag のリンクのエレメント全部を配列 $element_a に集める foreach($element_a as $index=>$link){ echo $index . ' ' . $link->{'href'} . "\n\n"; } </code></pre> <hr /> <p>だいたい用途が同じものの場合はドキュメントが省略されるので、だいたい同じもののドキュメントがあれば参考にする。<br /> <a target="_blank" rel="nofollow noopener" href="https://simplehtmldom.sourceforge.io/docs/1.9/manual/creating-dom-objects/">Simple HTML DOM documentation</a></p> <h2 id="scraping.php"><a href="#scraping.php">scraping.php</a></h2> <pre><code class="php"><?php require_once __DIR__ . '/vendor/autoload.php'; use PHPHtmlParser\Dom; use PHPHtmlParser\Options; $options = new Options(); $options->setEnforceEncoding('utf8'); $url1 = 'https://13dl.me/list/popular/'; function scrape($counter,$options,&$element_a){ $titles = array(); $next = ""; foreach($element_a as $line){ if(preg_match('/title/',"$line")) { $div = $line->find('div'); if(preg_match('/div/',"$div")) { $titles[] = $div->text; }else{ if(preg_match('/Next/',"$line")){ $attr = 'href'; $next = $line->$attr; } } }else{ ; } } unset($element_a); foreach($titles as $xxxx){ $counter ++; echo $counter . " title :" . $xxxx . "\n"; } unset($titles); return array("$next",$counter); } $counter = 0; while($url1 != ''){ if(preg_match('/http/',"$url1")) { try { $dom = new Dom(); $dom->loadFromUrl($url1, $options); $element_a = $dom->find('a'); list($url1,$counter) = scrape($counter,$options,$element_a); unset($element_a); unset($dom); } catch (Exception $e) { $e->getMessage(); } } else { die('stop:' . $url1); } } die('End.'); ?> </code></pre> tomato