PythonでクロールするときにAttributeError: 'NoneType' オブジェクトに 'find_all' 属性がないのを解決する
最近、学習型クローラの例を練習しているときに、AttributeError: 'NoneType' object has no attribute 'find_all' error に遭遇しました。
クローラの要件は以下の通りです。
タスクの説明 https://movie.douban.com/cinema/later/beijing/ このページでは、北京で最近公開された映画について説明します。これらの映画の名前、公開日、ポスターをPythonで取得することができますか?このページのポスターは縮小版で、特定の映画の説明ページからポスターを取得して欲しいのです。
先生から渡されたコードを以下のように実行した後。
import requests
from bs4 import BeautifulSoup
def main():
url = "https://movie.douban.com/cinema/later/beijing/"
init_page = requests.get(url).content
init_soup = BeautifulSoup(init_page, 'lxml')
all_movies = init_soup.find('div', id="showing-soon")
for each_movie in all_movies.find_all('div', class_="item"):
all_a_tag = each_movie.find_all('a')
all_li_tag = each_movie.find_all('li')
movie_name = all_a_tag[1].text
url_to_fetch = all_a_tag[1]['href']
movie_date = all_li_tag[0].text
response_item = requests.get(url_to_fetch).content
soup_item = BeautifulSoup(response_item, 'lxml')
img_tag = soup_item.find('img')
print('{} {} {}'.format(movie_name, movie_date, img_tag['src']))
main()
エラーが発生しました。NoneTypeオブジェクトは属性'find_all'を持っていません。
クロールするデータとソースコードを見てください。
どれも間違っていないことを確認し、NoneTypeが表示される箇所を印刷しました。
その結果、次のようになります。
<class 'NoneType'>
情報を確認したところ、データを取得できていないことが問題であることがわかりました。その原因は このサイトはクロール回数が多すぎるため、Webサーバーのアンチクローラーに見つかり、クロールを禁止されました。だから我々は、ブラウザをシミュレートする必要があり、サーバーにリクエストを再送信し、ヘッダーを追加し、ヘッダーは、リクエスト要求アンチクローラを解決する方法の一つである、我々はページのサーバー自体に入るに相当し、データ自体をクロールするふりをする . 反クローラーページのために、ブラウザがサイトへのアクセスを取ることを模倣するためにあるヘッダーをセットアップすることができる。
ここでは、ヘッダーを設定する理由とその使用方法について、一般的にご紹介します。
なぜヘッダーを設定する必要があるのですか?
ウェブクローリングを依頼すると、出力されるテキストメッセージにsorry, inaccessibleなどの単語が表示されます。これは禁じられたクロールであり、アンチクロールのメカニズムで対処する必要があります。
ヘッダは、リクエストに対するアンチクロールの問題を解決する方法の一つで、サーバー自体に入り込んでページ自体をクロールするふりをすることに相当する。
クローラー対策ページでは、いくつかのヘッダー情報を設定することで、ブラウザがアクセスしたことを擬似的に再現することができます。
ヘッダーはどこにあるのですか?
GoogleやFirefoxは、Webページ:右クリック->チェック->図のように残り、Fn+F5キーを押してページを更新する必要があります。
一部のブラウザは、クリック:右クリック> 表示要素、更新
注:ヘッダーには多くのコンテンツがありますが、主に共通するのはuser-agentとhostで、これらはキーペアの形で表示されます。user-agentがヘッダーの辞書キーペアとして表示されていれば、アンチクロールに成功し、他のキーペアは必要ない。そうでなければ、ヘッダーの下にさらにキーペアを追加する必要がある。
ブラウザのヘッダーを探せばいいのですが、ここでは実行するヘッダーをあげておきます。
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/ 537.36"}
init_page = requests.get(url, headers=header).content
情報取得リクエストにヘッダーパラメーターを追加します。
プログラムの実行を続行します。TypeError: 'NoneType' object is not subscriptable.
別のNoneTypeの問題、同じ解決策。NoneTypeを表示して、とにかくヘッダー情報を追加します。
問題解決後、最終的なクロール結果は以下のようになります。
Train to Spring Sep 17 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2620365836.jpg
McLaughlin September 17 https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2619912723.jpg
Dead or Alive 09/18 https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2620256769.jpg
A Good Day in the Neighborhood Sep 18 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2620261010.jpg
Munchkin Wanderlust 09/18 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2620364842.jpg
Blue Line of Defense 09/18/09 https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2617621409.jpg
Red Bashan Sep 18 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2617808060.jpg
The Edge of the Century Sep 22 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2617650682.jpg
Kikujiro's Summer 09/25 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2620392435.jpg
Winning the Crown Sep 25 https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2620083313.jpg
Rush Pioneer Sep 30 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2619027144.jpg
Jiang Ziya Oct 01 https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2617446867.jpg
Me and my hometown 01 October https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2616128001.jpg
A little bit to home October 01 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2619723175.jpg
Wonderful Kingdom of Magic Wonderland Oct 01 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2614907771.jpg
Mulan: The Crossing October 03 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2616737564.jpg
Half Moon Alice October 30 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2619823575.jpg
Hotel Sunset December 12 https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2619899048.jpg
The Fantastic Adventures of the Little Mermaid Dec. 12 https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2614997193.jpg
The Hurt Locker 2 December 24 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2614798555.jpg
Process finished with exit code 0
参考文献
Pythonのコアテクノロジーとプラクティス
Python - クローラー [リクエストヘッダを設定するリクエスト]".
https://blog.csdn.net/ysblogs/article/details/88530124
AttributeError: 'NoneType' オブジェクトは 'find_all' 属性を持たない (リクエストヘッダ情報を追加する)
関連
-
PythonがNameError: name '_name_' is not definedのようなエラーを発生させる。
-
ModuleNotFoundError: django という名前のモジュールがない 問題1解決済み
-
ImportError: torchvision という名前のモジュールがありません。
-
Python pipを使ったpymysqlモジュールのインストール (Error: ImportError: No module named pymysql)
-
Python27 PILソリューションという名前のモジュールがない
-
ImportError を解決します。pandas をインストールした後に 'pandas' という名前のモジュールがない。
-
Pythonでナンバープレート自動認識システムを作ろう!楽しくて実用的です。
-
Python辞書
-
Python djangoプログラミングエラーのコツ、自作プログラミングで遭遇したエラーのまとめ 2018年11月8日更新
-
Python - pickleファイルの異なるPython環境への変換
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python は '' で '__main__' モジュールを見つけることができません。
-
ERROR: 要件ファイルを開くことができませんでした。[Errno 2] そのようなファイルまたはディレクトリがありません: 'requirements.txt'.
-
Pythonの実行時にSyntaxError: invalid syntaxが発生した場合の対処方法
-
ImportError: Windows の Django でプロジェクトを作成するとき、django.core solution という名前のモジュールがない。
-
AttributeError: モジュール 'tensorflow'に属性 'placeholder' がない問題
-
Numpyライブラリのダウンロードとインストールのまとめ
-
Pythonのタイトル。学生情報管理システム - アドバンス版 (GUI + MySQLデータベース)
-
ValueError: 連結軸を除くすべての入力配列の次元が正確に一致する必要があります。
-
パイソン] Python パイソンミニゲーム - 欲張りスネークアドベンチャー
-
tkinter モジュールを使った Python 倉庫番ゲーム