爬虫步骤
- 发起请求;
- 获取响应内容;
- 解析内容;
- 保存数据。
具体实现
在写爬虫之前,我们先来看一下要爬取的网页。
上图是B站热门视频排行榜,需要的数据已经在图中标出,即视频名称和播放量。
接下来是具体的实现。
首先导入包。
import requests
from pyquery import PyQuery as pq
import pandas as pd
然后定义url和headers(包含了浏览器,编码等信息,网站会通过这部分信息来判断我们的身份),用request.get()方法向服务器发出请求,得到response对象。response.text打印出来就是网页的html。
url = 'https://www.bilibili.com/ranking?'
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'
}
response = requests.get(url, headers=headers)
print(response.text)
接下来我们用pyquery库来解析HTML,对 DOM 节点的一些属性内容进行快速提取。
打开谷歌浏览器开发者模式,来看一下网页的HTML。
可以看到每部电影对应的区块都是一个 li节点,它的 class 属性都是 rank-item 。标题的class属性是title。播放量由一个span元素表示,它的子元素li的class属性有两个,分别是b-icon和play。
弄清楚了这些,我们就可以开始解析html了。
df = pd.DataFrame()
doc = pq(response.text)
results = doc('.rank-item').items()
for result in results:
dict1 = {}
dict1['name'] = result('.title').text()
dict1['num'] = result('.play').parent().text()
df = df.append(dict1, ignore_index=True)
df
首先通过css选择器和items()方法获取所有表示单部电影的li节点,然后通过遍历来获取元素的文本属性。标题可以直接利用title属性选取,而为了得到播放量数据,我们需要先找到子元素,再通过parent方法得到父元素。
df用来保存爬下来的数据,结果如下:
好啦,第一个爬虫小案例,完成!