爬取蜻蜓FM有声小说链接
1 为什么说是链接而不是音频呢?
原因是我只是一个刚开始学习的小白,因为这个是动态加载的数据,我还不会提取这个Network中的链接,写这个只是为了记录学习过程,
由于是第一次,不足之处还望理解包涵,并希望能得到各位前辈的指导。
2 首先导包
因为是动态加载的,所以用selenium
import time
from selenium import webdriver
3 准备工作
url = 'https://www.qingting.fm/channels/225733/'
driver = webdriver.Chrome()
driver.get(url)
4 向目标发送请求后,这里就需要获取其动态数据了
由于目标当前共263章,而加载一次是30章,这儿需要做二个动作,一是下拉滚动条,二是点击加载更多
for i in range(10):
driver.execute_script('window.scrollTo(0,document.body.scrollHgight)')
button = driver.find_element_by_class_name('addMoresButtion')
button.click()
5 上述动作之后,数据就可以加载完成,之后开始解析
这里采用xpath,感觉这个方便,注意是复数elements
data = driver.find_elements_by_xpath('//li/span[1]/a')
6 得到全部数据后遍历取得相应数据
链接和章节名称
for msg in data:
link = msg.get_attribute('href')
name = msg.get_attuibute('text')
7 保存数据
这里需要注意的是换行符的作用
with open('qingting.csv','a',encoding='utf-8') as f:
f.write(name+link+'\n')
f.close()
8 到这儿基本达到了所需,有二个问题需要注意
一是退出浏览器,防止占用资源,二是数据加载完后button消失造成的报错
完整代码给出答案
import time
from selenium import webdriver
class Qingting(object):
#初始化基本数据
def __init__(self):
self.url='https://www.qingting.fm/channels/225733/'
self.driver = webdriver.Chrome()
def get_url(self):
# 请求目标网址
self.driver.get(self.url)
# 隐士等待加载网页
self.driver.implicitly_wait(3)
# 加载目标网址动态数据
def jz_url(self):
# 因为数据加载完成后button会消失而报错
try:
# 向下拉滚动条9次,(当前页面数据为263,加载一次为30)
for i in range(10):
# 滚动条下拉到底部
self.driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
# 选择'加载更多按钮'后点击
button = self.driver.find_element_by_class_name('addMoresButtion')
button.click()
#点击后暂停时间
time.sleep(0.5)
# 上边的try是处理动态加载,这里的except是处理加载完成后
except:
# 解析数据
data = self.driver.find_elements_by_xpath('//li/span[1]/a')
# 从列表中遍历取出相应数据
for msg in data:
link =msg.get_attribute('href')
name = msg.get_attribute('text')
print(name, link)
#保存得到后的数据
with open('qingting_lxf.csv', 'a', encoding='utf-8') as f:
#换行符在这里很重要
f.write(name + link + '\n')
# 写完后关闭
f.close()
# 上述动作完成后退出浏览器
self.driver.quit()
if __name__ == '__main__':
a = Qingting()
a.get_url()
a.jz_url()