Crawler是Python的一个重要应用。使用Python爬虫,我们可以很方便的从网上抓取我们想要的数据。本文将以B站视频热搜榜单数据的爬取和存储为例,进行详细介绍。Python爬虫的基本流程。如果您还处于爬虫阶段或不了解爬虫的具体工作流程,请仔细阅读本文!第一步:先尝试请求进入b站首页,点击排行榜复制链接https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3现在启动Jupyternotebook,并运行以下代码importrequestsurl='https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'res=requests.get('url')print(res.status_code)#200在上面的代码中,我们有完成了以下三件事。导入请求。使用get方法构造请求。使用status_code获取网页的状态码。可以看到返回值为200,代表服务器正常响应,也就是说,那么我们就可以进行了。第二步:解析页面在上一步中,我们通过requests向网站请求数据后,成功获取到一个包含服务器资源的Response对象。现在我们可以使用.text查看它的内容,可以看到返回了一个字符串,里面包含了我们需要的热榜视频数据,但是直接从字符串中提取内容比较复杂,效率低,所以我们需要对其进行解析,将字符串转化为网页结构化数据,这样我们就可以方便的找到HTML标签及其属性和内容。Python中解析网页的方法有很多种。您可以使用正则表达式、BeautifulSoup、pyquery或lxml。本文将基于BeautifulSoup进行讲解。BeautifulSoup是一个第三方库,可以从HTML或XML文件中提取数据。安装也很简单,直接使用pipinstallbs4安装即可,下面我们用一个简单的例子来说明下bs4importBeautifulSouppage=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标签下,代码可以这样写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({"VideoRank":rank,"VideoName":name,"PlaybackVolume":play,"弹幕音量":comment,"upmaster":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,一行代码即可完成importpandasasspdkeys=all_products[0].keys()pd.DataFrame(all_products,columns=keys).to_csv('B站视频热榜TOP100.csv',encoding='utf-8-sig')总结至此我们已经成功使用Python将b站视频热榜数据存储到本地。大多数基于请求的爬虫基本上都是按照以上四个步骤进行的。然而,虽然看起来简单,但在真实场景中每一步都不是那么容易。从对数据的要求来看,目标网站有多种形式的反爬和加密,后期对数据的分析、提取甚至存储都有很多需要进一步探索的地方。学习。本文选择B站视频热榜,因为够简单。希望通过这个案例,让大家了解爬虫的基本流程。最后完整代码importrequestsfrombs4importBeautifulSoupimportcsvimportpandasaspdurl='https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'page=requests.get(url)soup=BeautifulSoup(page.content.')htmlall_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=product.select('span.data-box')[2].texturl=product.select('div.info>a')[0].attrs['href']all_products.append({"VideoRank":rank,"VideoName":name,"PlaybackVolume":play,"弹幕音量":comment,"upmain":up,"videolink":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')
