写在开头:本人郑重承诺,该爬虫行为仅作练习使用。
本文需要一定的爬虫基础,看官们看个乐呵(≧∀≦)ゞ也可以。
from time import sleep #休眠
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'}
初始化的urls列表用于存储图片名称和url,具体见下文
headers伪装嘛,你不装一下人家也不给你数据啊=。=
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/
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(),将函数作用于一个可迭代对象。
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()