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]) #将浏览器对象的转换到第一次浏览器对象的选项卡