[python]英雄联盟官网头像爬取

写在开头:本人郑重承诺,该爬虫行为仅作练习使用。

本文需要一定的爬虫基础,看官们看个乐呵(≧∀≦)ゞ也可以。

1.爬取目标:

[python]英雄联盟官网头像爬取_第1张图片

2.需要的模块或类:

from time import sleep                    #休眠
from selenium import webdriver            #驱动浏览器
from lxml import etree                    #解析界面
from multiprocessing.dummy import Pool    #线程池
import os                                 #创建文件
import requests                           #网络请求

3.headers伪装,新建文件夹:

if not os.path.exists('./英雄联盟'):
    os.mkdir('./英雄联盟')
urls=[]
headers={'user-agent':'Mozilla/5.0'}

初始化的urls列表用于存储图片名称和url,具体见下文

headers伪装嘛,你不装一下人家也不给你数据啊=。=

4.页面数据获取:

bro=webdriver.Edge('F:\浏览器下载\edge\msedgedriver.exe') #初始化浏览器对象
bro.get('https://lol.qq.com/data/info-heros.shtml')          
sleep(1)                                                 #stop一秒,做人不能太快哦!
page_text=bro.page_source                                #获取页面数据
                                                        
#print(page_text)这块是我用来测试是否获取到了页面数据的,可以忽略   

bro.quit()                                               #获取完数据就给丫关了

这里为什么要用浏览器来获得页面数据呢? 经过本人尝试requests.get直接发请求的话返回的页面数据奇奇怪怪

解释下:bro=webdriver.Edge('F:\浏览器下载\edge\msedgedriver.exe') 

浏览器驱动可以实现浏览器自动化操作,这里附上下载地址(按照自己浏览器版本下载哦):https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

5.数据解析,永久化存储:

tree=etree.HTML(page_text)
li_list=tree.xpath('//ul[@id="jSearchHeroDiv"]/li')
#print(len(li_list))
for li in li_list:
    src='https:'+li.xpath('./a/img/@src')[0]
    name=li.xpath('./a/p/text()')[0]
    data_dic={'name':name,'url':src}
    urls.append(data_dic)

def save_data(data_dic):
    r=requests.get(url=data_dic['url'],headers=headers)
    with open('./英雄联盟/'+data_dic['name']+'.png','wb')as f:
        f.write(r.content)
    print( './英雄联盟/'+data_dic['name']+'.png下载成功')

pool=Pool(10)
pool.map(save_data,urls)

pool.close()
pool.join()

数据解析可以用xpath,BeautifulSoup,正则表达式,个人感觉xpath很方便

pool.map()函数类似map(),将函数作用于一个可迭代对象。

6.源码:

from selenium import webdriver
from lxml import etree
from multiprocessing.dummy import Pool
import os
import requests

if not os.path.exists('./英雄联盟'):
    os.mkdir('./英雄联盟')
urls=[]
headers={'user-agent':'Mozilla/5.0'}

bro=webdriver.Edge('F:\浏览器下载\edge\msedgedriver.exe')
bro.get('https://lol.qq.com/data/info-heros.shtml')
sleep(1)
page_text=bro.page_source
#print(page_text)
bro.quit()

tree=etree.HTML(page_text)
li_list=tree.xpath('//ul[@id="jSearchHeroDiv"]/li')
#print(len(li_list))
for li in li_list:
    src='https:'+li.xpath('./a/img/@src')[0]
    name=li.xpath('./a/p/text()')[0]
    data_dic={'name':name,'url':src}
    urls.append(data_dic)

def save_data(data_dic):
    r=requests.get(url=data_dic['url'],headers=headers)
    with open('./英雄联盟/'+data_dic['name']+'.png','wb')as f:
        f.write(r.content)
    print( './英雄联盟/'+data_dic['name']+'.png下载成功')

pool=Pool(10)
pool.map(save_data,urls)

pool.close()
pool.join()

7.效果:

[python]英雄联盟官网头像爬取_第2张图片

[python]英雄联盟官网头像爬取_第3张图片

 

你可能感兴趣的:(python,python,xpath,selenium)