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