1、图片懒加载html
图片懒加载概念:web
图片懒加载是一种网页优化技术。图片做为一种网络资源,在被请求时也与普通静态资源同样,将占用网络资源,而一次性将整个页面的全部图片加载完,将大大增长页面的首屏加载时间。为了解决这种问题,经过先后端配合,使图片仅在浏览器当前视窗内出现时才加载该图片,达到减小首屏图片请求数的技术就被称为“图片懒加载”。chrome
网站通常如何实现图片懒加载技术呢?windows
在网页源码中,在img标签中首先会使用一个“伪属性”(一般使用src2,original......)去存放真正的图片连接而并不是是直接存放在src属性中。当图片出现到页面的可视化区域中,会动态将伪属性替换成src属性,完成图片的加载。后端
二.seleniumapi
什么是selenium? 是Python的一个第三方库,对外提供的接口能够操做浏览器,而后让浏览器完成自动化的操做。 环境搭建 安装selenum:pip install selenium 获取某一款浏览器的驱动程序(以谷歌浏览器为例) 谷歌浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html 下载的驱动程序必须和浏览器的版本统一,你们能够根据http://blog.csdn.net/huilan_same/article/details/51896672中提供的版本映射表进行对应
#导包 from selenium import webdriver #建立浏览器对象,经过该对象能够操做浏览器 browser = webdriver.Chrome('驱动路径') #使用浏览器发起指定请求 browser.get(url) #使用下面的方法,查找指定的元素进行操做便可 find_element_by_id 根据id找节点 find_elements_by_name 根据name找 find_elements_by_xpath 根据xpath查找 find_elements_by_tag_name 根据标签名找 find_elements_by_class_name 根据class名字查找
from selenium import webdriver import time #1.建立一个浏览器对象 bro = webdriver.Chrome(executable_path=r"C:\Users\Administrator\Desktop\爬虫02\chromedriver.exe") #2.打开浏览器 url = 'https://www.baidu.com/' bro.get(url=url) time.sleep(3) #3.调用seleniem提供的接口 #找到了指定搜索框 myInput = bro.find_element_by_id("kw") #在对应的搜索框中录入指定的词条 myInput.send_keys("人民币") time.sleep(5) #定位到搜索按钮 myButton = bro.find_element_by_id('su') myButton.click() time.sleep(5) #关闭浏览器 bro.quit()
三.phantomJs浏览器
from selenium import webdriver import time # 1.建立一个浏览器对象 # bro = webdriver.Chrome(executable_path=r"C:\Users\Administrator\Desktop\爬虫02\chromedriver.exe") bro = webdriver.PhantomJS(executable_path=r"F:\Python自动化21期\3.Django&项目\phantomjs-2.1.1-windows\bin\phantomjs.exe") # 2.打开浏览器 url = 'https://www.baidu.com/' bro.get(url=url) time.sleep(3) # 截图 bro.save_screenshot('./1.png') # 3.调用seleniem提供的接口 # 找到了指定搜索框 myInput = bro.find_element_by_id("kw") # 在对应的搜索框中录入指定的词条 myInput.send_keys("人民币") time.sleep(5) bro.save_screenshot('./2.png') # 定位到搜索按钮 myButton = bro.find_element_by_id('su') myButton.click() time.sleep(5) bro.save_screenshot('./3.png') # 关闭浏览器 bro.quit()
重点:selenium+phantomjs 就是爬虫终极解决方案:有些网站上的内容信息是经过动态加载js造成的,因此使用普通爬虫程序没法回去动态加载的js内容。例如豆瓣电影中的电影信息是经过下拉操做动态加载更多的电影信息。网络
综合操做:需求是尽量多的爬取豆瓣网中的电影信息less
from selenium import webdriver from time import sleep import time if __name__ == '__main__': url = 'https://movie.douban.com/typerank?type_name=%E6%81%90%E6%80%96&type=20&interval_id=100:90&action=' # 发起请求前,可让url表示的页面动态加载出更多的数据 path = r'C:\Users\Administrator\Desktop\爬虫授课\day05\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe' # 建立无界面的浏览器对象 bro = webdriver.PhantomJS(path) # 发起url请求 bro.get(url) time.sleep(3) # 截图 bro.save_screenshot('1.png') # 执行js代码(让滚动条向下偏移n个像素(做用:动态加载了更多的电影信息)) js = 'window.scrollTo(0,document.body.scrollHeight)' bro.execute_script(js) # 该函数能够执行一组字符串形式的js代码 time.sleep(2) bro.execute_script(js) # 该函数能够执行一组字符串形式的js代码 time.sleep(2) bro.save_screenshot('2.png') time.sleep(2) # 使用爬虫程序爬去当前url中的内容 html_source = bro.page_source # 该属性能够获取当前浏览器的当前页的源码(html) with open('./source.html', 'w', encoding='utf-8') as fp: fp.write(html_source) bro.quit()
#需求:梨视频中爬取更多的视频数据(动态加载)
#需求:爬取更多的视频数据(动态加载) import requests from selenium import webdriver from lxml import etree import re #1.建立一个无头浏览器 bro = webdriver.PhantomJS(executable_path=r"F:\Python自动化21期\3.Django&项目\phantomjs-2.1.1-windows\bin\phantomjs.exe") #2.根据指定的url打开浏览器 bro.get(url="http://www.pearvideo.com/category_6") #3.滚轮向下拖动,加载出更多的视频数据(执行js代码) js = "window.scrollTo(0,document.body.scrollHeight)" bro.execute_script(js) #让浏览器执行一组js代码 #4.获取页面源码数据,进行解析操做 page_text = bro.page_source#该属性能够得到当前浏览器对应的页面数据 #使用xpath进行解析操做 tree = etree.HTML(page_text) li_list = tree.xpath('//li[@class="categoryem"]') headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' } for li in li_list: secondPage_url = "http://www.pearvideo.com/"+li.xpath('./div/a/@href')[0]#./div 点表示定位到当前,必定要加 #对上述url发起请求,获取二级页面的页面数据 page_text = requests.get(url=secondPage_url,headers=headers).text#获取的图片路径 video_url = re.findall('srcUrl="(.*?)",',page_text,re.S)[0] #S将整个页面源码当作一个字符串,正则做用于一整个大字符串! srcUrl中内容是想要数据,能够加一个括号进行分组! videoData = requests.get(url=video_url,headers=headers).content fileName = video_url.split('/')[-1] with open(fileName,'wb') as fp: fp.write(videoData) print(fileName+'已经被下载完毕')
四.谷歌无头浏览器ide
from selenium import webdriver from selenium.webdriver.chrome.options import Options import time # 建立一个参数对象,用来控制chrome以无界面模式打开 chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') # 驱动路径 path = r'F:\selenium周末精品班\安装包\chromedriver.exe' # 建立浏览器对象 browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options) # 上网 url = 'http://www.baidu.com/' browser.get(url) time.sleep(3) browser.save_screenshot('baidu.png') browser.quit()
图片懒加载-倒数第四行多了一个'图片懒加载--本身练习!src2小结:selenium中注意page_source属性 #获取页面源码数据,进行解析操做 page_text = bro.page_source#该属性能够得到当前浏览器对应的页面数据# 建立无头的谷歌浏览器对象 browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)