专栏首页学无止境Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取

Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取

很多网页的信息都是通过异步加载的,本文就举例讨论下此类网页的抓取。

《工作细胞》最近比较火,bilibili 上目前的短评已经有17000多条。

先看分析下页面

右边 li 标签中的就是短评信息,一共20条。一般我们加载大量数据的时候,都会做分页,但是这个页面没有,只有一个滚动条。

随着滚动条往下拉,信息自动加载了,如下图,变40条了。由此可见,短评是通过异步加载的。

我们不可能一次性将滚动条拉到最下面,然后来一次性获取全部的数据。既然知道是通过异步来加载的数据,那么我们可以想办法直接去获取这些异步的数据。

打开 Network 查看分析 http 请求,可以点击 XHR 过滤掉 img、css、js 等信息。这时我们发现了一些 fetch。fetch 我对它的了解就是一个比 ajax 更高级更好用的 API,当然这肯定是不准确的,但并并不影响我们的爬虫。

我们可以看到,其中返回的就是我们需要的内容,json 格式,一共20条,total 属性就是总的数目。分析一下 url 地址:https://bangumi.bilibili.com/review/web_api/short/list?media_id=102392&folded=0&page_size=20&sort=0&cursor=76729594906127

media_id 想必就是《工作细胞》的 id 了;

folded 不知道是啥,可以不管;

page_size 是每页的条数;

sort 排序,看名字就知道,找到排序的选项,试了下,果然是的,默认0,最新1;

cursor,字面意思的光标,猜测应该是指示本次获取开始的位置的,展开获取到的 json,发现其中包含有 cursor 属性,对比以后可以发现,url中的值跟上一次返回结果中的最后一条中的 cursor 的值是一致的。

好了,至此,页面已经分析清楚了,爬取的方式也明显了,根本不用管网页,直接根据 fetch 的地址获取 json 数据就可以了,连网页解析都省了,超级的方便。

下面的完整的代码:(如果 fake_useragent 报错,就手动写个 User-Agent 吧,那个库极度的不稳定)

import csv
import os
import time
import requests
from fake_useragent import UserAgent

curcount = 0


def main():
    url = 'https://bangumi.bilibili.com/review/web_api/short/list?media_id=102392&folded=0&page_size=20&sort=0'
    crawling(url)


def crawling(url):
    print(f'正在爬取:{url}')
    global curcount
    headers = {"User-Agent": UserAgent(verify_ssl=False).random}
    json_content = requests.get(url, headers).json()
    total = json_content['result']['total']
    infolist = []
    for item in json_content['result']['list']:
        info = {
            'author': item['author']['uname'],
            'content': item['content'],
            'ctime': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(item['ctime'])),
            'likes': item['likes'],
            'disliked': item['disliked'],
            'score': item['user_rating']['score']
        }
        infolist.append(info)
    savefile(infolist)

    curcount += len(infolist)
    print(f'当前进度{curcount}/{total}')
    if curcount >= total:
        print('爬取完毕。')
        return

    nexturl = f'https://bangumi.bilibili.com/review/web_api/short/list?' \
              f'media_id=102392&folded=0&page_size=20&sort=0&cursor={json_content["result"]["list"][-1]["cursor"]}'
    time.sleep(1)
    crawling(nexturl)


def savefile(infos):
    with open('WorkingCell.csv', 'a', encoding='utf-8') as sw:
        fieldnames = ['author', 'content', 'ctime', 'likes', 'disliked', 'score']
        writer = csv.DictWriter(sw, fieldnames=fieldnames)
        writer.writerows(infos)


if __name__ == '__main__':
    if os.path.exists('WorkingCell.csv'):
        os.remove('WorkingCell.csv')
    main()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python:黑板课爬虫闯关第五关

    第五关地址:http://www.heibanke.com/lesson/crawler_ex04/

    丹枫无迹
  • Python:轻量级 ORM 框架 peewee 用法详解

    SQLite 中,当批量插入的行数超过 999 时,就需要使用循环来将数据批量分组:

    丹枫无迹
  • Python爬虫实例:爬取豆瓣Top250

    入门第一个爬虫一般都是爬这个,实在是太简单。用了 requests 和 bs4 库。

    丹枫无迹
  • Python爬虫爬取Instagram博主照片视频

    看了下知乎问题 怎么下载保存 Instagram 上喜欢的图片到手机? 下的回答,基本都要复制图片链接到其它软件或者微信公众号之类的来获取源图片。

    林清猫耳
  • chrome extension develop

    打开extension调试模式,加载文件目录,在chrome extension按钮出现后,右键inspect popup,添加调试断点,F5进入断点

    sofu456
  • 【php增删改查实例】第二十一节 - 用户修改功能19.1 添加用户修改的按钮

    剽悍一小兔
  • crontab导致的频繁发送邮件的问题(r5笔记第20天)

    今天下午的时候客户发邮件反馈说,对于某个环境中的文件系统监控和表空间使用情况的邮件收到的比较频繁,感觉是1个小时发送一次,完全可以3个小时发送一次,接到这个问题...

    jeanron100
  • 背后那双手 - Evernote服务迁移到GCP的技术支持和方法论

    编辑手记:Evernote在70天的时间里完成了3PB数据迁移至云端,整个过程竟然实现用户零感知。那么迁移过程到底使用了什么样的技术,我们一起来学习。 回顾:...

    数据和云
  • 程序员架构学习笔记——Nginx 静态文件服务配置及优化

    欢迎关注专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。

    慕容千语
  • 分享"一只爬虫"

    谢伟

扫码关注云+社区

领取腾讯云代金券