mysql 是怎样使用的:从零蛋开始学习 mysql_MySQL学习之路:爬取英雄联盟数据后续使用...

11ea99df37700b729433adaefb0a9f74.png

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

先来看看页面结构。网址是https://lol.qq.com/data/info-defail.shtml?id=1

这个肯定是要爬取的

83fb4e3809b1997b591eda166f17c6c1.png

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

17b8f136503bac00103d4f13003927f8.png

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

bb19da5d6303163329053017cf251ff6.png

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

54249b2cd7859d618b9a97f914bb712d.png

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

d6edd8886ef2868abd36787bb29fe5d6.png

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

af0447523c38a6cebd36f09863511194.png

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

54249b2cd7859d618b9a97f914bb712d.png

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

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

d6edd8886ef2868abd36787bb29fe5d6.png

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

70e34391f8e48e9f95f01ddf4bbdadae.png

一共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() 

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

4d9963fdcc0a9d8c3bcceda0a4e30a6b.png

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值