用selenium自动加载浏览器下载图片
上一篇用requests这个库进行图片的批量下载,只所以可以这样做,是因为豆瓣提供的XHR的接口API,而且接口返回的数据类型为json格式,所以使用起来非常的方便,但是有时候我们需要分析html格式或xml格式的数据,从中提取需要的链接,再进行下载,这时候selenium就派上了用场。
一 人工下载海报
以下载甄子丹的海报为例,我们一般打开豆瓣电影网站:https://movie.douban.com/ 然后输入关键词甄子丹,然后再去下载海报。
二 自动下载处理思路
自动下载,我们需要能够分析出网页种海报图片的具体地址,然后通过程序去下载。
2.1 xpath学习
这里通过xpath去搜寻图片的地址,xpath是 XML Path Language的简称,原来用于搜索xml中的具体路径的,同样适用于搜寻html的元素,简单语法说明下:
在python中,适用lxml库可以将html转成xpath对象,然后进行分析,非常方便,lxml库可以对html未闭合的标签元素做容错处理。
看一个简单的例子:
from lxml import etree
text = '''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
解析:
#读取字符串,读取文件可以用
#html=etree.parse('test.html',etree.HTMLParser())
html = etree.HTML(text)
#转成补全字节
r = etree.tostring(html,encoding='utf-8')
#打印补全结果
#print(r.decode('utf-8'))
#搜下下面所有为li的子孙节点
resultLi = html.xpath("//li")
print("//li: "+ str(resultLi))
#搜寻li节点下面的a节点,并取href属性的值
reLiA = html.xpath("//li/a/@href")
print("//li/a/@href :"+ str(reLiA))
#获取href的属性值为link2.html的a节点的上层节点的class熟悉值
reClass=html.xpath('//a[@href="link2.html"]/../@class')
print('//a[@href="link2.html"]/../@class :'+ str(reClass))
#搜寻li节点下面的a节点,并取href属性的值
reLiText = html.xpath("//li/a/text()")
print("//li/a/text() :"+ str(reLiText))
上述代码本来是一段,在markdown中解析有问题,改成两段了。
打印结果如下:
//li: [<Element li at 0x1cb14b89908>, <Element li at 0x1cb14b89988>, <Element li at 0x1cb14b899c8>, <Element li at 0x1cb14b89a08>, <Element li at 0x1cb14b89a48>]
//li/a/@href :['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']
//a[@href="link2.html"]/../@class :['item-1']
//li/a/text() :['first item', 'second item', 'third item', 'fourth item', 'fifth item']
2.2 图片的xpath路径提取
通过上面的例子,xpath的语法虽然不复杂,但是有时候还要记忆,幸好chorme浏览器有个xpath helper插件,安装上之后鼠标放在图片上,按下ctrl+shift+x键,弹出对话框:
鼠标在这些海报中来回移动,发现变化的部分,然后修改xpath,去掉前面的固定前缀,把list的下标改成固定值,得到如下:
得到海报的xpath:
//div[@id='recent_movies']/div[@class='bd']/ul[@class='list-s']/*/div[@class='pic']/a/img/@src
这个xpath可以获取到的图片地址为:
https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2577437186.webp
https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2537133715.webp
https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2542380253.webp
https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2528842218.webp
https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2499052494.webp
我们用selenium模拟浏览器来进行html的加载和xpath的查询,获取到地址后,就可以通过下载函数进行图片下载。
三. 利用selenium 进行海报的下载
在豆瓣电影中搜索”甄子丹”
https://search.douban.com/movie/subject_search?search_text=%E7%94%84%E5%AD%90%E4%B8%B9&cat=1002
调整下xpath:
//div[1]/div[@class='sc-bZQynM jbSySb sc-bxivhb gemzcp'][*]/div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src
得到的15个结果:
https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2577437186.webp
...
如果需要翻页的话,链接加个start=15说明从16个海报开始展示。
获取电影名称:
//div[@class='_ytukbl17q']/div[1]/div[@class='sc-bZQynM cBnAay sc-bxivhb gemzcp'][*]/div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']
得到结果:
武侠 (2011)
西游记之大闹天宫 (2014)
...
最终下载代码:
# -*- coding: utf-8 -*-
import requests
import json
import sys
import io
import os
from selenium import webdriver
from lxml import etree
def download(picPath,src, id):
if not os.path.isdir(picPath):
os.mkdir(picPath)
dir = picPath+'/' + str(id) + '.webp'
print(src)
imageHeader = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
#'accept-encoding': 'gzip, deflate',
'accept-language': 'zh-CN,zh;q=0.9',
'cache-control': 'max-age=0',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
try:
pic = requests.get(src,headers=imageHeader,timeout=50)
fp = open(dir, 'wb')
fp.write(pic.content)
fp.close()
except requests.exceptions.ConnectionError:
print('Sorrry,image cannot downloaded, url is error{}.'.format(src))
def query_img(query,downloadUrl):
realUrl = downloadUrl.format(query)
print(realUrl)
driver = webdriver.Chrome('D:\\py3\\Lib\\site-packages\\selenium\\webdriver\\chrome\\chromedriver_win32\\chromedriver.exe')
driver.get(realUrl)
#解析html
html = etree.HTML(driver.page_source)
image_url_path = "//div[1]/div[*]/div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src"
movie_name_path = "//div/div[1]/div[*]/div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']/text()"
urls = html.xpath(image_url_path)
names = html.xpath(movie_name_path)
picPath = 'F:\\python\\images'
for (url,name) in zip(urls,names):
download(picPath,url,name)
if __name__ == "__main__":
query = '甄子丹'
url = 'https://search.douban.com/movie/subject_search?search_text=\'{}\'&cat=1002'
query_img(query,url)
注意:这里面利用chrome浏览器的driver,不同的浏览器的driver可以到https://selenium-python.readthedocs.io/installation.html链接去下载,主要要和自己的浏览器版本保持一致。
chrome浏览器的版本可以通过在浏览器中输入:chrome://version/来进行查看。
祝大家冬至快乐!
用selenium自动加载浏览器下载图片的更多相关文章
- selenium自动加载各个浏览器插件
在自动化测试过程中,通过selenium启动浏览器时,可能需要加载插件(如测试用的firebug.或产品中要求必须添加某插件等).读取用户数据(自己浏览器的配置文件/别人直接给的浏览器配置文件).设置 ...
- selenium自动加载Flash
当我们在定位的时候,有时候会碰到Flash问题导致无法定位到元素 通过下面的代码就能解决问题 参考:https://blog.csdn.net/qq_37913997/article/details/ ...
- exml自动加载图片
常规H5和微信小游戏同样有效 一.exml自动加载图片 有两张图片 图片未放入defatult.res.json的资源组里,未预先加载包含2张图片的资源组,仅仅在default.res.json里有图 ...
- 如何在启用SharePoint浏览器功能的InfoPath 表单中添加托管代码以动态地加载并显示图片
InfoPath 的浏览器表单不支持加载并显示图片,当然在模板中可以插入图片,但是如果想显示数据库的一幅图片,或是动态加载一张图片就无能为力了. 基实这个问题可以通过在浏览器表单中使用: " ...
- selenium自动化之加载浏览器的配置文件
做seleniumUI自动化关于选用哪个浏览器方面,对于我来说,火狐浏览器只是用于定位元素,因为有firebug(注意高版本的火狐已经安装不了这个插件了),而真正执行自动化脚本用的是谷歌,感觉谷歌的速 ...
- 滚动到指定元素的id处+当元素出现在浏览器显示区域就会自动加载
//滚动到指定元素的id处 如:$("#Exam82") function Jump() { var scroll_offset = $("#Exam82"). ...
- ssh整合思想初步 struts2与Spring的整合 struts2-spring-plugin-2.3.4.1.jar下载地址 自动加载Spring中的XML配置文件 Struts2下载地址
首先需要JAR包 Spring整合Structs2的JAR包 struts2-spring-plugin-2.3.4.1.jar 下载地址 链接: https://pan.baidu.com/s/1o ...
- 手工下载php的composer软件包,如何让项目自动加载包里的类
有的时候需要手工下载php的composer包 1.将下载好的包放到项目的vendor目录下,比如包名:pinguo/php-aop 2.然后查看软件包目录(vendor/pinguo/php-aop ...
- No.11 selenium学习之路之加载浏览器插件for Firefox
打开帮助 —— 故障排除信息
随机推荐
- error C4996: 'AVStream::codec': was declared deprecated
关闭VS的SDL检查 工程 属性=>C/C++ =>General=> SDL checks 改为 No(/sdl).
- rest framework 之序列化
一.示例 restful work 的序列号就类似于 Django 的 Form 表单. 1.api/urls.py from django.urls import path, re_path fro ...
- FreeBSD安装过程
对于现在版本,安装过程中该使用哪些键,现简单总结: Space:选中/取消选中: Tab:切换,主要是分区界面时用它选择输入行: Enter:确定(并进入下一页): 方向键:在一些子组里更换输入项得用 ...
- error: stdio.h: 没有那个文件或目录
在64位系统中,编写一个C语言程序后,使用gcc进行编译时,出现了如下的错误: test.c:1:19: fatal error: stdio.h: 没有那个文件或目录 #include <s ...
- java 的任意进制间转换(很方便)
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = n ...
- Explorer(2019年牛客多校第八场E题+线段树+可撤销并查集)
题目链接 传送门 题意 给你一张无向图,每条边\(u_i,v_i\)的权值范围为\([L_i,R_i]\),要经过这条边的条件是你的容量要在\([L_i,R_i]\),现在问你你有多少种容量使得你可以 ...
- python基础语法5 函数定义,可变长参数
函数 1.什么是函数 函数就是一种工具. 可以重复调用 2.为什么要用函数 1.防止代码冗(rong)余 2.代码的可读性差 3.怎么用函数 1.定义函数-->制造工具 2.调用函数--> ...
- 通过jar包名称,获取maven的依赖信息GAV
烦恼:当我们手上有一堆三方件jar包,想要转成maven管理时,需要一个一个配置进pom文件中,而且GAV信息还得去收集. 为了快速生成如下信息,我们可以这样.... GAV:groupId + ar ...
- Proxy监听对象的数据变化,处理绑定数据很有用
Proxy可以监听对象身上发生了什么事情,并在这些事情发生后执行一些相应的操作.一下子让我们对一个对象有了很强的追踪能力,同时在数据绑定方面也很有用处. }; //interceptor 拦截 var ...
- 爬虫-requests用法
中文文档 API: http://requests.kennethreitz.org/zh_CN/latest/ 安装 pip install requests 获取网页 # coding=utf-8 ...