この記事は約21分31秒で読むことができます。

body閉じタグの直前にscriptタグを挿入した話(スクレイピング 環境構築に派生した話)

まえがき

スクレイピングなんだろって気になった。ググって、調べていたら、おもしろそうとおもってスクレイピングするローカルホスト環境を構築したいなと思いました。

参考文献

記号を言葉で表現できなかったから調べた。

キーボード特殊記号の読み方  

関数定義と関数呼出の方法知っておけばいいとおもう。

関数の定義と呼び出し  

フォルダ構成

__htmlに対してsedかます

コード表示

[oracle@centos weban]$ ll
合計 192
-rw-r--r--. 1 oracle docker    246  5月 25 08:44 Dockerfile
-rw-r--r--. 1 oracle docker 176088  5月 25 09:57 __.html
-rwxr-xr-x. 1 oracle docker    807  5月 17 16:46 kick.sh
-rw-r--r--. 1 root   root       96  5月 25 09:53 screep.js
drwxr-xr-x. 6 oracle docker   4096  5月 20 20:10 src
drwxr-xr-x. 2 oracle docker   4096  5月 19 22:31 tmp
[oracle@centos weban]$ docker exec -it httpd /bin/bash
[root@6d1f534a84b7 /]# cd /var/www/html
[root@6d1f534a84b7 html]# ll
total 192
-rw-r--r--. 1 1000 1001    246 May 24 23:44 Dockerfile
-rw-r--r--. 1 1000 1001 176088 May 25 00:57 __.html
-rwxr-xr-x. 1 1000 1001    807 May 17 07:46 kick.sh
-rw-r--r--. 1 root root     96 May 25 00:53 screep.js
drwxr-xr-x. 6 1000 1001   4096 May 20 11:10 src
drwxr-xr-x. 2 1000 1001   4096 May 19 13:31 tmp

Dockerfile

コード表示

[oracle@centos weban]$ cat D*
FROM centos:latest

RUN yum install -y httpd \ 
yum install -y iputils \
yum install -y net-tools \
yum install -y iproute \
yum install -y vim \
yum install -y tree \
yum install -y lsof \
yum install -y traceroute

EXPOSE 80
CMD ["/sbin/init"]

コンテナ作成

コード表示

[oracle@centos weban]$ docker build -t centos_httpd .
[oracle@centos weban]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos_httpd        latest              1eeca6ecbb88        2 hours ago         389MB
centos_php          latest              8d9f2dcb8da1        3 days ago          499MB
centos              latest              9f38484d220f        2 months ago        202MB

コンテナ起動

コード表示

[oracle@centos weban]$ docker run --privileged -v $(pwd):/var/www/html -p 8080:80 --name httpd -itd centos_httpd /sbin/init
[oracle@centos weban]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
6d1f534a84b7        centos_httpd        "/sbin/init"        2 hours ago         Up 2 hours          0.0.0.0:8080->80/tcp   httpd

httpdサービス起動

コード表示

[oracle@centos weban]$ docker exec -it httpd systemctl start httpd
[oracle@centos weban]$ docker exec -it httpd systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-05-24 23:58:50 UTC; 1h 36min ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 2663 (httpd)
   Status: "Total requests: 38; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /docker/6d1f534a84b7d7b77dd82169582df46058867c0f159d829c9ff92735d3e28a62/system.slice/httpd.service
           ├─2663 /usr/sbin/httpd -DFOREGROUND
           ├─2664 /usr/sbin/httpd -DFOREGROUND
           ├─2665 /usr/sbin/httpd -DFOREGROUND
           ├─2666 /usr/sbin/httpd -DFOREGROUND
           ├─2667 /usr/sbin/httpd -DFOREGROUND
           ├─2668 /usr/sbin/httpd -DFOREGROUND
           └─2682 /usr/sbin/httpd -DFOREGROUND
           ‣ 2663 /usr/sbin/httpd -DFOREGROUND

May 24 23:58:50 6d1f534a84b7 systemd[1]: Starting The Apache HTTP Server...
May 24 23:58:50 6d1f534a84b7 httpd[2663]: AH00558: httpd: Could not reliably...e
May 24 23:58:50 6d1f534a84b7 systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.

【OK】埋め込む用のsed

レフト・アングル、ライト・アングルはエスケープしなくてOKだったことに気付いた。

コード表示

sed -e 's/<\/body>/\<script type=\"text\/javascript\" src=\"screep.js\"\>\<\/script\><\/body>/' __.html | grep \</body\>

【NG】埋め込む用のsed

レフト・アングル、ライト・アングルはエスケープしなくてOKだったことに気付いた。

コード表示

sed -e 's/\<\/body\>/\<script type=\"text\/javascript\" src=\"screep.js\"\>\<\/script\><\/body>/' __.html | grep \</body\>

【OK】埋め込む用のsed上書き指定

-i指定

コード表示

sed -i -e 's/<\/body>/\<script type=\"text\/javascript\" src=\"screep.js\"\>\<\/script\><\/body>/' __.html | grep \</body\>

確認

NGパターンで置換していない状態を確認し、OKパターンで置換されたことを確認する。

コード表示

[root@6d1f534a84b7 html]# sed -e 's/\<\/body\>/\<script type=\"text\/javascript\" src=\"screep.js\"\>\<\/script\><\/body>/' __.html | grep \</body\>
<div id="fancybox-tmp"></div><div id="fancybox-loading"><div></div></div><div id="fancybox-overlay"></div><div id="fancybox-wrap"><div id="fancybox-outer"><div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div><div id="fancybox-content"></div><a id="fancybox-close"></a><div id="fancybox-title"></div><a id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a><a id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a></div></div></body>
[root@6d1f534a84b7 html]# sed -e 's/<\/body>/\<script type=\"text\/javascript\" src=\"screep.js\"\>\<\/script\><\/body>/' __.html | grep \</body\>
<div id="fancybox-tmp"></div><div id="fancybox-loading"><div></div></div><div id="fancybox-overlay"></div><div id="fancybox-wrap"><div id="fancybox-outer"><div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div><div id="fancybox-content"></div><a id="fancybox-close"></a><div id="fancybox-title"></div><a id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a><a id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a></div></div><script type="text/javascript" src="screep.js"></script></body>

スクレイピングの練習環境をミニマムに作りたかった

screep.js

コード表示

function an(){
  var html = document.getElementsByTagName('html');
  console.log(html);
}
an();

firefoxのコンソールログでscreepを検索条件に入力すると見易い。自分のサイトをスクレイピングの犠牲にする。

あとがき

スクレイピングっておもしろい。練習は自分のサイトをlocalhostに落としてからやればよさそう。イメージどおりに練習環境つくれた。「スクレイピング 環境構築」でぐぐっていたらseleniumヒットして「ぁぁあったのか」となったけど、まぁいいか。以上、ありがとうございました。

Webスクレイピング入門

Leave a Reply

Your email address will not be published. Required fields are marked *