一. 嵌套构造URL
下载所有英雄的皮肤图片:因为每个英雄图片的网址不同,但是有共同点,通过构建这个网址,再经过循环建立 所有链接
python
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的基本使用
python
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进阶 自动在京东网站的搜索框中查找笔记本电脑
python
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再进阶 在百度中进行搜索, 增加功能:获取所有打开的页面,并且切换到最新打开的页面
python
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获取元素
python
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.爬取中国知网 数据挖掘第一篇论文的摘要
python
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()