1. ホーム
  2. パイソン

PythonでクロールするときにAttributeError: 'NoneType' オブジェクトに 'find_all' 属性がないのを解決する

2022-01-24 12:44:10
<パス

最近、学習型クローラの例を練習しているときに、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' 属性を持たない (リクエストヘッダ情報を追加する)