python如何爬取sci论⽂中所需的数据_『爬⾍四步⾛』⼿把⼿
教你使⽤Python抓取并。。。
第⼀步:尝试请求
⾸先进⼊b站⾸页,点击排⾏榜并复制链接
现在启动Jupyter notebook,并运⾏以下代码
import requests
url = 'www.bilibili/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
res = ('url')
print(res.status_code)
#200
在上⾯的代码中,我们完成了下⾯三件事
导⼊
requests
使⽤
get⽅法构造请求
使⽤
status_code获取⽹页状态码
可以看到返回值是200,表⽰服务器正常响应,这意味着我们可以继续进⾏。
第⼆步:解析页⾯
在上⼀步我们通过requests向⽹站请求数据后,成功得到⼀个包含服务器资源的Response对象,现在我们可以使⽤.text来查看其内容
可以看到返回⼀个字符串,⾥⾯有我们需要的热榜视频数据,但是直接从字符串中提取内容是⽐较复杂且低效的,因此我们需要对其进⾏解析,将字符串转换为⽹页结构化数据,这样可以很⽅便地查HTML标签以及其中的属性和内容。
在Python中解析⽹页的⽅法有很多,可以使⽤正则表达式,也可以使⽤BeautifulSoup、pyquery或lxml,本⽂将基于BeautifulSoup进⾏讲解.
Beautiful Soup是⼀个可以从HTML或XML⽂件中提取数据的第三⽅库.安装也很简单,使⽤pip install bs4安装即可,下⾯让我们⽤⼀个简单的例⼦说明它是怎样⼯作的
from bs4 import BeautifulSoup
page = (url)
soup = t, 'html.parser')
title =
print(title)
# 热门视频排⾏榜 - 哔哩哔哩 (゜-゜)つロ ⼲杯~-bilibili
在上⾯的代码中,我们通过bs4中的BeautifulSoup类将上⼀步得到的html格式字符串转换为⼀个BeautifulSoup对象,注意在使⽤时需要制定⼀个解析器,这⾥使⽤的是html.parser。
接着就可以获取其中的某个结构化元素及其属性,⽐如使⽤获取页⾯标题,同样可以使⽤soup.body、soup.p等获取任意需要的元素。
第三步:提取内容
在上⾯两步中,我们分别使⽤requests向⽹页请求数据并使⽤bs4解析页⾯,现在来到最关键的步骤:如何从解析完的页⾯中提取需要的内容。
在Beautiful Soup中,我们可以使⽤find/find_all来定位元素,但我更习惯使⽤CSS选择器.select,因为可以像使⽤CSS选择元素⼀样向下访问DOM树。
现在我们⽤代码讲解如何从解析完的页⾯中提取B站热榜的数据,⾸先我们需要到存储数据的标签,在榜单页⾯按下F12并按照下图指⽰到
可以看到每⼀个视频信息都被包在class="rank-item"的li标签下,那么代码就可以这样写
all_products = []
products = soup.select('li.rank-item')
for product in products:
rank = product.select('div.num')[0].text
name = product.select('div.info > a')[0].text.strip()
play = product.select('span.data-box')[0].text
comment = product.select('span.data-box')[1].text
up = product.select('span.data-box')[2].text
url = product.select('div.info > a')[0].attrs['href']
all_products.append({
"视频排名":rank,
"视频名": name,
"播放量": play,
"弹幕量": comment,
"up主": up,
"视频链接": url
})
在上⾯的代码中,我们先使⽤soup.select('li.rank-item'),此时返回⼀个list包含每⼀个视频信息,接着遍历每⼀个视频信息,依旧使⽤CSS选择器来提取我们要的字段信息,并以字典的形式存储在开头定义好的空列表中。
可以注意到我⽤了多种选择⽅法提取去元素,这也是select⽅法的灵活之处,感兴趣的读者可以进⼀步⾃⾏研究。
第四步:存储数据
通过前⾯三步,我们成功的使⽤requests+bs4从⽹站中提取出需要的数据,最后只需要将数据写⼊Excel中保存即可。
如果你对pandas不熟悉的话,可以使⽤csv模块写⼊,需要注意的是设置好编码encoding='utf-8-sig',否则会出现中⽂乱码的问题
import csv
keys = all_products[0].keys()
with open('B站视频热榜TOP100.csv', 'w', newline='', encoding='utf-8-sig') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(all_products)
如果你熟悉pandas的话,更是可以轻松将字典转换为DataFrame,⼀⾏代码即可完成
import pandas as pd
keys = all_products[0].keys()
pd.DataFrame(all_products,columns=keys).to_csv('B站视频热榜TOP100.csv', encoding='utf-8-sig')
⼩结
⾄此我们就成功使⽤Python将b站热门视频榜单数据存储⾄本地,⼤多数基于requests的爬⾍基本都按照上⾯四步进⾏。
不过虽然看上去简单,但是在真实场景中每⼀步都没有那么轻松,从请求数据开始⽬标⽹站就有多种形式的反爬、加密,到后⾯解析、提取甚⾄存储数据都有很多需要进⼀步探索、学习。
本⽂选择B站视频热榜也正是因为它⾜够简单,希望通过这个案例让⼤家明⽩爬⾍的基本流程,最后附上完整代码
import requests
from bs4 import BeautifulSoup
import csv
import pandas as pd
url = 'www.bilibili/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
page = (url)
soup = t, 'html.parser')
all_products = []
products = soup.select('li.rank-item')
for product in products:
rank = product.select('div.num')[0].text
name = product.select('div.info > a')[0].text.strip()
play = product.select('span.data-box')[0].text
comment = product.select('span.data-box')[1].text
up = product.select('span.data-box')[2].text
url = product.select('div.info > a')[0].attrs['href']
all_products.append({
"视频排名":rank,
"视频名": name,
"播放量": play,
"弹幕量": comment,
python怎么读csv数据"up主": up,
"视频链接": url
})
keys = all_products[0].keys()
with open('B站视频热榜TOP100.csv', 'w', newline='', encoding='utf-8-sig') as output_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')
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论