Python PhatomJS 和Selenium动态加载页面 获取图片内容

随笔中的代码拷贝自

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\test‘
 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()  #执行类中的方法
时间: 2024-10-17 19:36:57

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

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

自学python爬虫也快半年了,在目前看来,我面临着三个待解决的爬虫技术方面的问题:动态加载,多线程并发抓取,模拟登陆.目前正在不断学习相关知识.下面简单写一下用selenium处理动态加载页面相关的知识.目标——抓取页面所有的高考录取分数信息. 对于动态加载,开始的时候是看到Selenium+Phantomjs的强大,直接就学的这个.打开网页查看网页源码(注意不是检查元素)会发现要爬取的信息并不在源码里面.也就是说,从网页源码无法通过解析得到数据.Selenium+Phantomjs的强大一方

动态加载页面数据的小工具 javascript + jQuery (持续更新)

使用该控件,可以根据url,参数,加载html记录模板(包含json参数对应,以及具体记录位置Index根据参数描述加载对应的属性,并可以根据简单的判断分支加载对应html或者控件)至列表容器内(JQuery选择器字符串)注: 该控件在使用前需引入JQuery框架支持,使用该控件,可极大的减少Ajax列表数据动态加载开发工作的实际工作量. 使用方式: 首先,添加控件引用,并加入Jquery支持 <script src="js/jquery.js"></script&g

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

还是上次的那个网站,就是它.现在尝试用另一种办法——直接请求json文件,来获取要抓取的信息. 第一步,检查元素,看图如下: 过滤出JS文件,并找出包含要抓取信息的js文件,之后就是构造requests请求对象,然后解析json文件啦.源码如下: import requests def save(school_datas): for data in school_datas: # print(data) year = data['year'] province = data['province'

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

原文:http://www.open-open.com/code/view/1446693988935 有些网站的网页内容不是一次性加载完毕的,而是在鼠标向下滚动时动态加载的,这是怎么做到的呢?看下面代码: var loading = false; $(window).scroll(function(){ if((($(window).scrollTop()+$(window).height())+250)>=$(document).height()){ if(loading == false)

局部动态加载页面

不知道各位小伙伴在做前端页面的时候,会不会跟我有一样的经历,整个系统大体上是需要一个整体框架的,只有局部需要不时地刷新.话不多说,以下就是我要实现的效果图. 显然,我用红色边框框起的的地方是整个项目页面都需要有的,而黄色的两个边框的,有些页面采用了同样的样式,有些改变上面黄色边框,有些改变下面黄色边框. 于是,我就想到了用Ajax动态请求其他页面中的内容.这样及不会让index页面的代码内容过多,也可以让几个样式相同的板块统一样式,请求同一页面,省事. 首先呢,我在主页面留了两个空白的div,也

自动化测试selenium + request + 动态加载页面

# demo01from selenium import webdriver from time import sleep bro = webdriver.Chrome(executable_path='/Users/ls/Desktop/爬虫+新工具/chromedriver') bro.get(url='https://www.baidu.com/') text_input=bro.find_element_by_id 'kw') text_input.send_keys('人民币') sl

div动态加载页面

/* /// method 1 var url="<%=basePath%>/qne.do?p=pessegerCountSet"; $.post(url,{id:count},function(h){ document.getElementById("jspid").innerHTML=h; }); */ /*//method 2 $("#divID").load("A.html"); */ /* method

《python解释器源码剖析》第15章--python模块的动态加载机制

15.0 序 在之前的章节中,我们考察的东西都是局限在一个模块(在python中就是module)内.然而现实中,程序不可能只有一个模块,更多情况下一个程序会有多个模块,而模块之间存在着引用和交互,这些引用和交互也是程序的一个重要的组成部分.本章剖析的就是在python中,一个模块是如何加载.并引用另一个模块的功能的.对于一个模块,肯定要先从硬盘加载到内存. 15.1 import前奏曲 我们以一个简单的import为序幕 # a.py import sys 1 0 LOAD_CONST 0 (

python爬虫 selenium+phantomjs动态解析网页,加载页面成功,返回空数据

废话不多说,直接说重点: 刚开始做的时候,代理IP,头部信息池,都已经做好了,使用selenium+phantomjs获取js动态加载后的源码 起初挺好的,能出来动态加载后的源码,但是运行了几次之后,电脑有点卡顿(估计是运存太小),源码就获取不到了,返回的数据 都是空数据,以至于都是出错 在做的时候一定要给页面加载之前做一个延时,以保证页面的正常加载出来,这样我们才能获取导数据 我在加载前后都做了延时等待,当然,我这个就是说这个意思,没必要仿照 可以根据自己的需求进行设置,然后源码就加载出来了,