Ccmmutty logo
Commutty IT
11 min read

pythonでスクレイピングしてみよう ~ラクマ編~

https://cdn.magicode.io/media/notebox/c8a9688b-c899-43d5-8945-434da9b755c4.jpeg

Magicode内でスクレイピングの動作をテストしたい

  • 今回は○クマをターゲットサイトに設定し、キーワード『ゴジラ 美品』の検索結果を整理してみる
  • requestsBeautifulsoupをつかう
  • 内容を忘れちゃった時のために、ちょっとだけ説明風にまとめる
  • その中で起きたエラーなども自分用メモとして。。。

見つけたエラー

.select(” ", class_=" ")と記述するとエラーが起きる

× .select("a", class_="link_search_image") #エラー
.select('a[class="link_search_image"]') #こちらの記述形式でエラーが解消
class_=ってめちゃくちゃ便利ですよね。 私は多用しまくっています。
このエラーが起きたとき、何が起きたか全く意味不明で、あぁ終わったと思いました。

次のや〜つ

内容をか〜く

スクレイピングを動かしてみよう

まずは、Magicode側に必要な機能をインストール

python
!pip install pandas bs4 lxml requests

Requirement already satisfied: pandas in /srv/conda/envs/notebook/lib/python3.7/site-packages (1.1.5)
Collecting bs4
Downloading bs4-0.0.1.tar.gz (1.1 kB) Preparing metadata (setup.py) ... [?25l
- done [?25h
Collecting lxml Downloading lxml-4.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (6.4 MB) [?25l | | 10 kB 14.8 MB/s eta 0:00:01 | | 20 kB 10.8 MB/s eta 0:00:01 |▏ | 30 kB 7.5 MB/s eta 0:00:01 |▏ | 40 kB 7.4 MB/s eta 0:00:01 |▎ | 51 kB 5.3 MB/s eta 0:00:02
|▎ | 61 kB 6.2 MB/s eta 0:00:02 |▍ | 71 kB 5.8 MB/s eta 0:00:02 |▍ | 81 kB 6.6 MB/s eta 0:00:01 |▌ | 92 kB 6.5 MB/s eta 0:00:01 |▌ | 102 kB 6.7 MB/s eta 0:00:01 |▋ | 112 kB 6.7 MB/s eta 0:00:01 |▋ | 122 kB 6.7 MB/s eta 0:00:01 |▊ | 133 kB 6.7 MB/s eta 0:00:01 |▊ | 143 kB 6.7 MB/s eta 0:00:01 |▊ | 153 kB 6.7 MB/s eta 0:00:01 |▉ | 163 kB 6.7 MB/s eta 0:00:01 |▉ | 174 kB 6.7 MB/s eta 0:00:01 |█ | 184 kB 6.7 MB/s eta 0:00:01 |█ | 194 kB 6.7 MB/s eta 0:00:01 |█ | 204 kB 6.7 MB/s eta 0:00:01 |█ | 215 kB 6.7 MB/s eta 0:00:01 |█▏ | 225 kB 6.7 MB/s eta 0:00:01 |█▏ | 235 kB 6.7 MB/s eta 0:00:01 |█▎ | 245 kB 6.7 MB/s eta 0:00:01 |█▎ | 256 kB 6.7 MB/s eta 0:00:01 |█▍ | 266 kB 6.7 MB/s eta 0:00:01 |█▍ | 276 kB 6.7 MB/s eta 0:00:01 |█▍ | 286 kB 6.7 MB/s eta 0:00:01 |█▌ | 296 kB 6.7 MB/s eta 0:00:01 |█▌ | 307 kB 6.7 MB/s eta 0:00:01 |█▋ | 317 kB 6.7 MB/s eta 0:00:01 |█▋ | 327 kB 6.7 MB/s eta 0:00:01 |█▊ | 337 kB 6.7 MB/s eta 0:00:01 |█▊ | 348 kB 6.7 MB/s eta 0:00:01 |█▉ | 358 kB 6.7 MB/s eta 0:00:01 |█▉ | 368 kB 6.7 MB/s eta 0:00:01 |██ | 378 kB 6.7 MB/s eta 0:00:01 |██ | 389 kB 6.7 MB/s eta 0:00:01 |██ | 399 kB 6.7 MB/s eta 0:00:01 |██ | 409 kB 6.7 MB/s eta 0:00:01 |██ | 419 kB 6.7 MB/s eta 0:00:01 |██▏ | 430 kB 6.7 MB/s eta 0:00:01 |██▏ | 440 kB 6.7 MB/s eta 0:00:01 |██▎ | 450 kB 6.7 MB/s eta 0:00:01 |██▎ | 460 kB 6.7 MB/s eta 0:00:01 |██▍ | 471 kB 6.7 MB/s eta 0:00:01 |██▍ | 481 kB 6.7 MB/s eta 0:00:01 |██▌ | 491 kB 6.7 MB/s eta 0:00:01 |██▌ | 501 kB 6.7 MB/s eta 0:00:01 |██▋ | 512 kB 6.7 MB/s eta 0:00:01 |██▋ | 522 kB 6.7 MB/s eta 0:00:01 |██▊ | 532 kB 6.7 MB/s eta 0:00:01 |██▊ | 542 kB 6.7 MB/s eta 0:00:01 |██▊ | 552 kB 6.7 MB/s eta 0:00:01 |██▉ | 563 kB 6.7 MB/s eta 0:00:01 |██▉ | 573 kB 6.7 MB/s eta 0:00:01 |███ | 583 kB 6.7 MB/s eta 0:00:01 |███ | 593 kB 6.7 MB/s eta 0:00:01 |███ | 604 kB 6.7 MB/s eta 0:00:01 |███ | 614 kB 6.7 MB/s eta 0:00:01 |███▏ | 624 kB 6.7 MB/s eta 0:00:01 |███▏ | 634 kB 6.7 MB/s eta 0:00:01 |███▎ | 645 kB 6.7 MB/s eta 0:00:01 |███▎ | 655 kB 6.7 MB/s eta 0:00:01 |███▍ | 665 kB 6.7 MB/s eta 0:00:01 |███▍ | 675 kB 6.7 MB/s eta 0:00:01 |███▍ | 686 kB 6.7 MB/s eta 0:00:01 |███▌ | 696 kB 6.7 MB/s eta 0:00:01 |███▌ | 706 kB 6.7 MB/s eta 0:00:01 |███▋ | 716 kB 6.7 MB/s eta 0:00:01 |███▋ | 727 kB 6.7 MB/s eta 0:00:01 |███▊ | 737 kB 6.7 MB/s eta 0:00:01 |███▊ | 747 kB 6.7 MB/s eta 0:00:01 |███▉ | 757 kB 6.7 MB/s eta 0:00:01 |███▉ | 768 kB 6.7 MB/s eta 0:00:01 |████ | 778 kB 6.7 MB/s eta 0:00:01 |████ | 788 kB 6.7 MB/s eta 0:00:01 |████ | 798 kB 6.7 MB/s eta 0:00:01 |████ | 808 kB 6.7 MB/s eta 0:00:01 |████ | 819 kB 6.7 MB/s eta 0:00:01 |████▏ | 829 kB 6.7 MB/s eta 0:00:01 |████▏ | 839 kB 6.7 MB/s eta 0:00:01 |████▎ | 849 kB 6.7 MB/s eta 0:00:01 |████▎ | 860 kB 6.7 MB/s eta 0:00:01 |████▍ | 870 kB 6.7 MB/s eta 0:00:01 |████▍ | 880 kB 6.7 MB/s eta 0:00:01 |████▌ | 890 kB 6.7 MB/s eta 0:00:01 |████▌ | 901 kB 6.7 MB/s eta 0:00:01 |████▋ | 911 kB 6.7 MB/s eta 0:00:01 |████▋ | 921 kB 6.7 MB/s eta 0:00:01 |████▊ | 931 kB 6.7 MB/s eta 0:00:01 |████▊ | 942 kB 6.7 MB/s eta 0:00:01 |████▊ | 952 kB 6.7 MB/s eta 0:00:01 |████▉ | 962 kB 6.7 MB/s eta 0:00:01 |████▉ | 972 kB 6.7 MB/s eta 0:00:01 |█████ | 983 kB 6.7 MB/s eta 0:00:01 |█████ | 993 kB 6.7 MB/s eta 0:00:01 |█████ | 1.0 MB 6.7 MB/s eta 0:00:01 |█████ | 1.0 MB 6.7 MB/s eta 0:00:01 |█████▏ | 1.0 MB 6.7 MB/s eta 0:00:01 |█████▏ | 1.0 MB 6.7 MB/s eta 0:00:01 |█████▎ | 1.0 MB 6.7 MB/s eta 0:00:01 |█████▎ | 1.1 MB 6.7 MB/s eta 0:00:01 |█████▍ | 1.1 MB 6.7 MB/s eta 0:00:01 |█████▍ | 1.1 MB 6.7 MB/s eta 0:00:01 |█████▍ | 1.1 MB 6.7 MB/s eta 0:00:01 |█████▌ | 1.1 MB 6.7 MB/s eta 0:00:01 |█████▌ | 1.1 MB 6.7 MB/s eta 0:00:01 |█████▋ | 1.1 MB 6.7 MB/s eta 0:00:01 |█████▋ | 1.1 MB 6.7 MB/s eta 0:00:01 |█████▊ | 1.1 MB 6.7 MB/s eta 0:00:01 |█████▊ | 1.1 MB 6.7 MB/s eta 0:00:01 |█████▉ | 1.2 MB 6.7 MB/s eta 0:00:01 |█████▉ | 1.2 MB 6.7 MB/s eta 0:00:01 |██████ | 1.2 MB 6.7 MB/s eta 0:00:01 |██████ | 1.2 MB 6.7 MB/s eta 0:00:01 |██████ | 1.2 MB 6.7 MB/s eta 0:00:01 |██████ | 1.2 MB 6.7 MB/s eta 0:00:01 |██████ | 1.2 MB 6.7 MB/s eta 0:00:01 |██████▏ | 1.2 MB 6.7 MB/s eta 0:00:01 |██████▏ | 1.2 MB 6.7 MB/s eta 0:00:01 |██████▎ | 1.2 MB 6.7 MB/s eta 0:00:01 |██████▎ | 1.3 MB 6.7 MB/s eta 0:00:01 |██████▍ | 1.3 MB 6.7 MB/s eta 0:00:01 |██████▍ | 1.3 MB 6.7 MB/s eta 0:00:01 |██████▌ | 1.3 MB 6.7 MB/s eta 0:00:01 |██████▌ | 1.3 MB 6.7 MB/s eta 0:00:01 |██████▋ | 1.3 MB 6.7 MB/s eta 0:00:01 |██████▋ | 1.3 MB 6.7 MB/s eta 0:00:01 |██████▊ | 1.3 MB 6.7 MB/s eta 0:00:01 |██████▊ | 1.3 MB 6.7 MB/s eta 0:00:01 |██████▊ | 1.4 MB 6.7 MB/s eta 0:00:01 |██████▉ | 1.4 MB 6.7 MB/s eta 0:00:01 |██████▉ | 1.4 MB 6.7 MB/s eta 0:00:01 |███████ | 1.4 MB 6.7 MB/s eta 0:00:01 |███████ | 1.4 MB 6.7 MB/s eta 0:00:01 |███████ | 1.4 MB 6.7 MB/s eta 0:00:01 |███████ | 1.4 MB 6.7 MB/s eta 0:00:01 |███████▏ | 1.4 MB 6.7 MB/s eta 0:00:01 |███████▏ | 1.4 MB 6.7 MB/s eta 0:00:01 |███████▎ | 1.4 MB 6.7 MB/s eta 0:00:01 |███████▎ | 1.5 MB 6.7 MB/s eta 0:00:01 |███████▍ | 1.5 MB 6.7 MB/s eta 0:00:01 |███████▍ | 1.5 MB 6.7 MB/s eta 0:00:01 |███████▍ | 1.5 MB 6.7 MB/s eta 0:00:01 |███████▌ | 1.5 MB 6.7 MB/s eta 0:00:01 |███████▌ | 1.5 MB 6.7 MB/s eta 0:00:01 |███████▋ | 1.5 MB 6.7 MB/s eta 0:00:01 |███████▋ | 1.5 MB 6.7 MB/s eta 0:00:01 |███████▊ | 1.5 MB 6.7 MB/s eta 0:00:01 |███████▊ | 1.5 MB 6.7 MB/s eta 0:00:01 |███████▉ | 1.6 MB 6.7 MB/s eta 0:00:01 |███████▉ | 1.6 MB 6.7 MB/s eta 0:00:01 |████████ | 1.6 MB 6.7 MB/s eta 0:00:01 |████████ | 1.6 MB 6.7 MB/s eta 0:00:01 |████████ | 1.6 MB 6.7 MB/s eta 0:00:01 |████████ | 1.6 MB 6.7 MB/s eta 0:00:01 |████████ | 1.6 MB 6.7 MB/s eta 0:00:01 |████████▏ | 1.6 MB 6.7 MB/s eta 0:00:01 |████████▏ | 1.6 MB 6.7 MB/s eta 0:00:01 |████████▎ | 1.6 MB 6.7 MB/s eta 0:00:01 |████████▎ | 1.7 MB 6.7 MB/s eta 0:00:01 |████████▍ | 1.7 MB 6.7 MB/s eta 0:00:01 |████████▍ | 1.7 MB 6.7 MB/s eta 0:00:01 |████████▌ | 1.7 MB 6.7 MB/s eta 0:00:01 |████████▌ | 1.7 MB 6.7 MB/s eta 0:00:01 |████████▋ | 1.7 MB 6.7 MB/s eta 0:00:01 |████████▋ | 1.7 MB 6.7 MB/s eta 0:00:01 |████████▊ | 1.7 MB 6.7 MB/s eta 0:00:01 |████████▊ | 1.7 MB 6.7 MB/s eta 0:00:01 |████████▊ | 1.8 MB 6.7 MB/s eta 0:00:01 |████████▉ | 1.8 MB 6.7 MB/s eta 0:00:01 |████████▉ | 1.8 MB 6.7 MB/s eta 0:00:01 |█████████ | 1.8 MB 6.7 MB/s eta 0:00:01 |█████████ | 1.8 MB 6.7 MB/s eta 0:00:01 |█████████ | 1.8 MB 6.7 MB/s eta 0:00:01 |█████████ | 1.8 MB 6.7 MB/s eta 0:00:01 |█████████▏ | 1.8 MB 6.7 MB/s eta 0:00:01 |█████████▏ | 1.8 MB 6.7 MB/s eta 0:00:01 |█████████▎ | 1.8 MB 6.7 MB/s eta 0:00:01 |█████████▎ | 1.9 MB 6.7 MB/s eta 0:00:01 |█████████▍ | 1.9 MB 6.7 MB/s eta 0:00:01 |█████████▍ | 1.9 MB 6.7 MB/s eta 0:00:01 |█████████▍ | 1.9 MB 6.7 MB/s eta 0:00:01 |█████████▌ | 1.9 MB 6.7 MB/s eta 0:00:01 |█████████▌ | 1.9 MB 6.7 MB/s eta 0:00:01 |█████████▋ | 1.9 MB 6.7 MB/s eta 0:00:01 |█████████▋ | 1.9 MB 6.7 MB/s eta 0:00:01
|█████████▊ | 1.9 MB 6.7 MB/s eta 0:00:01 |█████████▊ | 1.9 MB 6.7 MB/s eta 0:00:01 |█████████▉ | 2.0 MB 6.7 MB/s eta 0:00:01 |█████████▉ | 2.0 MB 6.7 MB/s eta 0:00:01 |██████████ | 2.0 MB 6.7 MB/s eta 0:00:01 |██████████ | 2.0 MB 6.7 MB/s eta 0:00:01 |██████████ | 2.0 MB 6.7 MB/s eta 0:00:01 |██████████ | 2.0 MB 6.7 MB/s eta 0:00:01 |██████████ | 2.0 MB 6.7 MB/s eta 0:00:01 |██████████▏ | 2.0 MB 6.7 MB/s eta 0:00:01 |██████████▏ | 2.0 MB 6.7 MB/s eta 0:00:01 |██████████▎ | 2.0 MB 6.7 MB/s eta 0:00:01 |██████████▎ | 2.1 MB 6.7 MB/s eta 0:00:01 |██████████▍ | 2.1 MB 6.7 MB/s eta 0:00:01 |██████████▍ | 2.1 MB 6.7 MB/s eta 0:00:01 |██████████▌ | 2.1 MB 6.7 MB/s eta 0:00:01 |██████████▌ | 2.1 MB 6.7 MB/s eta 0:00:01 |██████████▋ | 2.1 MB 6.7 MB/s eta 0:00:01 |██████████▋ | 2.1 MB 6.7 MB/s eta 0:00:01 |██████████▊ | 2.1 MB 6.7 MB/s eta 0:00:01 |██████████▊ | 2.1 MB 6.7 MB/s eta 0:00:01 |██████████▊ | 2.2 MB 6.7 MB/s eta 0:00:01 |██████████▉ | 2.2 MB 6.7 MB/s eta 0:00:01 |██████████▉ | 2.2 MB 6.7 MB/s eta 0:00:01 |███████████ | 2.2 MB 6.7 MB/s eta 0:00:01 |███████████ | 2.2 MB 6.7 MB/s eta 0:00:01 |███████████ | 2.2 MB 6.7 MB/s eta 0:00:01 |███████████ | 2.2 MB 6.7 MB/s eta 0:00:01 |███████████▏ | 2.2 MB 6.7 MB/s eta 0:00:01 |███████████▏ | 2.2 MB 6.7 MB/s eta 0:00:01 |███████████▎ | 2.2 MB 6.7 MB/s eta 0:00:01 |███████████▎ | 2.3 MB 6.7 MB/s eta 0:00:01 |███████████▍ | 2.3 MB 6.7 MB/s eta 0:00:01 |███████████▍ | 2.3 MB 6.7 MB/s eta 0:00:01 |███████████▍ | 2.3 MB 6.7 MB/s eta 0:00:01 |███████████▌ | 2.3 MB 6.7 MB/s eta 0:00:01 |███████████▌ | 2.3 MB 6.7 MB/s eta 0:00:01 |███████████▋ | 2.3 MB 6.7 MB/s eta 0:00:01 |███████████▋ | 2.3 MB 6.7 MB/s eta 0:00:01 |███████████▊ | 2.3 MB 6.7 MB/s eta 0:00:01 |███████████▊ | 2.3 MB 6.7 MB/s eta 0:00:01 |███████████▉ | 2.4 MB 6.7 MB/s eta 0:00:01 |███████████▉ | 2.4 MB 6.7 MB/s eta 0:00:01 |████████████ | 2.4 MB 6.7 MB/s eta 0:00:01 |████████████ | 2.4 MB 6.7 MB/s eta 0:00:01 |████████████ | 2.4 MB 6.7 MB/s eta 0:00:01 |████████████ | 2.4 MB 6.7 MB/s eta 0:00:01 |████████████ | 2.4 MB 6.7 MB/s eta 0:00:01 |████████████▏ | 2.4 MB 6.7 MB/s eta 0:00:01 |████████████▏ | 2.4 MB 6.7 MB/s eta 0:00:01 |████████████▎ | 2.4 MB 6.7 MB/s eta 0:00:01 |████████████▎ | 2.5 MB 6.7 MB/s eta 0:00:01 |████████████▍ | 2.5 MB 6.7 MB/s eta 0:00:01 |████████████▍ | 2.5 MB 6.7 MB/s eta 0:00:01 |████████████▌ | 2.5 MB 6.7 MB/s eta 0:00:01 |████████████▌ | 2.5 MB 6.7 MB/s eta 0:00:01 |████████████▋ | 2.5 MB 6.7 MB/s eta 0:00:01 |████████████▋ | 2.5 MB 6.7 MB/s eta 0:00:01 |████████████▊ | 2.5 MB 6.7 MB/s eta 0:00:01 |████████████▊ | 2.5 MB 6.7 MB/s eta 0:00:01 |████████████▊ | 2.5 MB 6.7 MB/s eta 0:00:01 |████████████▉ | 2.6 MB 6.7 MB/s eta 0:00:01 |████████████▉ | 2.6 MB 6.7 MB/s eta 0:00:01 |█████████████ | 2.6 MB 6.7 MB/s eta 0:00:01 |█████████████ | 2.6 MB 6.7 MB/s eta 0:00:01 |█████████████ | 2.6 MB 6.7 MB/s eta 0:00:01 |█████████████ | 2.6 MB 6.7 MB/s eta 0:00:01 |█████████████▏ | 2.6 MB 6.7 MB/s eta 0:00:01 |█████████████▏ | 2.6 MB 6.7 MB/s eta 0:00:01 |█████████████▎ | 2.6 MB 6.7 MB/s eta 0:00:01 |█████████████▎ | 2.7 MB 6.7 MB/s eta 0:00:01 |█████████████▍ | 2.7 MB 6.7 MB/s eta 0:00:01 |█████████████▍ | 2.7 MB 6.7 MB/s eta 0:00:01 |█████████████▍ | 2.7 MB 6.7 MB/s eta 0:00:01 |█████████████▌ | 2.7 MB 6.7 MB/s eta 0:00:01 |█████████████▌ | 2.7 MB 6.7 MB/s eta 0:00:01 |█████████████▋ | 2.7 MB 6.7 MB/s eta 0:00:01 |█████████████▋ | 2.7 MB 6.7 MB/s eta 0:00:01 |█████████████▊ | 2.7 MB 6.7 MB/s eta 0:00:01 |█████████████▊ | 2.7 MB 6.7 MB/s eta 0:00:01 |█████████████▉ | 2.8 MB 6.7 MB/s eta 0:00:01 |█████████████▉ | 2.8 MB 6.7 MB/s eta 0:00:01 |██████████████ | 2.8 MB 6.7 MB/s eta 0:00:01 |██████████████ | 2.8 MB 6.7 MB/s eta 0:00:01 |██████████████ | 2.8 MB 6.7 MB/s eta 0:00:01 |██████████████ | 2.8 MB 6.7 MB/s eta 0:00:01 |██████████████ | 2.8 MB 6.7 MB/s eta 0:00:01 |██████████████▏ | 2.8 MB 6.7 MB/s eta 0:00:01 |██████████████▏ | 2.8 MB 6.7 MB/s eta 0:00:01 |██████████████▎ | 2.8 MB 6.7 MB/s eta 0:00:01 |██████████████▎ | 2.9 MB 6.7 MB/s eta 0:00:01 |██████████████▍ | 2.9 MB 6.7 MB/s eta 0:00:01 |██████████████▍ | 2.9 MB 6.7 MB/s eta 0:00:01 |██████████████▌ | 2.9 MB 6.7 MB/s eta 0:00:01 |██████████████▌ | 2.9 MB 6.7 MB/s eta 0:00:01 |██████████████▋ | 2.9 MB 6.7 MB/s eta 0:00:01 |██████████████▋ | 2.9 MB 6.7 MB/s eta 0:00:01 |██████████████▊ | 2.9 MB 6.7 MB/s eta 0:00:01 |██████████████▊ | 2.9 MB 6.7 MB/s eta 0:00:01 |██████████████▊ | 2.9 MB 6.7 MB/s eta 0:00:01 |██████████████▉ | 3.0 MB 6.7 MB/s et too many strings

コード全容はこちら

※いってもズブの素人が書いたラクガキみたいなコードですので、みづらかったり間抜けなことをしている可能性が多々ありますが、みなさんあたたかい目で見守ってくださいね。
python
#ブラウザ操作
import requests
#データ抽出
from bs4 import BeautifulSoup

#待機処理
import time

#データ解析
import pandas as pd

#正規表現
import re



#検索結果から、個別アイテムのURLを保管するリスト
url_list = []

#個別アイテムの情報を入れるdf 4項目を取得する
items_df = pd.DataFrame(data=[], columns = ["URL","品名","価格","説明"])


#検索キーワードを設定
KWD = "ゴジラ+美品"
#○クマの検索一覧URLを作成する
url = "https://fril.jp/s?query=" + KWD
print(url)

#session開始して検索結果htmlをsoupにぶち込む
session  = requests.session()
response = session.get(url) #検索一覧ページのhtmlを取得
time.sleep(4)
soup = BeautifulSoup(response.text, 'lxml')

#soupから個別商品URLを集める → url_list へ
items = soup.select('a[class="link_search_image"]')

for item in items:
    try:
        # 個別ページのリンクか判断する
        if re.match("https://item.fril.jp/", item["href"]) != None:
            try:
                item["title"]
                url_list.append(item["href"])
            except:
                pass
    except:
        pass

#なぜだか同じ要素が2回重複するので、整理する
url_list = sorted(set(url_list), key=url_list.index)

#items_dfの行数
i = 0
# url_list から各個別URLの中身をサーチ、整理して items_df に入れる
for item in url_list:
  	#なんせ数が多いので、とりあえず2個だけやってみる
    if i>=2:
        break

    print(i+1,"個目です")
    print(item)
    #各URLでsession開始
    session  = requests.session()
    response = session.get(item)
    time.sleep(2)
    soup_02 = BeautifulSoup(response.text, 'lxml')

    #品名
    try:
        name = soup_02.select('h1[class="item__name"]')
        print(name[0].text)
        name = name[0].text
    except:
        name = "取得できてないっす"
        pass

    #価格
    try:
        price = soup_02.select('p[class="sell-price-fixed"]')
        for prc in price:
            prc = prc.getText()
            prc = prc.replace('\n', '')
            prc = prc.replace('¥', '')
            try:
              prc = prc.replace('送料込', '')
            except:
              pass
            try:
              prc = prc.replace('着払い', '')
            except:
              pass
            try:
              prc = prc.replace(',', '')
            except:
              pass
            print(prc)

    except:
        prc = "取得できてないっす"
        pass
      
	#説明文
    try:
      setsu = soup_02.select('div[class="item__description"]')[0].text
      a = soup_02.select('div[class="item__description"]')[0]
      setsu = setsu.replace('\n商品説明\n', '')
      print(setsu)
    except:
      setsu = "取得できてないっす"
      pass
    
    #items_dfにまとめる
    try:
        #[URL,品名,価格,説明文]
        items_df.loc[i] =[item,name,prc,setsu]
        i = i + 1
    except:
        print("できてないっす")
        pass


#dfの中身を省略なしで全て表示させる
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)

print(items_df)
print("\n上手にできました!")

https://fril.jp/s?query=ゴジラ+美品
1 個目です https://item.fril.jp/e7bcb9c0f41f64333391134ec08197cf
X-PLUS ギガンティック ゴジラ2019 少年リック限定版 極美品 開封済 192000 少年リック限定版 ギガンティックシリーズ ゴジラ2019になります。開封は一度しています。その後はガラス棚で触らずに飾り、エアダスターで定期的に清掃もしていました。目の塗装や特に背鰭の発光表現とその塗装については、量産品とは思えません。 新品、未使用ではありませんが、その分全体をくまなくチェックしております。リック限定版などは、未開封新品でも、一度オークションやフリマサイト等他の方の手に渡ったものは保証がありませんので、致命的な不具合があっても対応はできないそうです。 こちらは開封時、顔の角度、接着具合、目の瞳の向き、塗装の不具合等は問題なかったです。どの方も言われていますが、尻尾の嵌り具合については台座と本体の距離や支える点で詰まりますのでご自身で飾る際に調節できます。 発送は、元箱とそれを包む輸送箱にお入れします。欠品はございません。中の固定針金等も全て開封時のものを使用してお届けします。 2 個目です https://item.fril.jp/96f315340d2cfebf767d3121c901165c
【最終お値下げ】ニジゲンノモリ ゴジラ迎撃作戦 フィギュア 1600 【今週で出品取り下げます】 迎撃作戦オープン前にやっていたイベントで購入しました。 箱なし。 日焼けや塗装剥げなどない美品だと思いますが見落としありましたらすいません。 URL \ 0 https://item.fril.jp/e7bcb9c0f41f64333391134ec... 1 https://item.fril.jp/96f315340d2cfebf767d3121c... 品名 価格 \ 0 X-PLUS ギガンティック ゴジラ2019 少年リック限定版 極美品 開封済 192000 1 【最終お値下げ】ニジゲンノモリ ゴジラ迎撃作戦 フィギュア 1600 説明 0 少年リック限定版 ギガンティックシリーズ ゴジラ2019になります。開封は一度しています。そ... 1 【今週で出品取り下げます】\n迎撃作戦オープン前にやっていたイベントで購入しました。\n箱な... 上手にできました!

コード各所説明

使用する各ライブラリのインポート

スクレイピングで使う各機能をインポートしよう
インストールとインポートって何が違うの?
インストールは、スーパーなどから食材を買って冷蔵庫(自分のPC)に入れるイメージ
インポートは、冷蔵庫(自分のPC)から食材をひっぱり出して料理(プログラミング)の準備をする感じかな…
これであってます?
#ブラウザ操作
import requests

#データ抽出
from bs4 import BeautifulSoup

#待機処理
import time

#データ解析
import pandas as pd

#正規表現
import re

各情報を格納する場所をつくる

今回は個別商品の4つの情報を取得してみる
リストは1項目(URL)をずらーっと入れていく
dfは1項目(1商品)につき4つの情報を格納できるようにする
#検索結果から、個別アイテムのURLを保管するリスト
url_list = []

#個別アイテムの情報を入れるdf 4項目を取得する
items_df = pd.DataFrame(data=[], columns = ["URL","品名","価格","説明"])

検索設定

今回の検索キーワードは"ゴジラ+美品"
○クマの検索一覧URLを調べて、キーワードの前のアドレスとくっつける
※確認用としてprint()で表示するようにしてます
#検索キーワードを設定
KWD = "ゴジラ+美品"
#○クマの検索一覧URLを作成する
url = "https://fril.jp/s?query=" + KWD
print(url)

ここからスクレイピングスタート

requestsを使って、まずはsessionをスタートさせよう
.get()にurlを入れて、検索一覧ページのhtmlを取得
time.sleep()で少し一息入れて、※今回は4秒待ってます
BeautifulSoupで煮込んで、トロットロのおいしいスープができたよ!
#session開始して検索結果htmlをsoupにぶち込む
session  = requests.session()
response = session.get(url) #検索一覧ページのhtmlを取得
time.sleep(4)
soup = BeautifulSoup(response.text, 'lxml')

個別商品URLを集めよう

いま作ったスープの中には検索一覧ページの要素が全部まざってるので、
そこから欲しい情報だけをすくいあげよう!
soup.select()に欲しい要素の属性を入れておおまかに探してから、re.matchで情報を整理!
最後にurl_listに個別URLを格納していこう!
※属性の調べ方はググろう!たっくさん情報が出てくるよ!
WebスクレイピングのためのChromeのツールの使い方
Beautiful Soup のfind_all( ) と select( ) の使い方の違い
#soupから個別商品URLを集める → url_list へ
items = soup.select('a[class="link_search_image"]')

for item in items:
    try:
        # 個別ページのリンクか判断する
        if re.match("https://item.fril.jp/", item["href"]) != None:
            try:
                item["title"]
                url_list.append(item["href"])
            except:
                pass
    except:
        pass

#なぜだか同じ要素が2回重複するので、整理する
url_list = sorted(set(url_list), key=url_list.index)

個別商品ページをトロットロのスープにしよう

考え方はさっきと同じ!
url_listの中の個別URLたちをitemとして、for文でまわしてスープにしよう
python for文を初心者向けに解説!for文基礎はこれで完璧
最終的なゴールのitems_dfの行設定のため、for文の前に適当にiを作っておこう
#items_dfの行数
i = 0
# url_list から各個別URLの中身をサーチ、整理して items_df に入れる
for item in url_list:
  	#なんせ数が多いので、とりあえず2個だけやってみる
    if i>=2:
        break
まずは丁寧にスープ(soup_02)にして、、、
※個数とURLをわかりやすくするため、print()してます。
print(i+1,"個目です")
    print(item)
    #各URLでsession開始
    session  = requests.session()
    response = session.get(item)
    time.sleep(2)
    soup_02 = BeautifulSoup(response.text, 'lxml')
品名(name)
#品名
    try:
        name = soup_02.select('h1[class="item__name"]')
        print(name[0].text)
        name = name[0].text
    except:
        name = "取得できてないっす"
        pass
価格(kakaku)
#価格
    try:
        price = soup_02.select('p[class="sell-price-fixed"]')
        for prc in price:
            prc = prc.getText()
            prc = prc.replace('\n', '')
            prc = prc.replace('¥', '')
            try:
              prc = prc.replace('送料込', '')
            except:
              pass
            try:
              prc = prc.replace('着払い', '')
            except:
              pass
            try:
              prc = prc.replace(',', '')
            except:
              pass
            print(prc)

    except:
        prc = "取得できてないっす"
        pass
説明文(setsu)
#説明文
    try:
      setsu = soup_02.select('div[class="item__description"]')[0].text
      a = soup_02.select('div[class="item__description"]')[0]
      setsu = setsu.replace('\n商品説明\n', '')
      print(setsu)
    except:
      setsu = "取得できてないっす"
      pass
最後はDataFlame(items_df)にまとめて中身を確認しよう
#items_dfにまとめる
    try:
        #[URL,品名,価格,説明文]
        items_df.loc[i] =[item,name,prc,setsu]
        i = i + 1
    except:
        print("できてないっす")
        pass

#dfの中身を省略なしで全て表示させる
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)

print(items_df)
print("\n上手にできました!")

ここまでできたなら!

items_dfをcsvに書き出してみたりすると、おもしろいかもしれない
やったね!色々使えそうなデータが作れたよ!

おわりに

ご覧いただきありがとうございました。
こんな感じで、色々試してみたことを稚拙な文章でつらつらと書いていこうとおもいます。
気づいた点やアドバイスなどございましたら、コメントいただけると嬉しいです。

Discussion

コメントにはログインが必要です。