PYTHON 七月 26, 2019

5.懒加载及自动化测试框架

文章字数 8.1k 阅读约需 7 mins. 阅读次数 1000000


懒加载技术:用的时候再加载


  • 懒加载的要点如下:

    1. 图片进入可视区域之后请求图片资源;

    2. 对于电商等图片较多,页面很长的业务场景很适用;

    3. 可以减少无效资源的加载;

    4. 并发加载的资源过多会阻塞js的加载,影响网站的正常使用;

import urllib.request
import urllib.parse
from lxml import etree
import os
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
    }
def get_request(url,page):
    #1.处理url:url中需要携带页码值(第一页和非第一页的url是不同的)
    if page==1:
        url=format(url%'')
    else:
        pn='_'+str(page)
        url=format(url%pn)
    return urllib.request.Request(url,headers=headers)
def download_images(image_url_list):
    dir_name='性感美女集'
    #在当前目录创建一个文件夹
    if not os.path.exists(dir_name):
        os.mkdir(dir_name)

    for image_url in image_url_list:
        #通过url获取了图片的二进制数据值
        request=urllib.request.Request(image_url,headers=headers)
        image_data=urllib.request.urlopen(request).read()
        image_name=os.path.basename(image_url)
        path=os.path.join(dir_name,image_name)
        with open(path,'wb') as fp:
            fp.write(image_data)

start_page=int(input('enter start page num:'))
end_page=int(input('enter end page num:'))
url='http://sc.chinaz.com/tupian/xingganmeinvtupian%s.html'
for page in range(start_page,end_page+1):
    request=get_request(url,page)#获取一个自定义的请求对象
    response=urllib.request.urlopen(request)
    content=response.read().decode()#获取响应回来的网页源码数据
    tree=etree.HTML(content)
    image_url_list=tree.xpath('//div[@id="container"]//img/@src2')
    download_images(image_url_list)#下载图片

selenium(浏览器自动化测试框架)


chromedriver版本 支持的Chrome版本
v2.41 v67-69
v2.40 v66-68
v2.39 v66-68
v2.38 v65-67
v2.37 v64-66
v2.36 v63-65
v2.35 v62-64
v2.34 v61-63
v2.33 v60-62
v2.32 v59-61
v2.31 v58-60
v2.30 v58-60
v2.29 v56-58
v2.28 v55-57
v2.27 v54-56
v2.26 v53-55
v2.25 v53-55
v2.24 v52-54
v2.23 v51-53
v2.22 v49-52
v2.21 v46-50
v2.20 v43-48
v2.19 v43-47
v2.18 v43-46
v2.17 v42-43
v2.13 v42-45
v2.15 v40-43
v2.14 v39-42
v2.13 v38-41
v2.12 v36-40
v2.11 v36-40
v2.10 v33-36
v2.9 v31-34
v2.8 v30-33
v2.7 v30-33
v2.6 v29-32
v2.5 v29-32
v2.4 v29-32
  • 代码操作
from selenium import webdriver
browser = webdriver.Chrome(path) #path为驱动文件所在路径
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名字查找
    • find_elements_by_css_selector 根据选择器查找
    • find_elements_by_link_text 根据链接内容查找
  • 案例:打开百度,搜索美女,点击某一张图片,关闭浏览器

from selenium import webdriver
import time

# 模拟创建一个浏览器对象,然后通过对象去操作浏览器
path = 'chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)

url = 'http://www.baidu.com/'
#使用浏览器发起指定请求
browser.get(url)
time.sleep(3)

# 查找input输入框
my_input = browser.find_element_by_id('kw')
# 往框里面写文字
my_input.send_keys('美女')
time.sleep(3)

# 查找搜索按钮
button = browser.find_elements_by_class_name('s_btn')[0]
button.click()#点击指定按钮

time.sleep(3)

# 找到指定图片点击
#image = browser.find_elements_by_class_name('op-img-address-link-imgs')[2]
#image.click()
a=browser.find_elements_by_link_text('http://www.baidu.com/link?url=Zx3hGmvjjtOKPqT4FPQhDx-wPTWdM1BMh3tCEYrYKUGMKM67M7vV9LxRU74lo9KJ')[0]
a.click()
time.sleep(3)

# 关闭浏览器,退出浏览器
browser.quit()

PhantomJS(无界面浏览器)自动化框架


from selenium import webdriver
import time
path = r'C:\Users\Administrator\Desktop\爬虫授课\day05\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe'
browser = webdriver.PhantomJS(executable_path=path)

url='https://www.baidu.com'
browser.get(url)
time.sleep(3)
#browser.page_source   #返回当前网址的页面源代码

browser.save_screenshot('./baidu1.png')

my_input = browser.find_element_by_id('kw')
# 往框里面写文字
my_input.send_keys('美女')
time.sleep(3)
browser.save_screenshot('./baidu2.png')

# 查找搜索按钮
button = browser.find_elements_by_class_name('s_btn')[0]
button.click()#点击指定按钮

time.sleep(3)
browser.save_screenshot('./baidu3.png')
# 找到指定图片点击
image = browser.find_elements_by_class_name('op-img-address-link-imgs')[2]
image.click()
time.sleep(3)
browser.save_screenshot('./baidu4.png')
# 关闭浏览器,退出浏览器
browser.quit()
  • selenium+phantomjs 就是爬虫终极解决方案:有些网站上的内容信息是通过动态加载js形成的,所以使用普通爬虫程序无法回去动态加载的js内容。

  • 案例2:下拉滚动条到底部(豆瓣电影下拉)

from selenium import webdriver
import time
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='document.body.scrollTop=2000'
bro.execute_script(js)#该函数可以执行一组字符串形式的js代码
time.sleep(4)
bro.save_screenshot('2.png')
time.sleep(2)


#使用爬虫程序爬去当前url中的内容

bro.quit()

上一篇:
下一篇:
0%