![11ea99df37700b729433adaefb0a9f74.png](https://i-blog.csdnimg.cn/blog_migrate/7b571888dab97066f866d79d0e8cd827.png)
每天自主的创造些数据是不是觉得超级尴尬。是滴,那我们来点真实数据吧。最近对英雄联盟又发生第二春了。所以爬个数据来存进数据库看看。
先来看看页面结构。网址是https://lol.qq.com/data/info-defail.shtml?id=1
这个肯定是要爬取的
![83fb4e3809b1997b591eda166f17c6c1.png](https://i-blog.csdnimg.cn/blog_migrate/a48829de2f419c2e4fb6758b7773f93d.png)
首先名字和称号都要爬取,还有主要角色,物理攻击、魔法攻击、防御能力和上手难度都要爬取。然后下面的技能也需要爬取一下:
![17b8f136503bac00103d4f13003927f8.png](https://i-blog.csdnimg.cn/blog_migrate/043a63d1683c9c658f84891c92310c4e.png)
最后当然对于我这种菜鸡,只能把使用技巧也爬下来,顺便看看。
![bb19da5d6303163329053017cf251ff6.png](https://i-blog.csdnimg.cn/blog_migrate/01a53edc5916f2ccb38d9d4754aeaa01.jpeg)
点开F12(谷歌浏览器)就可以看到前端的代码结构了。看得清晰明了,但是宜用pyquery解析一下,啧啧,各种奇怪的事都发生了,根本得不到任何消息,看样子有反爬,那换个思路吧。直接用selenium吧,简单。
![54249b2cd7859d618b9a97f914bb712d.png](https://i-blog.csdnimg.cn/blog_migrate/1bd576623520e65da6421fa33904b1ae.png)
再把网页点开看看,啧啧,第一个是安妮,最后一个当然是瑟提。可是为什么瑟提的网址是id=875嗯,里面肯定有很多网页是没有消息的,待会写的过程必须要注意跳过中间没有英雄的页面
![d6edd8886ef2868abd36787bb29fe5d6.png](https://i-blog.csdnimg.cn/blog_migrate/6e8967b74e68e8541f68a1f015aeb4fd.png)
我们在看页面的时候,往下拉到技能介绍的时候,发现是新刷新出来的,证明是用了js。在技能这里可以看到是在p标签里
![af0447523c38a6cebd36f09863511194.png](https://i-blog.csdnimg.cn/blog_migrate/2637cb8d13cc554c10c54d74462598f9.png)
然后点第二个技能发现还是在同一个p标签里显示
![54249b2cd7859d618b9a97f914bb712d.png](https://i-blog.csdnimg.cn/blog_migrate/1bd576623520e65da6421fa33904b1ae.png)
那么我们就只能用selenium点击,然后在爬取。
还有主职业那里,有些英雄还有两个角色,比如
![d6edd8886ef2868abd36787bb29fe5d6.png](https://i-blog.csdnimg.cn/blog_migrate/6e8967b74e68e8541f68a1f015aeb4fd.png)
所以,这里要爬取多个元素,然后遍历。分析完网页上的数据之后,我们就开始创建数据 库吧。按上一节的方法,直接使用Navicat创建一个yxlm的数据库,在创建一个heroes表,表的结构如下图
![70e34391f8e48e9f95f01ddf4bbdadae.png](https://i-blog.csdnimg.cn/blog_migrate/86a99e3070b538d6ca113b82837437c4.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](https://i-blog.csdnimg.cn/blog_migrate/1806b981a82ebcc81ab1d4f0bb73d8e5.png)
当然,这样稍微改改也就能很容易的爬到所有英雄联盟的皮肤图片啦。
![e0045cd127a089ee9cc1d3de23dba435.png](https://i-blog.csdnimg.cn/blog_migrate/6454efd160b5d2744477c95b147aa3ef.jpeg)