zoukankan      html  css  js  c++  java
  • Python PhatomJS 和Selenium动态加载页面 获取图片内容

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

    随笔中的代码拷贝自

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

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

      1 from selenium import webdriver
      2 import requests
      3 from bs4 import BeautifulSoup
      4 import os
      5 import time
      6 #定义函数时,尽量写上默认参数,字符='',数字=0,特殊对象也要定义默认值,这样就可以简单的通过.来得到参数具有的性质等。
      7 class BeautifulPicture():
      8     def __init__(self):
      9         # 给请求指定一个请求头来模拟chrome浏览器
     10         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'}
     11         self.web_url='https://unsplash.com'
     12         self.folder_path=r'E:Python Code	est'
     13 
     14     def request(self,url):#返回网页的response
     15         r=requests.get(url)#获得目标网址的response对象
     16         return r
     17 
     18     def mkdir(self,path=''):#创建文件夹
     19         path=path.strip()#删除空白字符
     20         isExists=os.path.exists(path)#判断路径是否存在
     21         if not isExists:#如果不存在,则创建文件夹
     22             print('创建名字叫做',path,'的文件夹')
     23             os.makedirs(path)#创建目标文件夹
     24             print('创建成功')
     25             return True#文件夹不存在返回True
     26         else:#如果存在,返回
     27             print(path,'文件夹已经存在了,不再创建了')
     28             return False
     29 
     30     def scroll_down(self,driver=webdriver.PhantomJS(),times=1):#模拟下拉操作
     31         for i in range(times):
     32             print('开始执行第',str(i+1),'次下拉操作')
     33             driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')#执行js代码操作,页面滚动到指定位置(x,y)
     34             print('',str(i+1),'次下拉操作执行完毕')
     35             print("", str(i + 1), "次等待网页加载......")
     36             time.sleep(20)
     37 
     38     def get_files(self,path=''):
     39         pic_names=os.listdir(path)#获取目录中的内容
     40         return pic_names
     41 
     42     def save_img(self,url,file_name):
     43         print('开始请求图片地址,过程比较长。。。')
     44         img=self.request(url)#img是个response对象
     45         print('开始保存图片')
     46         f=open(file_name,'ab')
     47 
     48         # rU或Ua以只读方式打开
     49         # w 以写方式打开
     50         # a 以追加模式打开
     51         # r+ 以读写方式打开
     52         # w+ 读写
     53         # a+ 读写
     54         # rb 二进制读
     55         # wb 二进制写 ab 二进制追加 rb+ 二进制读写 wb+二进制读写 ab+二进制读写
     56         #
     57         f.write(img.content)
     58         #如果想获取文本,可以通过response.text,如果想获取图片、文件,可以通过response.content。
     59         # resp.text返回的是Unicode型的数据。
     60         # resp.content返回的是bytes型也就是二进制的数据。
     61         print(file_name,'图片保存成功')
     62         f.close()
     63 
     64 
     65     def get_pic(self):
     66         print('开始网页请求')
     67         #使用selenium通过PhantomJS来进行网络请求
     68         driver=webdriver.PhantomJS()
     69         driver.get(self.web_url)#这里就不再通过urllib进行网络请求了
     70         self.scroll_down(driver=driver,times=5)#下拉5次,可以自己设定
     71         print('开始获取所有a标签')
     72         #获取网页中class为cV68d的所有a标签
     73         all_a=BeautifulSoup(driver.page_source,'lxml').find_all('a',class_='cV68d')
     74         #按照css类名搜索tag的功能非常实用,但标识css类名的关键字class在Python中是保留字,实用class做参数会导致语法错误。同BS4.1.1版本开始,通过class_参数搜索。
     75         print('开始创建文件夹')
     76         is_new_folder=self.mkdir(self.folder_path)
     77         print('开始切换文件夹')
     78         os.chdir(self.folder_path)#改变当前工作路径,.gwd()为获取当前工作目录
     79 
     80         print('a标签的数量是:',len(all_a))
     81         file_names=self.get_files(self.folder_path)#获取当前工作目录下的文件名?干吗用?
     82 
     83         for a in all_a:
     84             img_str=a['style']
     85             print('a标签的style内容是:',img_str)
     86             first_pos=img_str.index('(')+1
     87             second_pos=img_str.index(')')
     88             img_url=img_str[first_pos:second_pos]
     89 
     90             # 注:为了尽快看到下拉加载的效果,截取高度和宽度部分暂时注释掉,因为图片较大,请求时间较长。
     91             # 获取高度和宽度的字符在字符串中的位置
     92             # width_pos = img_url.index('&w=')
     93             # height_pos = img_url.index('&q=')
     94             # width_height_str = img_url[width_pos : height_pos] #使用切片功能截取高度和宽度参数,后面用来将该参数替换掉
     95             # print('高度和宽度数据字符串是:', width_height_str)
     96             # img_url_final = img_url.replace(width_height_str, '')  #把高度和宽度的字符串替换成空字符
     97             # print('截取后的图片的url是:', img_url_final)
     98 
     99             # 截取url中参数前面、网址后面的字符串为图片名
    100             name_start_pos=img_url.index('.com/')+5
    101             name_end_pos=img_url.index('?')
    102             img_name=img_url[name_start_pos:name_end_pos]+'.jpg'
    103             img_name=img_name.replace('/','')
    104 
    105             if is_new_folder:#如果文件夹不存在,那么肯定没有重复文件,则直接保存文件。
    106                 self.save_img(img_url,img_name)
    107             else:
    108                 if img_name not in file_names:#如果文件夹存在,需要判断是否有重复文件
    109                     self.save_img(img_url, img_name)  # 调用save_img方法来保存图片
    110                 else:
    111                     print("该图片已经存在:", img_name, ",不再重新下载。")
    112 
    113 
    114 beauty = BeautifulPicture()  #创建类的实例
    115 beauty.get_pic()  #执行类中的方法
  • 相关阅读:
    质心坐标(barycentric coordinates)及其应用
    用表存储代替递归算法
    Lua学习之加载其他lua文件
    Mac 端配置 Lua 环境
    聊聊二手房交易遇到的恶心事
    Mac安装Python3后,如何将默认执行的Python2改为Pyhton3
    Mac平台下部署UE4工程到iOS设备的流程
    计算椭圆运动轨迹的算法
    OpenGL中的渲染方式—— GL_TRIANGLE_STRIP
    XDRender_ShaderMode_StandardPBR 间接光照(2)-镜面反射部分(1)
  • 原文地址:https://www.cnblogs.com/xingzhui/p/6623419.html
Copyright © 2011-2022 走看看