天天看点

AttributeError: ‘NoneType‘ object has no attribute ‘find_all‘

极客时间Python核心技术与实战

案例:豆瓣今日推荐电影爬虫

老师提供的原代码如下(执行时间,我是在pycharm中执行的,所以我稍加修改了一下,记得需要

pip install bs4

):

import requests
from bs4 import BeautifulSoup
import time


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']))


if __name__ == '__main__':
    start = time.time()
    main()
    print('cost: {:.2f}s.'.format(time.time() - start))
           

执行该代码时报错为:

AttributeError: ‘NoneType’ object has no attribute ‘find_all’
AttributeError: ‘NoneType‘ object has no attribute ‘find_all‘

分析:看到“NoneType”可猜想大概率是豆瓣网站的服务器嵌入反爬虫机制导致我们爬取它的网页数据失败。

解决:需要模拟浏览器发送正常请求,正常的一个requests请求包含url和header,现在url有,header去它的网站获取,然后添加到请求信息中。

说明:该豆瓣网站被爬太多次,我们被该网页服务器的反爬虫程序发现了,并禁止我们爬取。因此我们需要模拟浏览器,重新给服务器发送请求,并且添加头等信息headers,headers是解决requests请求反爬的方法之一,相当于我们进去这个网页的服务器本身,假装自己本身在爬取数据。

方法:

  • 浏览器按下F12,输入https://movie.douban.com/cinema/later/beijing/回车,进入豆瓣官网,调试页面选择“network”,点击第一个“beijing”,右边选择“header”,往下拉找到“User-Agent”,复制
    AttributeError: ‘NoneType‘ object has no attribute ‘find_all‘
  • 最好在本地编辑一下,复制到Sublime里,给冒号前后的信息分别加上引号
    AttributeError: ‘NoneType‘ object has no attribute ‘find_all‘
  • 然后将该信息写入代码中
# 编写header信息
header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36"
    }
    
# 将header添加到requests请求中,代码中有两处使用
init_page = requests.get(url, headers=header).content
response_item = requests.get(url_to_fetch, headers=header).content
           

其他代码不变,这样就添加完成了。

最后执行结果为:

西游记之再世妖王 08月07日 https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2673991933.jpg
深爱 08月13日 https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2663099539.jpg
五个扑水的少年 08月13日 https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2673700631.jpg
皮皮虾总裁 08月13日 https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2544788692.jpg
皮皮鲁与鲁西西之罐头小人 08月13日 https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2668941343.jpg
忠犬流浪记 08月20日 https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2567862389.jpg
测谎人 08月20日 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2674123936.jpg
独家头条:初露锋芒 08月20日 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2675277070.jpg
兔子暴力 08月27日 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2674957566.jpg
垛上花 08月27日 https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2673839013.jpg
探探猫人鱼公主 08月28日 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2634896515.jpg
野马分鬃 09月03日 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2673678150.jpg
1950他们正年轻 09月03日 https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2673807422.jpg
妈妈的神奇小子 09月04日 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2674121504.jpg
爱的富硒泉 09月17日 https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2663611662.jpg
我的青春有个你 09月19日 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2652126215.jpg
山海经之小人国 09月19日 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2669123766.jpg
关于我妈的一切 09月19日 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2675130420.jpg
日常幻想指南 09月19日 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2669962500.jpg
狗果定理 09月19日 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2641086760.jpg
摇滚藏獒:蓝色光芒 09月19日 https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2654487598.jpg
cost: 33.64s.
           

解决方案来自https://blog.csdn.net/weixin_44052055/article/details/108632006。感谢!