千家信息网

Python怎样爬取腾讯视频

发表于:2025-02-16 作者:千家信息网编辑
千家信息网最后更新 2025年02月16日,这篇文章主要介绍Python怎样爬取腾讯视频,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!项目地址:https://github.com/yangrq1018/vqq-doub
千家信息网最后更新 2025年02月16日Python怎样爬取腾讯视频

这篇文章主要介绍Python怎样爬取腾讯视频,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

项目地址:

https://github.com/yangrq1018/vqq-douban-film

依赖

需要如下Python包:

  • requests

  • bs4 - Beautiful soup

  • pandas

就这些,不需要复杂的自动化爬虫架构,简单而且常用的包就够了。

爬取影片信息

首先观察电影频道,发现是异步加载的。可以用Firefox(Chrome也行)的inspect中的network这个tab来筛选查看可能的api接口。很快发现接口的URL是这个格式的:

base_url = 'https://v.qq.com/x/bu/pagesheet/list?_all=1&append=1&channel=movie&listpage=2&offset={offset}&pagesize={page_size}&sort={sort}'

其中 offset是请求页开始的位置, pagesize是每页请求的数量, sort是类型。在这里 sort=21指我们需要的"豆瓣好评"类型。pagesize不能大于30,大于30也只会返回三十个元素,低于30会返回指定数量的元素。

# 让Pandas完整到处过长的URL,后面会需要pd.set_option('display.max_colwidth', -1)base_url = 'https://v.qq.com/x/bu/pagesheet/list?_all=1&append=1&channel=movie&listpage=2&offset={offset}&pagesize={page_size}&sort={sort}'# 豆瓣最佳类型DOUBAN_BEST_SORT = 21NUM_PAGE_DOUBAN = 167

写一个小小的循环就可以发现,豆瓣好评这个类型总共有167页,每页三十个元素。

我们使用 requests这个库来请求网页, get_soup会请求第 page_idx页的元素,用 Beautifulsoup来解析 response.content,生成一个类似 DOM,可以很方便地查找我们需要的element的对象。我们返回一个 list。每个电影条目是包含在一个叫list_item的 div里的,所以写一个函数来帮助我们提取所有的这样的 div。

def get_soup(page_idx, page_size=30, sort=DOUBAN_BEST_SORT):    url = base_url.format(offset=page_idx * page_size,     page_size=page_size, sort=sort)    res = requests.get(url)    soup = bs4.BeautifulSoup(res.content.decode('utf-8'), 'lxml')    return soupdef find_list_items(soup):    return soup.find_all('div', class_='list_item')

我们遍历每一页,返回一个含有所有的被 bs4过的条目元素的HTML的 list。

def douban_films():    rel = []    for p in range(NUM_PAGE_DOUBAN):        print('Getting page {}'.format(p))        soup = get_soup(p)        rel += find_list_items(soup)    return rel

这是其中的一部电影的HTML代码:

霸王别姬VIP
9.6
霸王别姬
主演:张国荣 张丰毅 巩俐 葛优
4671万

不难发现,霸王别姬这部电影,名称、播放地址、封面、评分、主演,是否需要会员和播放量都在这个 div中。在ipython这样的interactive环境中,可以方便地找出怎么用bs来提取他们的方法。我使用的一个技巧是,可以打开一个 spyder.py文件,在里面编写需要的函数,将ipython的自动重载模组的选项打开,然后就可以在console里debug之后将代码复制到文件里,然后ipython中的函数也会相应的更新。这样的好处是会比在ipython中改动代码方便许多。具体如何打开ipython的自动重载:

%load_ext autoreload%autoreload 2 # Reload all modules every time before executing Python code%autoreload 0 # Disable automatic reloading

这个 parse_films函数用bs中的两个常用方法提取信息:

  • find

  • find_all

因为豆瓣的API已经关闭了检索功能,爬虫又会被反爬虫检测到,本来想检索到豆瓣的评分添加上去这个功能就放弃了。

OrderedDict可以接受一个由(key, value)组成的list,然后key的顺序会被记住。这个在之后我们导出为pandas DataFrame的时候很有用。

def parse_films(films):    '''films is a list of `bs4.element.Tag` objects'''    rel = []    for i, film in enumerate(films):        title = film.find('a', class_="figure_title")['title']        print('Parsing film %d: ' % i, title)        link = film.find('a', class_="figure")['href']        img_link = film.find('img', class_="figure_pic")['src']        # test if need VIP        need_vip = bool(film.find('img', class_="mark_v"))        score = getattr(film.find('div', class_='figure_score'), 'text', None)        if score: score = float(score)        cast = film.find('div', class_="figure_desc")        if cast:            cast = cast.get('title', None)        play_amt = film.find('div', class_="figure_count").get_text()        # db_score, db_link = search_douban(title)        # Store key orders        dict_item = OrderedDict([            ('title', title),            ('vqq_score', score),            # ('db_score', db_score),            ('need_vip', need_vip),            ('cast', cast),            ('play_amt', play_amt),            ('vqq_play_link', link),            # ('db_discuss_link', db_link),            ('img_link', img_link),        ])        rel.append(dict_item)    return rel

导出

最后,我们调用写好的函数,在主程序中运行。

被解析好,list of dictionaries格式的对象,可以直接传给DataFrame的constructor。按照评分排序,最高分在前面,然后将播放链接转换成HTML的链接标签,更加美观而且可以直接打开。

注意,pandas生成的csv文件一直和excel有兼容性问题,在有中文字符的时候会乱码。解决方法是选择utf_8_sig这个encoding,就可以让excel正常解码了。

Pickle是一个Python十分强大的serialization库,可以保存Python的对象为文件,再从文件中加载Python的对象。我们将我们的DataFrame保存为 .pkl。调用 DataFrame的 to_html方法保存一个HTML文件,注意要将 escape 设置为False不然超链接不能被直接打开。

if __name__ == '__main__':    df = DataFrame(parse_films(douban_films()))    # Sorted by score    df.sort_values(by="vqq_score", inplace=True, ascending=False)    # Format links    df['vqq_play_link'] = df['vqq_play_link'].apply(lambda x: 'Film link'.format(x))    df['img_link'] = df['img_link'].apply(lambda x: ''.format(x))    # Chinese characters in Excel must be encoded with _sig    df.to_csv('vqq_douban_films.csv', index=False, encoding='utf_8_sig')    # Pickle    df.to_pickle('vqq_douban_films.pkl')    # HTML, render hyperlink    df.to_html('vqq_douban_films.html', escape=False)

项目管理

代码部分就是这样。那么写完了代码,就要把它归档保存,以便于分析。选择放在Github上。

那么,其实Github是提供了一个命令行工具的(不是 git,是 git的一个扩展),叫做 hub。macOS用户可以这样安装

brew install hub

hub有许多比 git更简练的语法,我们这里主要用

hub create -d "Create repo for our proj" vqq-douban-film

来直接从命令行创建repo,是不是很酷!根本不用打开浏览器。然后可能会被提示在Github上登记一个你的SSH公钥(验证权限),如果没有的话用 ssh-keygen生成一个就好了,在Github的设置里把 .pub的内容复制进去。

项目目录里,可能会有 __pycache__和 .DS_Store这样你不想track的文件。手写一个 .gitignore又太麻烦,有没有工具呢,肯定有的!Python有一个包

pip install git-ignoregit-ignore python #    产生一个python的template# 手动把.DS_Store加进去

注:仅供学习、交流使用,

以上是"Python怎样爬取腾讯视频"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

文件 代码 元素 函数 豆瓣 对象 方法 电影 类型 内容 爬虫 链接 项目 生成 评分 视频 腾讯 霸王别姬 信息 功能 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 黄浦区网络技术服务哪个好 数据库安全4a 医疗收费 数据库 湖北省网络安全办公室怎么样 数据库表创建与修改管理 长城超云服务器默认密码是多少 甘肃居家智慧养老软件开发 上海盛也网络技术有限公司干嘛的 红管2服务器标是什么意思 华为服务器外包装不干胶模板 珠海斯坦德软件开发 区块链系统与软件开发 vb.net 压缩数据库 文明上网网络安全手抄报小学生 网络安全综述最新版本图书 网络安全是啥 软件开发所涉及的文档 淮南软件开发定制公司 读秀数据库一框式检索 操作数据库事务 方舟海贼王服务器到底怎么搜索 如何往数据库中写入数据库 手机软件开发欢迎青岗科技 检察院开展网络安全党支部活动 技术兼职软件开发 贵州省网络安全管理民警 山东互联网展览科技馆设计 软件开发工时测算 网络安全法需要建立 聚焦网络安全守护你我平安视频
0