• 18数据接口和selenium


    一、数据接口

    在爬取数据之前可以先找对应网站的数据接口,如果有数据接口则请求数据接口对应的网址,没有则用requests。
    找数据接口的流程如下:

    浏览器控制台--network--Fetch/XHR--刷新页面--左下角 xxxx.js--右边preview(具体数据)/headers(地址)
    
    • 1

    请添加图片描述

    示例:获取英雄联盟英雄某个英雄的皮肤

    拿到数据接口的地址,对地址发送请求然后获取数据

    import requests
    response=requests.get('https://game.gtimg.cn/images/lol/act/img/js/hero/1.js')
    result=response.json()
    for i in result['skins']:
        # 对图片地址发送请求
        if i['iconImg']:
            content = requests.get(i['iconImg']).content
        else:
            content = requests.get(i['chromaImg']).content
        # 将图片写入文件
        name=i['name']
        with open(f'file1/{name}.jpg','wb') as f:
            f.write(content)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    示例:获取英雄联盟所有英雄的皮肤
    import requests,os
    resp=requests.get('https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js').json()
    j=1
    for i in resp['hero']:
        # 每个英雄的名字,id
        h_name = i['name']
        id = i['heroId']
        # 每个英雄的详细信息
        resp1 = requests.get(f'https://game.gtimg.cn/images/lol/act/img/js/hero/{id}.js').json()
        # print(f'https://game.gtimg.cn/images/lol/act/img/js/hero/{id}.js')
        # 下载图片--创建文件夹
        if not os.path.exists(f'file2/{h_name}'):
            os.mkdir(f'file2/{h_name}')
        # 下载文件
        for k in resp1['skins']:
            # 对图片地址发送请求
            if k['iconImg']:
                content = requests.get(k['iconImg']).content
            else:
                content = requests.get(k['chromaImg']).content
            # 将图片写入文件
            name = k['name']
            with open(f'file2/{h_name}/{name}.jpg', 'wb') as f:
                f.write(content)
        j += 1
        # j 用于控制英雄的个数,下载所有英雄的皮肤时间太长,暂定5个用于测试代码的可行性
        if j >= 6:
            break
    print('下载完成')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    二、用代码判断和创建文件夹

    import  os
    if not os.path.exists('file2/abc'):
        os.mkdir('file2/abc')
    
    • 1
    • 2
    • 3

    三、selenium的用法

    1、selenium库安装

    请添加图片描述

    2、驱动器下载

    查看浏览器的版本。下载与之对应的最接近的版本
    在这里插入图片描述
    下载之后解压,将文件放入与python.exe同一文件之下
    在这里插入图片描述

    3、selenium的基本用法
    • 创建浏览器对象b=Chrome()
    • 打开网页b.get(url)
    • 获取网页源代码 html=b.page_source
    • 关闭网页b.close()
    from selenium.webdriver import Chrome
    # 1、创建浏览器对象(浏览器是全局变量,不会自动关闭)
    b=Chrome()
    # 2、打开网页
    # b.get('https://movie.douban.com/top250')
    b.get('https://channel.chinanews.com.cn/cns/cl/gn-gcdt.shtml')
    # 3、获取网页源代码--获取到的一定是页面中加载出来的
    response=b.page_source
    print(response)
    # 4、关闭浏览器
    b.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    4、selenium控制浏览器的基本行为
    • 输入框输入内容
      • 找到输入框
      • 输入内容
    • 点解按钮
      • 找到点击按钮
      • 点击
    • 切换选项卡
    from selenium.webdriver import Chrome
    from time import sleep
    b=Chrome()
    b.get('https://www.jd.com')
    # 1、输入框输入内容
    # 1.1 找到输入框
    input_tag=b.find_element_by_id('key')
    
    # 1.2 输入内容
    input_tag.send_keys('电脑\n')
    sleep(2)
    # 2、点击按钮
    # 2.1 找到需要点击的标签
    click_tag=b.find_element_by_css_selector('#navitems-group2 .b')
    
    # 2.2 点击标签
    click_tag.click()
    input('是否结束')
    b.close()
    # 3、切换选项卡
    	----未完待续,单独说明
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    5、selenium之切换选项卡
    • 基本操作 切换界面(打开一个新的选项卡)
    • 切换选项卡到第二个页面–页面解析–关闭当前页面
    • 回到上一个页面

    注意: selenium中,浏览器对象(b)默认指向一开始打开的选项卡,除非用代码切换,否则浏览器对象指向的选项卡不会变

    示例:选项卡具体流程
    from selenium.webdriver import Chrome
    from time import sleep
    from bs4 import BeautifulSoup
    
    # 1.基本操作
    b = Chrome()  # 创建浏览器
    b.get('https://www.cnki.net/')  # 打开中国知网
    search_tag = b.find_element_by_id('txt_SearchText')  # 获取输入框
    search_tag.send_keys('数据分析\n')  # 输入框输入"数据分析',然后按回车
    sleep(1)  # 切换界面最后做一个等待操作
    # 获取需要点击的标签:如果拿到标签后需要点击或者输入,必须通过浏览器获取标签
    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])
    # 3)解析内容
    soup = BeautifulSoup(b.page_source, 'lxml')
    result = soup.select_one('#ChDivSummary').text
    print(result)
    b.close()  # 关闭当前指向的窗口,窗口关闭后浏览器对象的指向不会发生改变
    
    # 3、回到上一个页面
    # 回到第一个窗口,点击下一个搜索结果
    b.switch_to.window(b.window_handles[0])
    all_result[1].click()
    sleep(1)
    b.switch_to.window(b.window_handles[-1])
    soup = BeautifulSoup(b.page_source, 'lxml')
    result = soup.select_one('#ChDivSummary').text
    print(result)
    b.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    练习1:获取京东一个商品的名称和价格
    """
    Author:ting
    date:2022/8/15 15:14
    月薪过万
    """
    import csv
    
    from selenium.webdriver import Chrome
    from bs4 import BeautifulSoup
    from time import sleep
    b = Chrome()  # 创建浏览器对象
    b.get('https://www.jd.com')   # 打开网页
    # 控制浏览器动作
    input_tag = b.find_element_by_id('key')
    page1 = input_tag.send_keys('手机\n')
    sleep(4)
    # 解析第一页的数据
    html = b.page_source
    soup = BeautifulSoup(html, 'lxml')
    all_li = soup.select('#J_goodsList>ul>li')
    # print(all_li)
    new_list = []
    for li in all_li:
        price = li.select_one('.p-price i').text
        name = li.select_one('.p-name em').text
        new_list.append([name, price])
    sleep(5)
    # 点击下一页
    click_tag=b.find_element_by_class_name('pn-next')
    click_tag.click()
    html=b.page_source
    # 解析下一页的数据
    soup = BeautifulSoup(html, 'lxml')
    all_li = soup.select('#J_goodsList>ul>li')
    
    for li in all_li:
        name = li.select_one('.p-name em').text
        price = li.select_one('.p-price i').text
        new_list.append([name, price])
    sleep(5)
    b.close()
    with open('file3/手机.csv', 'w', encoding='utf-8',newline='') as f:
        writer = csv.writer(f)
        writer.writerow(['手机名字', '价格'])
        writer.writerows(new_list)
        # writer.writerows(new_list1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    练习2:选项卡的实战
    import csv
    
    from bs4 import BeautifulSoup
    from selenium.webdriver import Chrome
    from time import sleep
    
    
    # 解析内容的函数
    def analysis_data(html: str):
        soup = BeautifulSoup(html, 'lxml')
        try:
            result = soup.select_one('#ChDivSummary').text
        except AttributeError:
            result=' '
        return result
    
    
    b = Chrome()
    b.get('https://www.cnki.net/')
    input_tag = b.find_element_by_class_name('search-input')
    input_tag.send_keys('数据分析\n')
    sleep(2)
    # 获取需要点击的标签
    all_result = b.find_elements_by_css_selector('.result-table-list .name>a')
    new_list=[]
    for i in all_result[:3]:
        i.click()
        b.switch_to.window(b.window_handles[-1])
        result = analysis_data(b.page_source)
        new_list.append([result])
        b.close()
        b.switch_to.window(b.window_handles[0])
        sleep(1)
    print(new_list)
    
    # 点击下一页并解析数据
    click_tag = b.find_element_by_id('PageNext')
    click_tag.click()
    all_result = b.find_elements_by_css_selector('.result-table-list .name>a')
    new_list1=[]
    
    for i in all_result:
        i.click()
        b.switch_to.window(b.window_handles[-1])
        result = analysis_data(b.page_source)
        new_list1.append([result])
        b.close()
        b.switch_to.window(b.window_handles[0])
        sleep(1)
    sleep(1)
    with open('file3/摘要.csv', 'w', encoding='utf-8', newline='') as f:
        writer = csv.writer(f)
        writer.writerows(new_list)
        # writer.writerows(new_list1)
    b.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    6、页面滚动

    在有些页面中,需要滚动页面才会加载后续数据,因此在获取页面数据的时候需要用到页面自动滚动操作

    在指定页面中,要先滚动页面,加载完成页面的数据才能获取页面内容,这样才不至于内容缺失

    执行滚动操作   执行JS中滚动代码:window.scrollBy(x方向偏移量,y方向偏移量)
    b.execute_script('window.scrollBy(0,800)')
    
    • 1
    • 2

    示例:

    from selenium.webdriver import Chrome
    from time import sleep
    from bs4 import BeautifulSoup
    b=Chrome()
    b.get('https://www.jd.com')
    b.find_element_by_id('key').send_keys('手机\n')
    sleep(1)
    
    for i in range(6):
        b.execute_script('window.scrollBy(0,600)')
        sleep(2)
    print('----------------华丽的分割线----------------')
    soup=BeautifulSoup(b.page_source,'lxml')
    goods_list=soup.select('#J_goodsList>ul>li')
    print(len(goods_list))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    7、selenium的基本配置

    在用selenium爬取数据的过程中,浏览器上面有自动测试工具的提示,这个可以取消

    有些网站可能因为图片过多而导致加载缓慢,有个操作可以不让该网站加载完所有图片

    from selenium.webdriver import Chrome,ChromeOptions
    options=ChromeOptions()
    # 1、取消测试提示
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    # 2、取消图片加载
    options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
    
    b=Chrome()
    b.get('https://www.jd.com')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    Pinia简单上手
    前端学习笔记002:CSS3
    CUDA_VISIBLE_DEVICES
    2022-11-11 C++并发编程( 四十一 )
    SpringMVC请求、响应与异步请求
    转行程序员,现实中真的容易吗?
    没想到吧,Spring中还有一招集合注入的写法
    催交费通知单套打单纸设置说明
    【牛客刷题】——Python入门 06 条件语句
    git 取消待推送内容
  • 原文地址:https://blog.csdn.net/qq_44087994/article/details/126354806