tag:crieit.net,2005:https://crieit.net/tags/scraping/feed 「scraping」の記事 - Crieit Crieitでタグ「scraping」に投稿された最近の記事 2022-09-25T11:27:24+09:00 https://crieit.net/tags/scraping/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 tag:crieit.net,2005:PublicArticle/17923 2022-01-07T12:34:32+09:00 2022-01-31T21:18:21+09:00 https://crieit.net/posts/BANK ある一つのサイト についての <h1 id="思い出"><a href="#%E6%80%9D%E3%81%84%E5%87%BA">思い出</a></h1> <p>過去 6 ヶ月間、ひたすらひとつの違法マンガサイトを見ていた。</p> <p>ずっと見ていたのは公開されたマンガコンテンツではなく、サイト運営者が作ってるデータをひたすら見ていたので、11 月の 4 日、15 時くらいにサイトをたたんだのを確認した。<sup id="fnref:100"><a href="#fn:100" class="footnote-ref" role="doc-noteref">1</a></sup></p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/e0ec8e48-727f-bf85-14b5-bb3ff3625497.png" alt="Screenshot_20211104-164634.png" /></p> <p>おそらくこの翻訳記事 2021年11月04日 14時00分</p> <blockquote> <p>Manga Publisher Wants to Sue Huge Piracy Network, Needs Google's Help * TorrentFreak<br /> <code>https://torrentfreak.com/manga-publisher-wants-to-sue-huge-piracy-network-needs-googles-help-211101/</code></p> </blockquote> <p>注) 'Shueisha’s application and proposed orders/subpoenas can be found here (1,2,3,4 pdf)' の書類が興味深い。</p> <p><a target="_blank" rel="nofollow noopener" href="https://gigazine.net/news/20211104-manga-shueisha-googles-piracy-mangabank/">https://gigazine.net/news/20211104-manga-shueisha-googles-piracy-mangabank/</a></p> <p>が公開されたことで、サイト運営者が違法性を自認して、サイト閉鎖を決定したのではないかと思われる。</p> <p>2021.12月中頃、mangabank.org とはまた別のドメインで再開している。<br /> 画像ファイルのあるアドレスのドメインを whois したところ、cloudflare の管轄のホストではなさそうな感じ。</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/119a01df-c5bf-ba57-9f8d-50947320e8ec.jpeg" alt="Screenshot_20211230-001601.jpg" /></p> <hr /> <p>過去に書いたこのような記事は、当時、宣伝につながらないように配慮して明記しなかったが、全て漫画 BANK についてのことだった。</p> <p>以下、2021年11月04日 以前</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/dauuricus/items/563cbcc9776f66cb672e">https://qiita.com/dauuricus/items/563cbcc9776f66cb672e</a></p> <p>6 月の時点では 5 万ページぼどだと思っていたが 10 月には 6 万ページ以上あることがわかった。</p> <p>この 6 万ページというのはマンガコンテンツの漫画の総ページ数のことではなくて、URL のことで、そのひとつの URL に 30 点から 300 点ぐらいの画像ファイルの URL が埋め込まれている。<br /> その画像一枚が、漫画のスキャン画像ファイルの一点に相当する。</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/592fa176-0e08-7dd1-4769-4baef444ba24.png" alt="Screenshot_photo-586353998.png" /></p> <p>画像点数にすると、空想すると数えたことないおおきな数になるので、いずれいつか数えようと数えなかったが、その 6 万ページについては 著者 / 漫画のタイトル / 公開されていた URL / アップデート日時の情報 / 付与されていたタグ のデータのセットを記録した。</p> <p>スキャン画像のファイルが漫画 BANK の見ているページに読み込まれるようにページのソースの中に URL が埋め込まれていて、観測した限りのその URL は、全てが cloudflare がホスティングしているドメインだった<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">2</a></sup> ( 2021年 7月の調べ )</p> <p>これが全てではないが、数千のアドレスから集計すると、こちらのドメインに収束した。</p> <pre><code>0 ssl.appx.buzz 1 ssl.asiax.cloud 2 ssl.stagingy.store 3 ssl.lsw.buzz 4 ssl.advx.cloud 5 ssl.appuru.store 6 ssl.lss.buzz 7 ssl.remon.store 8 ssl.lsq.buzz 9 ssl.lsb.buzz 10 ssl.appsx.cloud 11 ssl.lsh.buzz 12 ssl.raichi.store 13 ssl.lsr.buzz 14 ssl.akaax.com 15 ssl.axax.cloud 16 ssl.lsk.buzz 17 ssl.lsy.buzz 18 ssl.zqap.cloud 19 ssl.skyly.cloud 20 ssl.akax.cloud 21 ssl.zmqx.cloud 22 ssl.lssaq.cloud 23 ssl.lsm.buzz 24 ssl.nexc.store </code></pre> <p>参照: 🥝<a target="_blank" rel="nofollow noopener" href="https://zenn.dev/kurocat/articles/55565f019754cb">ページの中から lazy load の画像 URL を抽出する。</a></p> <p>画像の著作権情報<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">3</a></sup>と、公開されている cloudflare のドメインの画像ファイルアドレスのリストがあれば、すんなり停止できるのだろうなと<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">4</a></sup>考えていたが、ずいぶんとほったらかしているな、あれ ? ゼンゼンナニモシナイノ ? と不思議に思えた。<br /> たしか 2019 年<sup id="fnref:0"><a href="#fn:0" class="footnote-ref" role="doc-noteref">5</a></sup>までサイトブロッキング<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">6</a></sup>しかない!<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">7</a></sup> という主張さえあったのだが<sup id="fnref:7"><a href="#fn:7" class="footnote-ref" role="doc-noteref">8</a></sup>、その前にどこまでどうしたのかは、主張からはさっぱりわからないので、「どこまでどうできるのか」がずっと気にかかっていた。</p> <p>サイトブロッキング法制化、中間まとめは先送り<br /> 浅川 直輝 日経 xTECH/日経コンピュータ<br /> 2018.09.20<br /> <a target="_blank" rel="nofollow noopener" href="https://xtech.nikkei.com/atcl/nxt/column/18/00001/01044/">https://xtech.nikkei.com/atcl/nxt/column/18/00001/01044/</a></p> <p>朝日新聞デジタル<br /> 海賊版サイト対策、まとまらず 検討会議は無期限延期に<br /> 上田真由美 川本裕司 2018年10月16日 0時10分<br /> <a target="_blank" rel="nofollow noopener" href="https://www.asahi.com/articles/ASLBH5W88LBHUCLV00L.html">https://www.asahi.com/articles/ASLBH5W88LBHUCLV00L.html</a></p> <p>過去のしりきれとんぼになっている<strong>インターネット上の海賊版対策に関する検討会議 第9回会合 議事録</strong>を読んでいると <strong>とりまとまらない</strong>報告となった理由が熱くて面白かった。「両論併記をしない」という主張についての理由が議事録には残っている。</p> <p><a href="https://crieit.now.sh/upload_images/1ad698b79781afe59ebc1f9702c5222161dd706b56a71.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1ad698b79781afe59ebc1f9702c5222161dd706b56a71.png?mw=700" alt="image" /></a></p> <p>Rf.インターネット上の海賊版対策に関する検討会議 第9回会合 議事録</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.kantei.go.jp/jp/singi/titeki2/tyousakai/kensho_hyoka_kikaku/index.html">https://www.kantei.go.jp/jp/singi/titeki2/tyousakai/kensho_hyoka_kikaku/index.html</a></p> <hr /> <blockquote> <p>Mangabank “Suffers DDoS Attack” & Disappears Following Legal Action<br /> November 9, 2021 by Andy Maxwell</p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://torrentfreak.com/mangabank-suffers-ddos-attack-disappears-following-legal-action-211109/">https://torrentfreak.com/mangabank-suffers-ddos-attack-disappears-following-legal-action-211109/</a></p> <p>注) 'A declaration filed with the court by Shueisha ( pdf ) contains a copy of Cloudflare's response to the DMCA subpoena filed earlier this year.' のところが興味深い。</p> <p><a target="_blank" rel="nofollow noopener" href="https://torrentfreak-com.translate.goog/mangabank-suffers-ddos-attack-disappears-following-legal-action-211109/?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=nui">翻訳</a></p> <p>漫画 BANK のアップロードして公開されていたタイトル名には命名規則があり、文字列抽出して、タイトルから検索して、間違った書籍情報をひっぱってくるものを選んでよくみると、簡単な間違いをしているものがあった。そして、これは間違いようなさそうなスペル間違いだったりなので、なにか、その前の段階 ? のもとで間違っていて、改正すると整合がとれないので、そのままにしているのではないかと思われた。<br /> なにと比べるのか。<br /> つまり、コピーしてきて、世の中では、そのタイトル名が通用していて、それは、オリジナルのタイトルからすると間違っているが、ファイル名としては正しいというような場合が考えられる。</p> <p>つまり、コピーなのだと思う。自らスキャンして、自らファイル名をつけて、アップロードしてるわけではないという場合、そうなるかなと思う。<br /> そう考えると、そのファイル名で、普通に検索すると、同じ間違ったタイトル名がひっかかるので、そいうことなのだ。</p> <p>だとするならば、なんらかの理由で漫画をスキャンしてアップロードする人間がいて、それを告知する、そしてそのデータを加工するなどする人間がいるというエコサイクルのなかで、ネット上のアップロードファイルから回収されたものを展示しているということになるので、そのセレクトセンスによって傾向がみられるということである。<br /> かなり古い漫画も選ばれていて、そのタイトルを知っているということは特徴的でもある。</p> <p>とはいえ、興味は運営者が誰なのか...というところには全く無く、データがどうなってんのかな? どういう風に作ってるのかな? 全部のデータはいくつあるのか知るにはどういうアプローチでやるのかなというところに重点があり、ではどこから来たデータで、どういうモチベーションで出てきたファイルなんだろうかということに疑問をもちはじめた。</p> <p>なんらかのモチベーションで日本の漫画をスキャニングし、ネットワークにアップロードする行為から始まり、ローカライズ(翻訳)し、漫画の言語を替えて、きれいに文字をのせて公開する一連のことを、<a href="https://crieit.net/posts/bbb085470b763b7e8bcb423f4b235d64#fn:10">スキャンレーション</a>と呼んでいるらしい。</p> <p><a href="https://crieit.net/posts/4daedd75f0cec1b328d4e661d9337bd3">ある一つのサイトについての 現在</a> へつづく</p> <p>せきららなコード(ちょっと古くなってるけど、今の状況に合わせて少しだけ修正したら使える)</p> <p><a target="_blank" rel="nofollow noopener" href="https://kuroca.hatenablog.com/">https://kuroca.hatenablog.com/</a></p> <hr /> <div class="footnotes" role="doc-endnotes"> <hr /> <ol> <li id="fn:100" role="doc-endnote"> <p>2021/11/17 はこんな状況 https://pastebin.com/fTcHK0ti <a href="#fnref:100" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:5" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/kurocat/articles/eb233dc31bb285">違法と思われるマンガ Thank(仮称)の HTML の構造をよく確認する</a> <a href="#fnref:5" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:4" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/dauuricus/items/cd7143f84ad03fe17752">本の ISBN 情報なしに、本の題名から書籍データを抽出したいということ。</a> <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:6" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://www.nikkei.com/article/DGXMZO3631981010102018CR8000/">権利侵害記事、保存も違法 東京地裁が米社に仮処分 2018年10月10日</a> <a href="#fnref:6" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:0" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://www.kantei.go.jp/jp/singi/titeki2/tyousakai/kensho_hyoka_kikaku/index.html">インターネット上の海賊版対策に関する検討会議</a> <a href="#fnref:0" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:1" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://internet.watch.impress.co.jp/docs/special/1128898.html">海賊版サイトをブロッキングするための5つの手法 Internet Society 日本支部 2018年6月22日</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:2" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://xtech.nikkei.com/atcl/nxt/column/18/00001/00469/">カドカワ川上量生社長が語る、サイトブロッキングの必要性 浅川 直輝 日経xTECH/日経コンピュータ</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:7" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://www.sankei.com/article/20190114-NB33HYAHTZOORB6CZY7BGLQ36M/">海賊版「ブロッキング」法制化断念 政府、広告抑制など総合対策で対応 2019/1/14</a> <a href="#fnref:7" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> </ol> </div> tomato