Spider第三天-图片懒加载、selenium和PhantomJS、验证码处理

 一、图片懒加载概念:

    图片懒加载是一种网页优化技术。图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间。为了解决这种问题,通过前后端配合,使图片仅在浏览器当前视窗内出现时才加载该图片,达到减少首屏图片请求数的技术就被称为“图片懒加载”。

网站一般如何实现图片懒加载技术呢?

    在网页源码中,在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案例:

扫描二维码关注公众号,回复: 3415862 查看本文章
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....')

猜你喜欢

转载自blog.csdn.net/qq_17513503/article/details/82872920
今日推荐