做了一些小项目,用的技术和技巧会比较散比较杂,写一个小品文记录一下,帮助熟悉。
需求:经常在腾讯视频上看电影,在影片库里有一个"豆瓣好评"板块。我一般会在这个条目下面挑电影。但是电影很多,又缺乏索引,只能不停地往下来,让js加载更多的条目。然而前面的看完了,每次找新的片就要拉很久。所以用爬虫将"豆瓣好评"里的电影都爬下来整理到一个表中,方便选片。
项目地址:https://github.com/yangrq1018/vqq-douban-film
依赖
Python资源共享群:626017123
需要如下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 = 21 NUM_PAGE_DOUBAN = 167
写一个小小的循环就可以发现,豆瓣好评这个类型总共有167页,每页三十个元素。
我们使用 requests这个库来请求网页, get_soup会请求第 page_idx页的元素,用 Beautifulsoup来解析 response.content,生成一个类似 DOM,可以很方便地查找我们需要的element的对象。我们返回一个 list。每个电影条目是包含在一个叫list_i