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()

原文地址:https://www.cnblogs.com/gl1573/p/10061720.html

时间: 2024-10-08 01:14:07

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

python爬虫实例详细介绍之爬取大众点评的数据

python 爬虫实例详细介绍之爬取大众点评的数据 一. Python作为一种语法简洁.面向对象的解释性语言,其便捷性.容易上手性受到众多程序员的青睐,基于python的包也越来越多,使得python能够帮助我们实现越来越多的功能.本文主要介绍如何利用python进行网站数据的抓取工作.我看到过利用c++和Java进行爬虫的代码,c++的代码很复杂,而且可读性.可理解性较低,不易上手,一般是那些高手用来写着玩加深对c++的理解的,这条路目前对我们不通.Java的可读性还可以,就是代码冗余比较多,

python爬虫实例(urllib&BeautifulSoup)

python 2.7.6 urllib:发送报文并得到response BeautifulSoup:解析报文的body(html) #encoding=UTF-8 from bs4 import BeautifulSoup from urllib import urlopen import urllib list_no_results=[]#没查到的银行卡的list list_yes_results=[]#已查到的银行卡的list #解析报文,以字典存储 def parseData(htmls,

关于爬取异步加载的页面

在爬取网站时常遇到异步加载的情况,必须点击或者下拉滚动条才会加载出更多的图片或视频,在源码中却一片空白,我一开始遇到时候也有点懵,了解了就好,还是请求.学过一些前端知识的朋友都清楚其实就是ajax异步加载js,这是为了提高用户的体验,许多网站都使用这种方法. 究其根本,其实就是将这部分请求放在了后台,查看的话,按F12然后F5刷新页面,在Network标签下都会显示出来,比如下面这个网站. ? 随便点一个发现看下啥情况 ? 好吧,其实就是个get请求罢了,只是将正常的点击翻页查询变成了下拉查询,

今日头条图片ajax异步加载爬取,并保存至mongodb,以及代码写法的改进

import requests,time,re,json,pymongofrom urllib.parse import urlencodefrom requests.exceptions import RequestExceptionfrom bs4 import BeautifulSoup as bs #连接mongodbclient = pymongo.MongoClient(host='localhost',port=27017)#指定数据库名称db = client.toutiao #

【zTree】简单实例与异步加载实例

[zTree]简单实例与异步加载实例 我们在项目中经常会需要用到树,这次按照数据库存储的特点重新了做一个小demo,使用zTree来实现这个功能. 简单实例: 首先我们需要在界面中引入代码,很简单,但是很重要,它用来存放加载的树. ps:添加ztree的引用,下载地址:http://www.ztree.me/v3/main.php#_zTreeInfo [html] view plain copy <span style="font-family:KaiTi_GB2312;font-siz

python爬虫实例——爬取歌单

学习自http://www.hzbook.com/index.php/Book/search.html 书名:从零开始学python网络爬虫 爬取酷狗歌单,保存入csv文件 直接上源代码:(含注释) import requests #用于请求网页获取网页数据 from bs4 import BeautifulSoup #解析网页数据 import time #time库中的sleep()方法可以让程序暂停 import csv ''' 爬虫测试 酷狗top500数据 写入csv文件 ''' fp

Python 爬虫实例

下面是我写的一个简单爬虫实例 1.定义函数读取html网页的源代码 2.从源代码通过正则表达式挑选出自己需要获取的内容 3.序列中的htm依次写到d盘 #!/usr/bin/python import re import urllib.request #定义函数读取html网页的源代码 def getHtml(url): page = urllib.request.urlopen(url) html = page.read() return html #从源代码通过正则表达式挑选出自己需要获取的

Python爬虫实例 动态ip+抓包+验证码自动识别

最近出于某种不可描述的原因,需要爬一段数据,大概长这样: 是一个价格走势图,鼠标移到上面会显示某个时刻的价格,需要爬下来日期和价格. 第一步肯定先看源代码,找到了这样一段: 历史记录应该是从这个iframe发过来的,点进去看看,找到这样一段: 可以大概看出来是通过get一个json文件来获取数据,我们要的东西应该就在这个json里面.打开浏览器的开发者工具(F12),一个个看发过来的json,发现这样一个: 打开看看: ok,我们找到了想要的东西了,接下来分析下这个url,发现一些规律,可以直接

浏览器渲染的工作流程和图片加载与渲染规则

1 浏览器渲染的工作流程 浏览器的工作原理.以Webkit引擎的工作流程为例,浏览器加载一个HTML页面后进行如下操作 解析HTML[遇到<img>标签加载图片] -> 构建DOM树 加载样式 -> 解析样式[遇到背景图片链接不加载] -> 构建样式规则树 加载javascript -> 执行javascript代码 把DOM树和样式规则树匹配构建渲染树[加载渲染树上的背景图片] 计算元素位置进行布局 绘制[开始渲染图片] 2 图片加载与渲染规则  页面中不是所有的&l