week04day04(爬虫)

一. 嵌套构造URL

下载所有英雄的皮肤图片:因为每个英雄图片的网址不同,但是有共同点,通过构建这个网址,再经过循环建立 所有链接
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']]

# list1 = get_all_hero_id()
# print(list1)
# https://game.gtimg.cn/images/lol/act/img/js/hero/{897}.js

# 2.定义函数获取指定英雄的皮肤信息
def get_one_hero_skins(hero_id:str):
    url = f'https://game.gtimg.cn/images/lol/act/img/js/hero/{hero_id}.js'
    result = requests.get(url).json()

    # 创建英雄的文件夹
    hero_name = result['hero']['name']
    folder_path = f'所有英雄的皮肤/{hero_name}'
    if not os.path.exists(folder_path):
        os.mkdir(folder_path)

    # 下载这个英雄的皮肤的链接
    for skin in result['skins']:
        skin_name = skin['name'].replace('/','')
        skin_img = skin['mainImg']
        if not skin_img:
            skin_img = skin['chromaImg']

        # 下载皮肤图片
        res = requests.get(skin_img)
        if res.status_code == 200:
            file_path = f'{folder_path}/{skin_name}.jpg'
            with open(file_path,'wb') as f:
                f.write(res.content)

        print('下载成功!')

if __name__ == '__main__':
    ids = get_all_hero_id()
    for x in ids:
        get_one_hero_skins(x)

二、selenium

  • 使用和浏览器相匹配的webdriver

  • chrome://version/ 查看版本

1.selenium的基本使用

from selenium.webdriver import Chrome

# 1.创建浏览器对象
driver = Chrome()

# 2.打开页面
driver.get('https://movie.douban.com/top250')

# 3. 获取网页源代码
print(driver.page_source)

# 4. 关闭浏览器窗口
driver.close()

# 5.释放资源
driver.quit()

2. selenium进阶  自动在京东网站的搜索框中查找笔记本电脑

from selenium.webdriver import Chrome
from time import sleep
from  selenium.webdriver.common.by import By

# 1. 创建对象
b = Chrome()

# 2.打开网页
b.get('https://www.jd.com/')
# 强制等待5s
sleep(5)

# 输入框输入内容
# a.找到输入框
# 通过id 找到输入框
input_tag = b.find_element(By.ID, 'key')

# b. 输入东西
# send_keys 是自动输入
input_tag.send_keys('笔记本电脑\n') # \n是回车的意思
input('是否结束')

# 3.结束
b.close()
b.quit()

3. selenium再进阶  在百度中进行搜索, 增加功能:获取所有打开的页面,并且切换到最新打开的页面

from selenium.webdriver import Chrome
from time import sleep
from selenium.webdriver.common.by import By

# 1. 创建对象
b = Chrome()

# 2.打开网页
b.get('https://www.baidu.com/')
sleep(5)

# 输入框输入内容
# a.找到输入框
# 这里的value去网页看检查, 看输入框的id 是什么,这里百度的id 是kw
input_tag = b.find_element(By.ID, 'kw')

# b. 输入东西
input_tag.send_keys('上海天气') # \n是回车的意思
# 百度一下那个按钮
btn = b.find_element(By.ID,'su')

# 按下按钮
btn.click()
# 获取当前所有打开的窗口
all_window = b.window_handles
# 切换到最新打开的浏览器窗口,[-1]是最右边新的窗口
b.switch_to.window(all_window[-1])

# 3.结束
b.close()
b.quit()



**4.selenium超进阶  获取lol 所有装备名字 加入等待。 显示等待、隐式等待以及睡眠等待, 且使用selenium获取元素 


from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait

# 1.浏览器的选项对象
options = webdriver.ChromeOptions()

# 浏览器实例化
chrome = webdriver.Chrome()

# 打开页面
chrome.get('https://lol.qq.com/data/info-item.shtml#Navi')

# 1.隐式等待
# 设置全局元素等待超时时间20秒
#设置一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步,超出设置的时长20秒还没有定位到元素,则抛出异常。
# 缺点:程序会一直等待整个页面加载完成,直到超时,但有时候我需要的那个元素早就加载完成了,只是页面上有个别其他元素加载特别慢,我仍要等待页面全部加载完成才能执行下一步。
# 注意:对driver起作用,所以只要设置一次即可,没有必要到处设置
chrome.implicitly_wait(20)

# 2.显式等待
# 最长等待时间
wait_obj = WebDriverWait(driver=chrome,timeout=10)
# 显示等待是明确提出要等什么, 在这里是等待#jSearchHeroDiv>li>a该标签的内容加载完毕
wait_obj.until(expected_conditions.element_to_be_clickable(chrome.find_element(By.CSS_SELECTOR,'#jSearchHeroDiv>li>a')))

# 3.强制等待 from time import sleep
# 强制等待10秒再执行下一步。缺点:是不管资源是不是完成,都必须等待
sleep(10)

# 使用selenium获取页面元素
items_tags_p = chrome.find_elements(By.CSS_SELECTOR,'#jSearchItemDiv>li>p')
for p in items_tags_p:
    print(p.text)


chrome.close()
chrome.quit()

4.爬取中国知网 数据挖掘第一篇论文的摘要

from selenium.webdriver import Chrome
from time import sleep
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
# 1.实例化 打开网页
b = Chrome()
b.get('https://www.cnki.net/')
sleep(5)

# 2. 获取输入框
search_tag =b.find_element(By.ID,'txt_SearchText') # 按id找
search_tag.send_keys('数据挖掘\n') #自动往输入框中输入数据挖掘 并按回车

sleep(10)

# 3.获取所有结果的链接标签
all_results =b.find_elements(By.CSS_SELECTOR,'.result-table-list .name>a') # CSS

# 点击第一个
all_results[0].click()
sleep(10)

# 获取当前所有打开的窗口
all_window = b.window_handles
# 切换到最新打开的浏览器窗口,[-1]是最右边新的窗口
b.switch_to.window(all_window[-1])

#使用bs4解析内容
soup = BeautifulSoup(b.page_source,'lxml')
result = soup.select_one('#ChDivSummary').text
print(result)

input('end?')
b.close()
b.quit()

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值