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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

2回答

1956閲覧

エラーが出たり出なったり

hikari.13

総合スコア7

スクレイピング

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/08/19 02:51

Pythonを勉強している初学者になります。
特定のURLからスクレイピングをしようとしているのですが、時折エラーが出たり出なかったりするのはなぜでしょうか?
ご教授いただけると幸いです。

!pip install selenium !pip install requests from selenium import webdriver from time import sleep import pandas as pd import requests import re from fake_useragent import UserAgent from bs4 import BeautifulSoup as bs import csv import bs4 import time browesr = webdriver.Chrome() url="https://www.mercari.com/jp/search/?sort_order=&keyword=%E3%83%91%E3%83%A9%E3%83%96%E3%83%BC%E3%83%84&category_root=2&category_child=33&category_grand_child%5B349%5D=1&brand_name=&brand_id=&size_group=2&size_id%5B135%5D=1&size_id%5B136%5D=1&price_min=&price_max=&item_condition_id%5B1%5D=1&item_condition_id%5B2%5D=1&item_condition_id%5B3%5D=1&status_on_sale=1" browesr.get(url) !pip install fake_useragent ua=UserAgent() useragent=ua.random def get_html(url): headers={"User-Agent":useragent} res=requests.get(url,headers=headers) return res soup=bs(res.content,"html.parser") items=soup.findAll(class_="items-box") output=[] for item in items: output.append({ "title":item.find(class_="items-box-name font-2").text, "url":"https://www.mercari.com"+item.find("a").get("href"), "picture":item.find("img").get("data-src"), "price":item.find(class_="items-box-price font-5").text }) items_df=pd.DataFrame(output) def detail(detail_sp): return{"title":detail_sp.find(class_="item-name").text, "url":("https://www.mercari.com/jp/items/"+detail_sp.find(class_="item-action-text").get("data-key")).replace("id=",""), "place":detail_sp.find(class_="item-price bold").text, "pictures":"|".join([img.find("img").get("data-src")for img in detail_sp.findAll(class_="owl-item-inner")]), "Description":detail_sp.find(class_="item-description-inner").text, "spec_table":spec_table(detail_sp) } def spec_table(detail_sp): spec_list = [] ths = detail_sp.find(class_="item-detail-table").findAll("th") tds = detail_sp.find(class_="item-detail-table").findAll("td") for th, td in zip(ths, tds): _td = re.sub(r"\n+", "\n", td.text.strip()) if td.find("a"): _url = td.find("a").get("href") if re.search(r"u/\d+", _url): _td = _td + "\n" + _url spec_list.append("|".join([th.text, _td])) return "\t".join(spec_list) results = [] for idx, detail_url in enumerate(items_df.url.head(30)): detail_res = get_html(detail_url) detail_sp = bs(detail_res.content, "html.parser") results.append(detail_sp) print(f"now {idx} of numbers" ) print(detail_res) print(detail_url) time.sleep(5) **#エラー部分になります** --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-11-c9a8da77d460> in <module> ----> 1 soup=bs(res.content,"html.parser") 2 items=soup.findAll(class_="items-box") NameError: name 'res' is not defined

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/08/19 03:17 編集

「エラーが出たり出なったりする」というのは、Jupyter Notebookで毎回「先頭から」実行させても「出たり出なかったり」するんでしょうか 質問に書いてあるコードのブロックの途中から実行していたり、実行を開始する場所を時々変えたりしてませんか? そして実行を開始する場所によってエラーが出たり出なかったりという状況になっているんではないですか?
hikari.13

2021/08/19 03:22

回答ありがとうございます。 毎回先頭から実行はしていなかったです。 コードのブロックの途中から実行していたり、実行を開始する場所を時々変えたりしておりました。 現状は先頭、どの場所からでも実行してもエラーになります。
guest

回答2

0

ベストアンサー

「現状は先頭、どの場所からでも実行してもエラーになります。」ということですが
応急措置的には

diff

1def get_html(url): 2 headers={"User-Agent":useragent} 3 res=requests.get(url,headers=headers) 4 return res 5 6res=get_html(url) 7soup=bs(res.content,"html.parser") 8items=soup.findAll(class_="items-box")

のように

soup=bs(res.content,"html.parser")
の直前に

res=get_html(url)

という文を入れて先頭から実行していけばエラーは無くなるんじゃないですかね。

・「時折エラーが出たり出なかったりするのはなぜでしょうか?」
→「出たり出なかったりする」という状況が理解に苦しいんですが、エラー原因はメッセージにあるように、resを定義していないのにresを使おうとしたから。
「出たり出なかったりする」というのは本当はコードをいじってたり実行する場所を変えたりしていただけじゃないかとおもいます。

投稿2021/08/19 03:28

編集2021/08/19 03:34
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hikari.13

2021/08/19 05:38

ありがとうございました。解決いたしました!
guest

0

NameError: name 'res' is not defined

resが存在しないと言ってますよ

投稿2021/08/19 02:56

y_waiwai

総合スコア87774

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

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

hikari.13

2021/08/19 03:07

回答ありがとうございます。 NameErorの意味は理解しているのですが、なぜエラーがでたり出なったりするのでしょうか?
y_waiwai

2021/08/19 03:08

で、そのresはどこで定義してるんでしょうか まずそれをはっきりさせましょう
hikari.13

2021/08/19 03:18

失礼致しました。 def get_html(url):のところでresを定義していただけで、soup=bs(res.content,"html.parser") items=soup.findAll(class_="items-box")のところでresを定義してなかったからでしょうか?
y_waiwai

2021/08/19 03:28

def get_html(url): で定義してるものはローカル変数なのでその関数内でしか有効ではないです なので、その関数外では、resは存在しない、とエラーになります。 ってことで、ここでエラーにならない、という状況が異常だ、ってことになるのは理解できますか。 なぜエラーにならないかってことですが、質問の修正欄でも述べられてますが、このコードの実行方法が間違ってるのでは、ということが考えられますね
hikari.13

2021/08/19 05:39

ありがとうございます。修正し復旧致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問