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

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

ただいまの
回答率

90.47%

  • Python 3.x

    10250questions

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

webスクレイピングを複数回行いたい。

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,072

hanpanai-tumi

score 16

前提・実現したいこと

webページのスクレイピングを複数回行いたいです。

具体的には、コマンドプロンプト上でpython ~.py プロレス 1と実行すれば
グーグルでプロレスと検索したときに表示される1ページ目の10件すべてをスクレイピングし、テキストとして保存する。
上記の事を実現したいです。

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

何かしらの形式がおかしいため、発生しているのかなと思っています。

1
Traceback (most recent call last):
  File "bs.py", line 69, in <module>
    soup = bs4.BeautifulSoup(urllib.request.urlopen(html).read(),"html.parser")
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 518, in open
    protocol = req.type
AttributeError: 'HTTPResponse' object has no attribute 'type'
Traceback (most recent call last):
  File "bs.py", line 69, in <module>
    soup = bs4.BeautifulSoup(urllib.request.urlopen(html).read(),"html.parser")
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 518, in open
    protocol = req.type
AttributeError: 'HTTPResponse' object has no attribute 'type'
Traceback (most recent call last):
  File "bs.py", line 69, in <module>
    soup = bs4.BeautifulSoup(urllib.request.urlopen(html).read(),"html.parser")
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 518, in open
    protocol = req.type
AttributeError: 'HTTPResponse' object has no attribute 'type'
Traceback (most recent call last):
  File "bs.py", line 69, in <module>
    soup = bs4.BeautifulSoup(urllib.request.urlopen(html).read(),"html.parser")
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 518, in open
    protocol = req.type
AttributeError: 'HTTPResponse' object has no attribute 'type'
Traceback (most recent call last):
  File "bs.py", line 69, in <module>
    soup = bs4.BeautifulSoup(urllib.request.urlopen(html).read(),"html.parser")
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 518, in open
    protocol = req.type
AttributeError: 'HTTPResponse' object has no attribute 'type'
Traceback (most recent call last):
  File "bs.py", line 69, in <module>
    soup = bs4.BeautifulSoup(urllib.request.urlopen(html).read(),"html.parser")
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 518, in open
    protocol = req.type
AttributeError: 'HTTPResponse' object has no attribute 'type'
Traceback (most recent call last):
  File "bs.py", line 69, in <module>
    soup = bs4.BeautifulSoup(urllib.request.urlopen(html).read(),"html.parser")
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 518, in open
    protocol = req.type
AttributeError: 'HTTPResponse' object has no attribute 'type'
Traceback (most recent call last):
  File "bs.py", line 69, in <module>
    soup = bs4.BeautifulSoup(urllib.request.urlopen(html).read(),"html.parser")
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 518, in open
    protocol = req.type
AttributeError: 'HTTPResponse' object has no attribute 'type'
Traceback (most recent call last):
  File "bs.py", line 69, in <module>
    soup = bs4.BeautifulSoup(urllib.request.urlopen(html).read(),"html.parser")
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 518, in open
    protocol = req.type
AttributeError: 'HTTPResponse' object has no attribute 'type'
Traceback (most recent call last):
  File "bs.py", line 69, in <module>
    soup = bs4.BeautifulSoup(urllib.request.urlopen(html).read(),"html.parser")
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\RYO\AppData\Local\Programs\Python\Python36\lib\urllib\request.p
y", line 518, in open
    protocol = req.type
AttributeError: 'HTTPResponse' object has no attribute 'type'

該当のソースコード

# -*- coding: utf-8 -*-
#BeautifulSoupとutllibをインポート
#from bs4 import BeautifulSoup
import urllib.request
import urllib.parse
import bs4
from bs4 import NavigableString,Declaration,Comment,BeautifulSoup
#コマンドライン引数指定 (1つのみ)
import sys

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

links = [] #ページにあるリンク10個を格納する
maintexts = [] #txtファイルに書き込む文章

def getNavigableStrings(soup):
  if isinstance(soup, NavigableString):
    if type(soup) not in (Comment, Declaration) and soup.strip():
      yield soup
  elif soup.name not in ('script', 'style'):
    for c in soup.contents:
      for g in getNavigableStrings(c):
        yield g
#html抽出関数
def htmlExtraction(url):
# HTML を取得
    opener = urllib.request.build_opener()
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    html = opener.open(url)
    soup = BeautifulSoup(html,"html.parser")

    for url in soup.find_all("h3",{"class":"r"}):
        links.extend([url.a.get("href")])

query = "" #query encode
queryary = [] #query word
querytxt = "" #txtファイル名
pagenum = int(sys.argv[len(sys.argv) - 1]) #ページ番号
page = "" #何ページ目を参照するか

for i in range(1,len(sys.argv) - 1):
    queryary.extend([urllib.parse.quote(sys.argv[i])]) #sys.argv[1]~sys.argv[max]
    querytxt = querytxt + sys.argv[i] + " "
    if i == 1:
        query = queryary[i-1]
    else:
        query = query + "+" + queryary[i-1]

querytxt = querytxt + sys.argv[len(sys.argv) - 1]

url1 = "https://www.google.co.jp/search?q="

if int(sys.argv[len(sys.argv) - 1]) >= 2: #最後の引数はページ数 1ページ目参照の場合不要
    page = "&start=" + str((pagenum - 1) * 10) #最後の引数が2なら11件目から20件目を参照
url = url1 + query + page

htmlExtraction(url)

linkcnt = 0
#本文抽出
for link in links:
    linkcnt += 1
    try:
        opener = urllib.request.build_opener()
        opener.addheaders = [('User-agent', 'Mozilla/5.0')]
        html = opener.open("https://www.google.co.jp" + link)
        #soup = BeautifulSoup(html, "html.parser")
        soup = bs4.BeautifulSoup(urllib.request.urlopen(html).read(),"html.parser")
        text = '\n'.join(getNavigableStrings(soup))

        maintexts.extend([text]) #配列に入れてく

    except urllib.error.URLError:
        print(str(linkcnt) + "page URLerror")
    except:
        import traceback
        traceback.print_exc()




#ファイルに書き込み w:上書き a:追記
import codecs
file_object= codecs.open(querytxt + ".txt", "wb", "cp932", "ignore")
file_object.write(str(maintexts) + "\n")
file_object.close()

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • _Victorique__

    2017/07/21 17:47

    htmlが何かを明記してください。

    キャンセル

  • _Victorique__

    2017/07/21 17:50

    失礼、書いてありましたね

    キャンセル

回答 1

checkベストアンサー

+1

二回urlopenしてますね。

soup = bs4.BeautifulSoup(html.read(),"html.parser")

これで十分です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/23 23:26

    ご回答ありがとうございます。無事解決出来ました!

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    10250questions

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