如果您觉得感兴趣的话,可以添加我的微信公众号:一步一步学Python
![](http://images2017.cnblogs.com/blog/993869/201711/993869-20171118215516327-881787609.jpg)

随笔中的代码拷贝自

http://www.cnblogs.com/Albert-Lee/p/6275146.html

感谢阿里波特,通过学习自己做了一些注释,作为总结和记录。

 from selenium import webdriver
import requests
from bs4 import BeautifulSoup
import os
import time
#定义函数时,尽量写上默认参数,字符='',数字=0,特殊对象也要定义默认值,这样就可以简单的通过.来得到参数具有的性质等。
class BeautifulPicture():
def __init__(self):
# 给请求指定一个请求头来模拟chrome浏览器
self.headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1'}
self.web_url='https://unsplash.com'
self.folder_path=r'E:\Python Code\test' def request(self,url):#返回网页的response
r=requests.get(url)#获得目标网址的response对象
return r def mkdir(self,path=''):#创建文件夹
path=path.strip()#删除空白字符
isExists=os.path.exists(path)#判断路径是否存在
if not isExists:#如果不存在,则创建文件夹
print('创建名字叫做',path,'的文件夹')
os.makedirs(path)#创建目标文件夹
print('创建成功')
return True#文件夹不存在返回True
else:#如果存在,返回
print(path,'文件夹已经存在了,不再创建了')
return False def scroll_down(self,driver=webdriver.PhantomJS(),times=1):#模拟下拉操作
for i in range(times):
print('开始执行第',str(i+1),'次下拉操作')
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')#执行js代码操作,页面滚动到指定位置(x,y)
print('第',str(i+1),'次下拉操作执行完毕')
print("第", str(i + 1), "次等待网页加载......")
time.sleep(20) def get_files(self,path=''):
pic_names=os.listdir(path)#获取目录中的内容
return pic_names def save_img(self,url,file_name):
print('开始请求图片地址,过程比较长。。。')
img=self.request(url)#img是个response对象
print('开始保存图片')
f=open(file_name,'ab') # rU或Ua以只读方式打开
# w 以写方式打开
# a 以追加模式打开
# r+ 以读写方式打开
# w+ 读写
# a+ 读写
# rb 二进制读
# wb 二进制写 ab 二进制追加 rb+ 二进制读写 wb+二进制读写 ab+二进制读写
#
f.write(img.content)
#如果想获取文本,可以通过response.text,如果想获取图片、文件,可以通过response.content。
# resp.text返回的是Unicode型的数据。
# resp.content返回的是bytes型也就是二进制的数据。
print(file_name,'图片保存成功')
f.close() def get_pic(self):
print('开始网页请求')
#使用selenium通过PhantomJS来进行网络请求
driver=webdriver.PhantomJS()
driver.get(self.web_url)#这里就不再通过urllib进行网络请求了
self.scroll_down(driver=driver,times=5)#下拉5次,可以自己设定
print('开始获取所有a标签')
#获取网页中class为cV68d的所有a标签
all_a=BeautifulSoup(driver.page_source,'lxml').find_all('a',class_='cV68d')
#按照css类名搜索tag的功能非常实用,但标识css类名的关键字class在Python中是保留字,实用class做参数会导致语法错误。同BS4.1.1版本开始,通过class_参数搜索。
print('开始创建文件夹')
is_new_folder=self.mkdir(self.folder_path)
print('开始切换文件夹')
os.chdir(self.folder_path)#改变当前工作路径,.gwd()为获取当前工作目录 print('a标签的数量是:',len(all_a))
file_names=self.get_files(self.folder_path)#获取当前工作目录下的文件名?干吗用? for a in all_a:
img_str=a['style']
print('a标签的style内容是:',img_str)
first_pos=img_str.index('(')+1
second_pos=img_str.index(')')
img_url=img_str[first_pos:second_pos] # 注:为了尽快看到下拉加载的效果,截取高度和宽度部分暂时注释掉,因为图片较大,请求时间较长。
# 获取高度和宽度的字符在字符串中的位置
# width_pos = img_url.index('&w=')
# height_pos = img_url.index('&q=')
# width_height_str = img_url[width_pos : height_pos] #使用切片功能截取高度和宽度参数,后面用来将该参数替换掉
# print('高度和宽度数据字符串是:', width_height_str)
# img_url_final = img_url.replace(width_height_str, '') #把高度和宽度的字符串替换成空字符
# print('截取后的图片的url是:', img_url_final) # 截取url中参数前面、网址后面的字符串为图片名
name_start_pos=img_url.index('.com/')+5
name_end_pos=img_url.index('?')
img_name=img_url[name_start_pos:name_end_pos]+'.jpg'
img_name=img_name.replace('/','') if is_new_folder:#如果文件夹不存在,那么肯定没有重复文件,则直接保存文件。
self.save_img(img_url,img_name)
else:
if img_name not in file_names:#如果文件夹存在,需要判断是否有重复文件
self.save_img(img_url, img_name) # 调用save_img方法来保存图片
else:
print("该图片已经存在:", img_name, ",不再重新下载。") beauty = BeautifulPicture() #创建类的实例
beauty.get_pic() #执行类中的方法

Python PhatomJS 和Selenium动态加载页面 获取图片内容的更多相关文章

  1. Python+Selenium爬取动态加载页面(2)

    注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ...

  2. Python+Selenium爬取动态加载页面(1)

    注: 最近有一小任务,需要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统和全国水雨情网.由于这两个网站的数据都是动态加载出来的,所以我用了Selenium来完成我的数据获取. ...

  3. 爬虫再探实战(三)———爬取动态加载页面——selenium

    自学python爬虫也快半年了,在目前看来,我面临着三个待解决的爬虫技术方面的问题:动态加载,多线程并发抓取,模拟登陆.目前正在不断学习相关知识.下面简单写一下用selenium处理动态加载页面相关的 ...

  4. 转:从pickle看python类成员的动态加载和类的定位

      pickle是Python轻便的对象序列化工具.使用pickle可以方便地把python对象写入文件对象中,或者像soap那样在socket间传送.     按照python的一贯作风,类的成员在 ...

  5. ExtJS 4.1 TabPanel动态加载页面并执行脚本【转】

    ExtJS 4.1 TabPanel动态加载页面并执行脚本 按照官方示例,可以动态加载页面,可是脚本不执行,于是查SDK.google,发现scripts需要设置为true,于是设置该属性,整个代码如 ...

  6. div动态加载页面

    div动态加载页面 /* /// method 1 var url="<%=basePath%>/qne.do?p=pessegerCountSet"; $.post( ...

  7. 记录Js动态加载页面.append、html、appendChild、repend添加元素节点不生效以及解决办法

    今天再优化blog页面的时候添加了个关注按钮和图片,但是页面上这个按钮和图片时有时无,本来是搞后端的,被这个前端的小问题搞得抓耳挠腮的! 网上各种查询解决方案,把我解决问题的艰辛历程分享出来,希望大家 ...

  8. 爬虫再探实战(四)———爬取动态加载页面——请求json

    还是上次的那个网站,就是它.现在尝试用另一种办法——直接请求json文件,来获取要抓取的信息. 第一步,检查元素,看图如下: 过滤出JS文件,并找出包含要抓取信息的js文件,之后就是构造request ...

  9. jQuery实现滚动时动态加载页面内容

    有些网站的网页内容不是一次性加载完毕的,而是在鼠标向下滚动时动态加载的,这是怎么做到的呢?看下面代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

随机推荐

  1. Java防止SQL注入的几个途径

    java防SQL注入,最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用 PreparedStatement来代替Statement来执行SQL语句,其 ...

  2. python测试与调试提示

    测试与调试提示 2.1 在交互模式输入一个python语句就会执行一个.在调试程序时,这种模式尤其有用. 2.2 在一个文件调用python解释器后,解释器会在文件中的最后一个语句执行之后推出.然而, ...

  3. C++ 获取URL图片、html文件,CInternetSession 【转】

    http://blog.csdn.net/gnixuyil/article/details/7688439 获取网络图片 CString URL="http://www.google.com ...

  4. 关于container_of和list_for_each_entry 及其相关函数的分析

    Linux代码看的比较多了,经常会遇到container_of和list_for_each_entry,特别是 list_for_each_entry比较多,因为Linux经常用到链表,虽然知道这些函 ...

  5. 搭建elsticsearch集群 报错with the same id but is a different node instance解决办法

    搭建elsticsearch集群 报错with the same id but is a different node instance解决办法 学习了:https://blog.csdn.net/q ...

  6. WEB接口测试之Jmeter接口测试自动化 (三)(数据驱动测试) 接口测试与数据驱动

    转载:http://www.cnblogs.com/chengtch/p/6576117.html 1简介 数据驱动测试,即是分离测试逻辑与测试数据,通过如excel表格的形式来保存测试数据,用测试脚 ...

  7. ACdreamoj 1011(树状数组维护字符串hash前缀和)

    题目链接:http://acdream.info/problem? pid=1019 题意:两种操作,第一种将字符串某个位置的字符换为还有一个字符.另外一种查询某个连续子序列是否是回文串: 解法:有两 ...

  8. K-近邻算法的Python实现 : 源代码分析

    网上介绍K-近邻算法的样例非常多.其Python实现版本号基本都是来自于机器学习的入门书籍<机器学习实战>,尽管K-近邻算法本身非常easy,但非常多刚開始学习的人对其Python版本号的 ...

  9. search-a-2d-matrix——二维矩阵找数

    题目描述 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the ...

  10. Android开发之Serializable 和 Parcelable的差别(源码分享)

    android 中自己定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable. 一 序列化原因: 1.永久性保存对象.保存对象的字节序列到本地文件里. 2.通过 ...