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’

在这里插入图片描述

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

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

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

方法

  • 浏览器按下F12,输入https://movie.douban.com/cinema/later/beijing/回车,进入豆瓣官网,调试页面选择“network”,点击第一个“beijing”,右边选择“header”,往下拉找到“User-Agent”,复制
    在这里插入图片描述
  • 最好在本地编辑一下,复制到Sublime里,给冒号前后的信息分别加上引号
    在这里插入图片描述
  • 然后将该信息写入代码中
# 编写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

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

最后执行结果为:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员老五

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值