python 21 数据接口和selenuim基础
1. 数据接口
如果想要获取的数据,有数据接口,就可以使用数据接口来获取数据,数据接口在页面上查找
import requests
response = requests.get('https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js') #找到接口就可以拿到需要数据
result = response.json() #result是一个字典
for x in result['hero']:
print(x['name'])
- 练习:获取一个英雄的所有皮肤
import os
import requests
#练习找数据接口
response = requests.get('https://game.gtimg.cn/images/lol/act/img/js/hero/1.js') #找到接口就可以拿到需要数据
result = response.json() #result是一个字典
def get_pic(name:str,url:str):
response_pic = requests.get(url)
result_pic = response_pic.content
with open(f'files/{name}.jpg','wb') as f:
f.write(result_pic)
if __name__=='__main__':
for x in result['skins']:
name = x['name']
pict_addr = x['mainImg']
if not pict_addr:
pict_addr = x['chromaImg']
get_pic(name,pict_addr)
- 补充: 代码创建文件夹
- 语法:import os
os.mkdir(‘所有英雄的皮肤/abc’)
- 练习:
import requests
import os
# 1.获取所有英雄的id
def get_all_hero_id():
url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'
res = requests.get(url).json()
return [x['heroId'] for x in res['hero']]
def get_one_hero_skins(hero_id: str):
# 1. 请求指定英雄对应的数据
url = f'https://game.gtimg.cn/images/lol/act/img/js/hero/{hero_id}.js'
res = requests.get(url)
result = res.json()
# 2. 创建这个英雄对应的文件夹
hero_name = result['hero']['name']
if not os.path.exists(f'所有英雄的皮肤/{hero_name}'):
os.mkdir(f'所有英雄的皮肤/{hero_name}')
# 3. 下载这个英雄所有的皮肤
# 1)遍历拿到每个皮肤的名称和地址
for skin in result['skins']:
skin_name = skin['name'].replace('/', '') # 防止皮肤名称中出现'/'
skin_img = skin['mainImg']
if not skin_img:
skin_img = skin['chromaImg']
# 2) 下载一张图片
res = requests.get(skin_img)
with open(f'所有英雄的皮肤/{hero_name}/{skin_name}.jpg', 'wb') as f:
f.write(res.content)
print('下载完成!')
if __name__ == '__main__':
ids = get_all_hero_id()
for x in ids[:5]:
get_one_hero_skins(x)
2. selenium 基本用法
from selenium . webdriver import Chrome
- 第一步:创建浏览器对象
b = Chrome()
- 第二步:打开网页(打开想要获取数据的网页)
b . get(‘https://movie.douban.com/top250’) - 第三步: 获取网页源代码
b . page_source - 第四步:关闭浏览器
b.close()
3. selenium控制浏览器的基本行为
from selenium.webdriver import Chrome
from time import sleep
b=Chrome()
b.get('https://www.jd.com/')
1)输入框输入内容
- 第一步:找到输入框 — input_tag = b .find_element_by_id(‘key’)
- 第二步:输入输入框内容 — input_tag.send_keys(‘电脑\n’)
sleep(2)
2)点击按钮
- 第一步:找到需要点击的标签
btn = b.find_element_by_css_selector('#navitems-group2 .b') #选择想点击的标签css选择器,
- 第二步:点击选中标签
btn.click() #点击标签的指令
练习:
from time import sleep
from selenium.webdriver import Chrome
from bs4 import BeautifulSoup
from csv import writer
b=Chrome()
b.get('https://www.jd.com/') #相当于打开了这一个网页
input_tag=b.find_element_by_id('key') #寻找搜索框
input_tag.send_keys('手机\n') #输入搜素内容,点击回车
#
sleep(1) #只要切换界面了,就要休眠一下
all_data = [] #建一个空列表,添加所有数据
soup = BeautifulSoup(b.page_source,'lxml') #获取网页原代码
all_phone_div = soup.select('#J_goodsList>ul>li')#获取所有手机的标签,以列表的形式返回
print(len(list(all_phone_div)))
for x in all_phone_div: #对拿到的所有的手机标签进行遍历,获得需要的内容
name = x.select_one('.p-name').text.strip().replace('\n','') #找到class标签,拿到属性值,然后拿到标签内容
#print(name)
price = x.select_one('.p-price i').text.strip() #找到手机价格的标签,拿到标签内容
#print(price)
all_data.append([name,price]) #将拿到的手机姓名和价格以列表的形式加入建好的列表中
#第一页的数据获取完了后,点击下一页
next_button = b.find_element_by_css_selector('.pn-next>em') #根据检查,得出下一页在class的儿子em的标签内容
next_button.click() #点击下一页
sleep(2) #只要换页就休眠2秒
soup=BeautifulSoup(b.page_source,'lxml') #拿到整个网页的源代码
all_phone_div_two = soup.select('.gl-warp') #拿到第二个网页的所有手机标签,
for y in all_phone_div_two: #对列表进行遍历每一个手机标签
name=y.select_one('.p-name').text.strip().replace('\n','') #拿到手机姓名
price=y.select_one('.p-price i').text.strip() #拿到手机价格
all_data.append([name,price]) #添加到列表中
with open('files/手机价格一览表.csv','at',encoding='utf-8',newline='') as f:
writers=writer(f)
writers.writerow(['手机信息','价格'])
writers.writerows(all_data)
input('结束OK不:')
b.close()
4. 切换选项卡
from selenium.webdriver import Chrome
from time import sleep
from bs4 import BeautifulSoup
b=Chrome() #创建浏览器对象
b.get('https://www.cnki.net/') #浏览器对象打开中国知网
sleep(2) #休眠2秒
search_tag = b.find_element_by_class_name('search-input') #寻找搜索框的标签,看选id还是class
search_tag.send_keys('数据分析\n') #在搜索框中输入内容,进行搜索
sleep(1) #切换界面,做一个等待操作, #只要页面换了,就要休眠一下
#获取需要点击的所有标签,需要对标签做点击或者输入,必须要通过浏览器,即b来获取标签
all_result = b.find_elements_by_css_selector('.result-table-list .name>a') #拿到第一页的所有论文的标签,列表的形式返回
all_result[0].click() #点击第一个结果,会打开一个选项卡
sleep(1)
# 2. 切换选项卡
# 注意:selenium中,浏览器对象(b)默认指向一开始打开的选项卡,除非用代码切换,否则浏览器对象指向的选项卡不会变
# 1)获取当前浏览器上所有的窗口(选项卡): 浏览器.window_handles
# 2)切换选项卡
b.switch_to.window(b.window_handles[-1]) #浏览器对象b切换到打开的新的窗口
#解析内容
soup=BeautifulSoup(b.page_source,'lxml') #获取这一页网页的源代码
result=soup.select_one('#ChDivSummary').text#找到需要的内容的标签,取出需要的内容
print(result)
b.close() #关闭当前指向的窗口(最后一个窗口),窗口关闭后,浏览器对象的指向不会发生改变,仍指向的是关闭的这一个窗口
#回到第一个窗口,点击下一个进行搜索
b.switch_to.window(b.window_handles[0]) #浏览器对象的指向转换到第一个窗口
all_result[1].click() #点击第二个结果,会打开一个选项卡
sleep(2)
b.switch_to.window(b.window_handles[-1]) #将浏览器对象b切换到打开的新窗口
#解析第二页的内容
soup=BeautifulSoup(b.page_source,'lxml') #获取网页源代码
result2 = soup.select_one('#ChDivSummary').text# #根据标签找内容
print(result2)
b.close() #关闭当前打开的窗口(最后一个窗口),关闭后,对象仍指向刚才关闭的窗口,需要用代码切换浏览器对象的选项卡
b.switch_to.window(b.window_handles[0]) #将浏览器对象的转换到第一次浏览器对象的选项卡