懒加载技术:用的时候再加载
懒加载的要点如下:
- 图片进入可视区域之后请求图片资源;
- 对于电商等图片较多,页面很长的业务场景很适用;
- 可以减少无效资源的加载;
- 并发加载的资源过多会阻塞js的加载,影响网站的正常使用;
常见的图片懒加载形式:
- src == src2
- 案例:http://sc.chinaz.com/tupian/xingganmeinvtupian.html 获取图片,保存本地
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(浏览器自动化测试框架)
- selenium是什么?
是一个Python的一个第三方库,对外提供的接口可以操作你的浏览器,然后让浏览器完成自动化的操作 使用selenium
- 安装:pip install selenium
- 操作谷歌浏览器,首先必须有谷歌浏览器的一个驱动
除了谷歌,该模块也支持其他的一些主流浏览器,比如IE,Firefox等,但是需要对应的驱动
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(无界面浏览器)自动化框架
- 用法参照selenium
- PhantomJS官方下载地址
- 案例1:
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)