python 21 数据接口和selenuim基础

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])    #将浏览器对象的转换到第一次浏览器对象的选项卡
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值