作者:刘早起来源:早起Python爬虫是Python的一个重要应用。使用Python爬虫,我们可以很方便的从网上抓取我们想要的数据。本文将以爬取B站视频热搜榜数据存储为例,详细介绍Python爬虫的基本流程。如果您还处于爬虫阶段或不了解爬虫的具体工作流程,请仔细阅读本文!第一步:先尝试request进入b站首页,点击排行榜,复制链接https://www.bilibili.com/rank...现在启动Jupyternotebook,运行如下代码importrequestsurl='https://www.bilibili.com/rank...'res=requests.get('url')print(res.status_code)200在上面的代码中,我们做了以下三件事importrequests使用get方法构造请求使用status_code获取网页的状态码可以看到返回值为200,表示服务器正常响应,这意味着我们可以继续。第二步:解析页面在上一步中,我们通过requests向网站请求数据后,成功获取到一个包含服务器资源的Response对象。现在我们可以使用.text查看它的内容,可以看到返回了一个字符串,里面包含了我们需要的热榜视频数据,但是直接从字符串中提取内容比较复杂,效率低,所以我们需要对其进行解析,将字符串转化为网页结构化数据,这样我们就可以方便的找到HTML标签及其属性和内容。Python中解析网页的方法有很多种。您可以使用正则表达式、BeautifulSoup、pyquery或lxml。本文将基于BeautifulSoup进行讲解。BeautifulSoup是一个第三方库,可以从HTML或XML文件中提取数据。安装也很简单,直接使用pipinstallbs4安装即可,下面我们用一个简单的例子来说明一下frombs4importBeautifulSouppage=requests.get(url)soup=BeautifulSoup(page.content,'html.parser')title=soup.title.textprint(title)热门视频排行榜-哔哩哔哩(?-?)つロ干杯~-bilibili上面的代码中,我们使用了bs4中的BeautifulSoup类来获取上一步的html格式字符串被转换为BeautifulSoup对象。注意,使用时需要制定解析器。这里使用了html.parser。然后可以获取其中一个结构元素及其属性,比如使用soup.title.text获取页面的标题,也可以使用soup.body、soup.p等获取任何需要的元素。第三步:提取内容在上面两步中,我们使用requests向网页请求数据,并使用bs4解析页面。现在我们来到最关键的一步:如何从解析后的页面中提取出需要的内容。在BeautifulSoup中,我们可以使用find/find_all来定位元素,但我更习惯使用CSS选择器.select,因为你可以像使用CSS选择元素一样沿着DOM树往下走。下面我们用代码来说明如何从解析后的页面中提取B站热榜的数据。首先,我们需要找到存储数据的标签。在列表页按F12,按照下图的提示查找各个视频的信息。包裹在class="rank-item"的li标签下,那么代码可以这样写?all_products=[]products=soup.select('li.rank-item')forproductinproducts:rank=product选择('div.num')[0].textname=product.select('div.info>a')[0].text.strip()play=product.select('span.data-box')[0].textcomment=product.select('span.data-box')[1].textup=product.select('span.data-box')[2].texturl=product.select('div.info>a')[0].attrs['href']all_products.append({"视频排名":rank,"视频名称":名称,"播放量":播放,"弹幕量":评论,"up主":up,"videolink":url})在上面的代码中,我们首先使用soup.select('li.rank-item'),然后返回一个包含每个视频信息的列表,然后遍历每个视频信息,仍然使用CSS选择器提取出我们想要的字段信息,以字典的形式存储在开头定义的空列表中。可以注意到,我使用了多种选择方式来提取元素,这也是select方式的灵活性。有兴趣的读者可以自行进一步研究。第四步:存储数据通过前面三步,我们已经成功的使用requests+bs4从网站中提取出需要的数据,最后只需要将数据写入Excel并保存即可。如果对pandas不熟悉,可以使用csv模块来写。需要注意的是设置了encoding='utf-8-sig',否则会出现中文乱码问题。importcsvkeys=all_products[0].keys()withopen('B站视频热榜TOP100.csv','w',newline='',encoding='utf-8-sig')asoutput_file:dict_writer=csv.DictWriter(output_file,keys)dict_writer.writeheader()dict_writer.writerows(all_products)如果你熟悉pandas,你可以很容易的将一个字典转换成一个DataFrame,一行代码就可以完成importpandasaspdkeys=all_products[0.keys()pd.DataFrame(all_products,columns=keys).to_csv('TOP100.csv',encoding='utf-8-sig')总结至此我们已经成功使用Python转换站内热门视频列表B数据存储在本地,大部分基于请求的爬虫基本都是按照上面四个步骤进行的。然而,虽然看起来简单,但在真实场景中每一步都不是那么容易。从对数据的要求来看,目标网站有多种形式的反爬和加密,后期对数据的分析、提取甚至存储都有很多需要进一步探索的地方。学习。本文选择B站视频热榜正是因为够简单。希望通过这个案例,让大家了解爬虫的基本流程,最后附上完整代码。importrequestsfrombs4importBeautifulSoupimportcsvimportpandasaspdurl='https://www.bilibili.com/rank...'page=requests.get(url)soup=BeautifulSoup(page.content,'html.parser')all_products=复制代码[]products=soup.select('li.rank-item')forproductinproducts:rank=product.select('div.num')[0].textname=product.select('div.info>a')[0].text.strip()play=product.select('span.data-box')[0].textcomment=product.select('span.data-box')[1].textup=产品。select('span.data-box')[2].texturl=product.select('div.info>a')[0].attrs['href']all_products.append({"Videoranking":rank,"视频名称":名称,"播放音量":播放,"弹幕音量":评论,"up主":up,"视频链接":url})keys=all_products[0].keys()withopen('B站视频热榜TOP100.csv','w',newline='',encoding='utf-8-sig')asoutput_file:dict_writer=csv.DictWriter(output_file,keys)dict_writer.writeheader()dict_writer.writerows(all_products)使用pandas写入数据pd.DataFrame(all_products,columns=keys).to_csv('B站视频热榜TOP100.csv',encoding='utf-8-sig')
