交代引用的库:
1)、引用了selenium库
from selenium import webdriver
from selenium.webdriver.common.by import By
2)、引用了urllib,urllib3,bd4以及re、os等系统库
import time,re,os,requests
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
问题来源:
1、某个论坛的编辑器为UEditor的富文本编辑器,不能通过urllib库直接爬取HTML,再解析HTML获取URL;
2、所有表情的URL源无固定联系;
3、论坛编辑中的表情未本地化;(根本原因)
直接上代码:
driver = webdriver.Firefox()
driver.implicitly_wait(20)
driver.get('论坛网址不方便透露')
这里是点击打开编辑器:
driver.find_element(By.定位方式,"元素定位").click()
由于编辑器中个别组件未本地化,需要加载时间,我这里加了5秒的强制等待时间,也可以换成显性等待:
time .sleep(5)
这里是点击表情按钮:
driver.find_element(By.定位方式,"元素定位").click()
获取HTML:
html = driver.page_source
解析获取的HTML(html.parser这个是python库里面自带的解析器,无需安装):
soup = BeautifulSoup(html,"html.parser")
寻找class的值,在获取地整个HTML中寻找所有 img (所有img的class_=”emojioneemoji”)
find_img_1 = soup.find_all(class_="emojioneemoji")
关闭webdriver打开的浏览器,从这里开始不需要浏览器了:
driver.close()
利用os系统库创建下载图片保存的文件夹:
os.mkdir(r'C:\Users\\Administrator\Desktop\img_download')
os.chdir(r'C:\Users\\Administrator\Desktop\img_download')
利用 i 将网址一个一个带出来,进行正则 因为 find_img_1输出的是一个字典,所以这里带出来的值需要强转(通过以下正则分别提取了表情的保存文件名,img的URL地址):
for i in find_img_1:
i = str(i)
img_url_0 = re.sub('data-src',"src",a) #将'data-src'字段变更为"src",
img_url_1 = re.split(" ",img_url_0) #利用空格转化为元组
img_url_2 = img_url_1[-1] #取元组中的最后一个值
img_url_3 = re.sub('src="',"",img_url_2) #将'src="'全部删除
img_url_4 = re.sub('"/>',"",img_url_3) #将'"/>'全部删除
img1 = re.split(r"/", img_url_4) #利用"/"符号转化为元组
filename = img1[-1] #这里就是文件名
这里通过正则获取到的地址是不带‘http’开头的url地址,添加获得我们要的URL:
img_url="http:"+img_url_4
利用requests.get(img地址)发送请求:
r=requests.get(img_url)
biaopqing=r.content
解析HTML页面,获取img,利用Request函数发送请求:
soup_img=BeautifulSoup(biaopqing,"html.parser").findAll('img',{"src": re.compile(r".?\.(png)")})
req = Request(img_url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36')
获取并利用read()解析响应:
respon = urlopen(req)
url=respon.read()
保存图片至我们创建好的文件夹中:
with open(filename,"wb")as f:
f.write(url)
感谢浏览!!!
之所以我要这样去做 ,是因为第一,无法直接通过解析论坛页面获取表情的URL;第二表情的URL地址格式不一,命名不一;第三总共是近一万的表情,纯正则太麻烦。