需求
尽可能获取 B 站美食博主列表 按照粉丝数排序 最终目的是能找出粉丝数前列 up 主的 id 名
思路
- 将几个包含很多美食区视频的网页的 url 存起来
- 通过请求 url 拿到尽可能多的投稿视频的链接
- 通过视频链接拿到 up 主的主页链接 并分析出 up 主的 uid
- 通过 uid 请求信息接口 拿到 up 主的 id 以及粉丝数
用到的库及其作用
csv
: 读写 csv 文件json
: 读写 json 文件time
: 进行延时操作random
: 随机数功能实现codecs
: 打开文件 (解决中文写入文件后乱码问题)requests
: 请求库selenium
: 模拟浏览器UserAgent
: 随机 UA 库threading
: 多线程库BeautifulSoup
: 解析 HTML 与 XML 的库
遇到的问题以及解决方案
拿不到 html 结构
可能是因为没有设置 UA 服务器无法确认请求是否由用户发出
提前设置好请求头 UA(浏览器标识), 伪装成浏览器, 模拟用户正常请求, 防止 ip 被 ban 如果已经被 ban 那就算啦
这里可以自己设置 UA 为指定浏览器标识 也可以用库来随机生成
这里建议使用 fake_useragent
库来随机生成 UA 标识
安装 fake_useragent
:
1 | pip insatll fake_useragent |
使用:
1 | from fake_useragent import UserAgent |
拿到的 html 结构不完整
可能是因为网页动态加载的(拿到网页并用浏览器解析之后还需要 js 来动态更新网页内容), 导致拿到的网页的 html 结构残缺, 拿不到想要的数据
可以使用 Selenium
库来模拟浏览器爬虫 这样他会等到网页加载完全再拿出网页的 html
安装 Selenium
:
1 | pip install selenium |
下载你使用的对应版本的浏览器驱动:
- Firefox: geckodriver
- Chrome: chromedriver
- IE: IEDriverServer
- Edge: MicrosoftWebDriver
- Opera: operadriver
- PhantomJS: phantomjs
使用:
1 | # driver = webdriver.Firefox() # Firefox浏览器 |
无法永久保存且不会乱码的数据
我太菜了 不会使数据库 所以只能存本地了 为了数据后续处理的方便 这里使用了 csv
文件格式存数据
同时使用了 codecs
打开文件来防止乱码
csv
格式文件很简单 Excel 也能打开并处理
Python 里有 csv
库来读写 csv
格式文件
安装 csv
及 codecs
库:
1 | pip install csv codecs |
使用:
1 | filename = "data.csv" |
返回的数据是 json 格式
使用 json
库处理
安装 json
库:
1 | pip install json |
使用:
1 | import json |
爬取速度太慢
使用 threading
库实现多线程
安装 threading
:
1 | pip install threading |
使用:
1 | lst = [123, 456, 789] |
代码实现
1 | import csv |