mysql英雄联盟卡_MySQL学习之路:爬取英雄联盟数据后续使用

每天自主的创造些数据是不是觉得超级尴尬。是滴,那我们来点真实数据吧。最近对英雄联盟又发生第二春了。所以爬个数据来存进数据库看看。

这个肯定是要爬取的

首先名字和称号都要爬取,还有主要角色,物理攻击、魔法攻击、防御能力和上手难度都要爬取。然后下面的技能也需要爬取一下:

最后当然对于我这种菜鸡,只能把使用技巧也爬下来,顺便看看。

点开F12(谷歌浏览器)就可以看到前端的代码结构了。看得清晰明了,但是宜用pyquery解析一下,啧啧,各种奇怪的事都发生了,根本得不到任何消息,看样子有反爬,那换个思路吧。直接用selenium吧,简单。

再把网页点开看看,啧啧,第一个是安妮,最后一个当然是瑟提。可是为什么瑟提的网址是id=875嗯,里面肯定有很多网页是没有消息的,待会写的过程必须要注意跳过中间没有英雄的页面

我们在看页面的时候,往下拉到技能介绍的时候,发现是新刷新出来的,证明是用了js。在技能这里可以看到是在p标签里

然后点第二个技能发现还是在同一个p标签里显示

那么我们就只能用selenium点击,然后在爬取。

还有主职业那里,有些英雄还有两个角色,比如

所以,这里要爬取多个元素,然后遍历。分析完网页上的数据之后,我们就开始创建数据 库吧。按上一节的方法,直接使用Navicat创建一个yxlm的数据库,在创建一个heroes表,表的结构如下图

一共16个字段。然后直接上爬虫代码吧。

from selenium import webdriver

from selenium.common.exceptions import TimeoutException

from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.support.wait import WebDriverWait

from selenium.webdriver.chrome.options import Options

import time

import pymysql

chrome_options = Options()

chrome_options.add_argument('--headless')

chrome_options.add_argument('user-agent="Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20"')

url = 'https://lol.qq.com/data/info-defail.shtml?id='

browser = webdriver.Chrome(chrome_options=chrome_options)

wait = WebDriverWait(browser,10)

db = pymysql.connect(host='localhost', user='root', passwd='XXXX', port=3306,db='yxlm')

cursor = db.cursor()

for i in range(1,876):

try:

items = main(i)#这里用try是为了跳过中间没有的页面

except:

continue

insert_data(items)

def main(i):

url = 'https://lol.qq.com/data/info-defail.shtml?id=' + str(i)

browser.get(url)

time.sleep(1)

data_items = []#新建一个list,用于存放待会要存储的数据

data_items.append(i) #向data_items中插入id

name = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.defail-data h1'))).text

title = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.defail-data h2'))).text

data_items.append(name)#向data_items中插入name data_items.append(title)#向data_items中插入title

role = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.defail-data div span')))

for item in role:

data_items.append(item.text)

if len(role) == 1:

data_items.append(None)#向data_items中插入role,只有一个时,另一个插入None

items_value = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.defail-data dl dd i')))

for item in items_value: value=item.get_attribute('title')

data_items.append(int(value.strip()))

browser.execute_script("window.scrollTo(0,1000)")#将页面下滑至技能处

skills = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#DATAspellsNAV > li')))

for item in skills:

item.click()

skill = browser.find_element_by_css_selector('#DATAspells > p').text

data_items.append(skill)

browser.execute_script("window.scrollTo(1000,document.body.scrollHeight)")

team = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'body > div.wraper > div > div.clearfix > div.infoleftcont > div.colbox.arttips #DATAallytips > dd'))).text

data_items.append(team)

enemy = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'body > div.wraper > div > div.clearfix > div.infoleftcont > div.colbox.arttips #DATAenemytips > dd'))).text

data_items.append(enemy)

return data_items def insert_data(test):

values = ['%s'] * 16

value = ' ,'.join(values)

sql = 'INSERT INTO heros(`id`, `name`, `title`, `main_role`, `second_role`, `physical_attack`, `magic_attack`, `defend_ability`, `operative`, `skill1`, `skill2`, `skill3`, `skill4`, `skill5`,`team`, `enemy`) VALUES ({})'.format(value)

try:

cursor.execute(sql, tuple(test))

db.commit()

except:

db.rollback()

代码里有很多不规范的,多多包涵,毕竟主要是为了数据,结果就如下:

当然,这样稍微改改也就能很容易的爬到所有英雄联盟的皮肤图片啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值