一、前言
本文仅用于交流学习,不得用于商业行为
如果单纯的使用requests库,是不能获取到完整的源代码的;
如果想进行分析的话,刷新获取数据,则会出现这样的界面:因此,选择使用selenium是非常好的一个选择!
二、selenium获取数据
以歌单广场的一页为例,获取到歌单的封面这里使用两个方法:
- 使用selenium获取到网页源代码,然后使用pyquery库进行解析,从而获取数据
- 直接使用selenium获取数据,利用selenium的页面元素定位
1、第一种方法
from selenium import webdriver from selenium.webdriver.chrome.options import Options from pyquery import PyQuery as pq import time start = time.time() # 配置 option = Options() # 为Chrome配置无头模式 option.add_argument("--headless") # 启动浏览器时加入配置 driver = webdriver.Chrome(options=option) # 访问网页 driver.get('https://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=35') # 切换到iframe表单 driver.switch_to.frame('g_iframe') # 获取源代码 html = driver.execute_script('return document.documentElement.outerHTML') # 利用pyquery库进行解析 doc = pq(html) # 定位到所有含有封面图片链接的节点 links = doc('#m-pl-container li div img') # 打印封面图片链接数量 print(f"该页面含有{len(links)}张图片") # 进行遍历 for link in links.items(): # 获取封面图片链接 src = link.attr('src') # 打印链接 print(src) # 关闭所有页面 driver.quit() print("总共用时:{}".format(time.time()-start))
- 输出结果:
图片链接过多,仅展示部分结果
该页面含有35张图片 http://p2.music.126.net/DHRO3u68N0HbSF_Is08S6A==/109951166538173595.jpg?param=140y140 http://p2.music.126.net/FkcsntKQ2JgvJZktcJ0uPw==/109951166647447993.jpg?param=140y140 http://p2.music.126.net/9ROYGXi0iJyY97bgbdEDSg==/109951166741042192.jpg?param=140y140 总共用时:5.121241807937622
2、第二种方法
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By import time start = time.time() # 配置 option = Options() # 为Chrome配置无头模式 option.add_argument("--headless") # 启动浏览器时加入配置 driver = webdriver.Chrome(options=option) # 访问网页 driver.get('https://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=35') # 切换到iframe表单 driver.switch_to.frame('g_iframe') # 定位到所有含有封面图片链接的节点 links = driver.find_elements(By.CSS_SELECTOR, '#m-pl-container .j-flag') # 打印封面图片链接数量 print(f"该页面含有{len(links)}张图片") # 进行遍历 for element in links: # 打印封面图片链接 print(element.get_attribute('src')) # 关闭所有页面 driver.quit() print("总共用时:{}".format(time.time()-start))
- 输出结果:
图片链接过多,仅展示部分结果
该页面含有35张图片 http://p2.music.126.net/DHRO3u68N0HbSF_Is08S6A==/109951166538173595.jpg?param=140y140 http://p2.music.126.net/FkcsntKQ2JgvJZktcJ0uPw==/109951166647447993.jpg?param=140y140 http://p2.music.126.net/9ROYGXi0iJyY97bgbdEDSg==/109951166741042192.jpg?param=140y140 http://p2.music.126.net/fkZa3CIMPpwv45MwjaGtVQ==/109951166623085189.jpg?param=140y140 总共用时:5.274672031402588
3、总结
这两种方法进行比较,就速度而言,第一种方法略快。
且第一种方法更适合喜欢通过页面源代码进行获取数据的小伙伴。