一、图片懒加载概念:
图片懒加载是一种网页优化技术。图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间。为了解决这种问题,通过前后端配合,使图片仅在浏览器当前视窗内出现时才加载该图片,达到减少首屏图片请求数的技术就被称为“图片懒加载”。
网站一般如何实现图片懒加载技术呢?
在网页源码中,在img标签中首先会使用一个“伪属性”(通常使用src2,original......)去存放真正的图片链接而并非是直接存放在src属性中。当图片出现到页面的可视化区域中,会动态将伪属性替换成src属性,完成图片的加载。
二、selenium和PhantomJS概念及使用
什么是selenium?
是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作。
- 环境搭建
1.安装selenum:pip install selenium
2.获取某一款浏览器的驱动程序(以谷歌浏览器为例)
2.1 谷歌浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
2.2 下载的驱动程序必须和浏览器的版本统一,大家可以根据http://blog.csdn.net/huilan_same/article/details/51896672中提供的版本映射表进行对应
seleniumTest案例:
from selenium import webdriver
from time import sleep
bro = webdriver.Chrome(r'C:\Users\OldBoy\Desktop\Spider\selenium&PhanmJs\chromedriver.exe')
#打开浏览器发起请求
bro.get('https://www.baidu.com')
sleep(2)
#定位到搜索框
my_text = bro.find_element_by_id('kw')
#向搜索框中输入一个关键字
my_text.send_keys('人民币')
sleep(2)
#定位到搜索按钮
my_button = bro.find_element_by_id('su')
my_button.click()
sleep(5)
#关闭浏览器
bro.quit()
PhantomJS是一款无界面的浏览器,其自动化操作流程和上述操作谷歌浏览器是一致的。由于是无界面的,为了能够展示自动化操作流程,PhantomJS为用户提供了一个截屏的功能,使用save_screenshot函数实现。
PhantomJSTest案例:
from selenium import webdriver
from time import sleep
bro = webdriver.PhantomJS(r'D:\Spider\day03\代码\phantomjs-2.1.1-windows\bin\phantomjs.exe')
bro.get('http://www.baidu.com')
bro.save_screenshot('./首页.jpg') #截屏操作
sleep(2)
#定位到搜索框
my_text = bro.find_element_by_id('kw')
#向搜索框中输入一个关键字
my_text.send_keys('dota2')
bro.save_screenshot('./2.jpg')
sleep(2)
#定位到搜索按钮
my_button = bro.find_element_by_id('su')
my_button.click()
sleep(5)
bro.save_screenshot('./3.jpg')
#关闭浏览器
bro.quit()
豆瓣图片懒加载小案例:
from selenium import webdriver
from time import sleep
bro = webdriver.PhantomJS(r'D:\Spider\day03\代码\phantomjs-2.1.1-windows\bin\phantomjs.exe')
bro.get('https://movie.douban.com/typerank?type_name=%E7%A7%91%E5%B9%BB&type=17&interval_id=100:90&action=')
sleep(3)
bro.save_screenshot('./豆瓣科幻1.png')
js = 'document.body.scrollTop = 5000' #5000表示为向下拖动的像素
bro.execute_script(js) #执行js代码
sleep(3)
#获取页面数据
page_text = bro.page_source
bro.save_screenshot('./豆瓣科幻2.png')
print(page_text)
验证码操作实例:
#下载验证码到本地
import requests
from lxml import etree
import urllib.response #urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应:
s = requests.session()
url = 'https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
page_content = s.get(url,headers=headers).text
tree = etree.HTML(page_content) #对html文本使用 etree.HTML(html)解析,得到Element对象
img_url = tree.xpath('//img[@id="imgCode"]/@src')[0]
print(img_url)
img_url = 'https://so.gushiwen.org' + img_url
#urllib.request.urlretrieve(img_url,'./code.png')
"""
返回的数据类型
response.text 返回的是一个 unicode 型的文本数据
response.content 返回的是 bytes 型的二进制数据
也就是说如果想取文本数据可以通过response.text 如果想取图片,文件,则可以通过 response.content
"""
img_data = s.get(url=img_url,headers=headers).content
with open('./code.png','wb')as fp:
fp.write(img_data)
#解析form表单的令牌数据(反爬手段)
key_1 = tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
key_2 = tree.xpath('//*[@id="__VIEWSTATEGENERATOR"]/@value')[0]
#步骤2:抓包获取登录url
code = input('查看验证码内容:')
post_url = 'https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx'
data = {
"__VIEWSTATE":key_1,
"__VIEWSTATEGENERATOR":key_2,
"from":"http://so.gushiwen.org/user/collect.aspx",
"email":"[email protected]",
"pwd":"123456",
"code":code,
"denglu":"登录"
}
page_content = s.post(url=post_url,headers=headers,data=data).text
with open('./second.html','w',encoding='utf-8') as fp:
fp.write(page_content)
print('over....')