質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

880閲覧

Pythonにてスクレイピングでのエラー

tenMar

総合スコア0

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/05/01 23:15

前提・実現したいこと

こちらのサイトで紹介されているPythonのスクレイピングを試しているのですが、
ファイル実行時に下記エラーが発生してしまい、どう対処すればエラーがでなくなるのかがわからず
困っております。

発生している問題・エラーメッセージ

エラーメッセージ $ python script.py Traceback (most recent call last): File "script_max.py", line 135, in <module> keyword = argvs[1] IndexError: list index out of range

該当のソースコード

Python

1 2###モジュールのインポート### 3import sys 4import re 5import urllib.request 6import requests 7import openpyxl as px 8from bs4 import BeautifulSoup 9from urllib.parse import urlparse 10from openpyxl.styles import Font, Color, colors 11###モジュールのインポート### 12 13 14def scraping(Sheet1, keyword, url, j): 15 16 #HTML取得(beutifulsoupを使用) 17 r = requests.get(url) 18 soup = BeautifulSoup(r.content, "html.parser") 19 20 #header部分だけを抽出 21 header = soup.find("head") 22 #タイトル 23 title = header.find("title").text 24 #ディスクリプション 25 description = header.find("meta", attrs={"name": "description"}) 26 #キーワード 27 keywords = header.find("meta", attrs={"name": "keywords"}) 28 #canonical 29 can = header.find("link", rel="canonical") 30 #viewport(レスポンシブ) 31 viewport = header.find("meta", attrs={"name": "viewport"}) 32 33 34 #タグ内容出力 35 Sheet1.cell(row = 2, column = j).value = url 36 if title: 37 Sheet1.cell(row = 3, column = j).value = title 38 39 if can: 40 Sheet1.cell(row = 6, column = j).value = can['href'] 41 else: 42 Sheet1.cell(row = 6, column = j).value = "設定なし" 43 Sheet1.cell(row = 6, column = j).font = Font(color=colors.RED) 44 45 if description: 46 Sheet1.cell(row = 4, column = j).value = description['content'] 47 else: 48 Sheet1.cell(row = 4, column = j).value = "設定なし" 49 Sheet1.cell(row = 4, column = j).font = Font(color=colors.RED) 50 51 if keywords: 52 Sheet1.cell(row = 5, column = j).value = keywords['content'] 53 else: 54 Sheet1.cell(row = 5, column = j).value = "設定なし" 55 Sheet1.cell(row = 5, column = j).font = Font(color=colors.RED) 56 57 58 if viewport: 59 Sheet1.cell(row = 8, column = j).value = str(viewport) 60 else: 61 Sheet1.cell(row = 8, column = j).value = "設定なし" 62 Sheet1.cell(row = 8, column = j).font = Font(color=colors.RED) 63 64 65 #body部分だけを抽出 66 body = soup.find("body") 67 com_h1tag = "" 68 69 #h1タグを全て取得します 70 h1tags = body.findAll("h1") 71 #タグ内容出力(タグをまるごと) 72 for h1tag in h1tags: 73 if h1tag is not None: 74 com_h1tag += str(h1tag) + "\n" 75 76 Sheet1.cell(row = 7, column = j).value = com_h1tag 77 78 #robots.txtの内容を取得します(トップページ下にある場合のみ) 79 #ドメインを取得 80 parsed_url = urlparse(url) 81 scheme = parsed_url.scheme 82 domain = parsed_url.netloc 83 #urlリクエスト 84 re_url = scheme + "://" + domain + "/robots.txt" 85 r2 = requests.get(re_url) 86 #リクエストページのHTMLをスクレイピング 87 soup2 = BeautifulSoup(r2.content, 'html.parser') 88 #リクエストが成功&HTMLが取得できた場合 89 if soup2: 90 if r2.status_code == 200: 91 Sheet1.cell(row = 9, column = j).value = soup2.text 92 #リクエストが失敗した場合 93 else: 94 Sheet1.cell(row = 9, column = j).value = "robots.txtがトップページ下に存在しません。" 95 Sheet1.cell(row = 9, column = j).font = Font(color=colors.RED) 96 97 #キーワード出現数 98 #結果格納用の変数 99 output1 = "" 100 output2 = "" 101 output3 = "" 102 #htmlソースからscriptとstyleタグを除く 103 for script in soup("script"): 104 script.decompose() 105 for style in soup("style"): 106 style.decompose() 107 strhtml = soup.text 108 #文字列からタブと半角空白と全角空白と改行を削除 109 strhtml = strhtml.replace(" ", "") 110 strhtml = strhtml.replace("\n", "") 111 strhtml = strhtml.replace("\r", "") 112 #キーワードが複数の場合(SEO 東京など)キーワード一つづつ配列へ 113 kensakukeys = re.split(" +", keyword) 114 #キーワードの数だけループ 115 for kensakukey in kensakukeys: 116 #ページ全体のキーワード出現数 117 cnt = strhtml.count(kensakukey) 118 #タイトルキーワード出現数 119 titleKeyCnt = title.count(kensakukey) 120 #h1キーワード出現数 121 h1KeyCnt = com_h1tag.count(kensakukey) 122 #全て変数に入れる 123 output1 += kensakukey + " : " + str(cnt) + "\n" 124 output2 += kensakukey + " : " + str(titleKeyCnt) + "\n" 125 output3 += kensakukey + " : " + str(h1KeyCnt) + "\n" 126 127 #excelへ出力 128 Sheet1.cell(row = 10, column = j).value = output1 129 Sheet1.cell(row = 11, column = j).value = output2 130 Sheet1.cell(row = 12, column = j).value = output3 131 132 133if __name__ == '__main__': 134 135 argvs = sys.argv 136 keyword = argvs[1] 137 138 #urlList.txtファイル読み込み 139 lists = [] 140 conf = '' 141 for line in open('urlList.txt', 'r'): 142 line = line.rstrip() 143 lists = lists + [line] 144 145 #excelテンプレート 146 book = px.load_workbook('項目.xlsx') 147 148 #excel結果ファイル名 149 bookname = '結果.xlsx' 150 151 #excelシート 152 Sheet1 = book['Sheet1'] 153 154 j = 2 155 #urlList.txt内のURL数だけループする 156 for url in lists: 157 #関数呼び出し 158 scraping(Sheet1, keyword, url, j) 159 #インクリメント 160 j+=1 161 162 #excel保存 163 book.save(bookname) 164 165

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

glyzinieh

2020/05/01 23:52 編集

実行するときにコマンドライン引数をつけていないのでは? それと、サイトのリンクにつながりません。
Yasumichi

2020/05/05 04:16

https://pecopla.net/seo-column/seo-scrape が正解みたいですね。Python が余分についてて、リンクがおかしくなっています。 [サイト](https://pecopla.net/seo-column/seo-scrape) となってますか。できれば、サイトの部分は、[SEO内部調査について簡単なスクレイピング処理を作成してみる | SEO対策なら株式会社ペコプラ]とタイトルを書いておく方が良いと思います。
guest

回答1

0

スクレイピング以前の部分でエラーになっているのが、理解できてますでしょうか?

Python

1 argvs = sys.argv 2 keyword = argvs[1]

の部分の意味を理解しましょう。
sys --- システムパラメータと関数

投稿2020/05/02 00:05

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tenMar

2020/05/05 03:55

@otn様 コメントありがとうございました! もし可能ならレクチャーしていただくことは可能でしょうか
Yasumichi

2020/05/05 04:04

まず、簡単なプログラムを書いて sys.argv の中身を見てみましょう。例えば、argv.py などという名前で以下のコードを書きます。 ``` import sys print(sys.argv) ``` その上で python argv.py としたら、どう表示されますか。引数を増やして、実行したらどうなりますか。
otn

2020/05/05 04:11

これで分からないとすると、 あなたが何を知っていて何を知らないのかが分からないと、あなたに理解できる説明は出来せん。 例えば、配列(リスト)の概念は分かりますか? というか、そもそも、プログラムをコピペしただけで、このプログラムをどうやって使うかの説明を読んでないと言うことですよね。 そこをちゃんと読むというのはどうでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問