案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import etree if __name__ == "__main__": url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #获取页面文本数据 response = requests.get(url=url,headers=headers) response.encoding = 'utf-8' page_text = response.text #解析页面数据(获取页面中的图片链接) #创建etree对象 tree = etree.HTML(page_text) div_list = tree.xpath('//div[@>) #解析获取图片地址和图片的名称 for div in div_list: image_url = div.xpath('.//img/@src') image_name = div.xpath('.//img/@alt') print(image_url) #打印图片链接 print(image_name)#打印图片名称
运行结果观察发现,我们可以获取图片的名称,但是链接获取的为空,检查后发现xpath表达式也没有问题,究其原因出现在哪里呢?
图片懒加载概念:
图片懒加载是一种网页优化技术.图片作为一种网络资源,在被请求是也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完成,将大大增加页面的首屏加载时间,为了解决这种问题,通过前后点配合,使图片尽在浏览器当前可视窗口进行显示,达到减少首屏图片请求数的技术就被成为"图片懒加载".
网站一般如何实现图片懒加载技术呢?
在网页源码中,在img标签中设置一个伪属性,去存放正式的图片链接而并非直接存放在src属性中,当图片出现到页面的可视化区域中,会动态将伪属性替换层src属性,完成如片加载.
站长素材案例后续 分析:通过细致观察页面后,网页中的图片链接是存在了src2这样一个伪属性中:
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import etree if __name__ == "__main__": url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #获取页面文本数据 response = requests.get(url=url,headers=headers) response.encoding = 'utf-8' page_text = response.text #解析页面数据(获取页面中的图片链接) #创建etree对象 tree = etree.HTML(page_text) div_list = tree.xpath('//div[@>) #解析获取图片地址和图片的名称 for div in div_list: image_url = div.xpath('.//img/@src'2) #src2伪属性 image_name = div.xpath('.//img/@alt') print(image_url) #打印图片链接 print(image_name)#打印图片名称
什么是selenium:
是一个python的第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化操作.
python环境搭建
安装selenium:pip install selenium
获取某一款浏览器的驱动程序(以谷歌浏览器为例)
谷歌浏览器驱动下载地址: http://chromedriver.storage.googleapis.com/index.html
下载的驱动程序必须和浏览器的版本统一,大家可以根据:http://blog.csdn.net/huilan_same/article/details/51896672中提供的版本映射表进行对应
效果展示:
from selenium import webdriver from time import sleep # 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的 driver = webdriver.Chrome(r'驱动程序路径') # 用get打开百度页面 driver.get("http://www.baidu.com") # 查找页面的“设置”选项,并进行点击 driver.find_elements_by_link_text('设置')[0].click() sleep(2) # # 打开设置后找到“搜索设置”选项,设置为每页显示50条 driver.find_elements_by_link_text('搜索设置')[0].click() sleep(2) # 选中每页显示50条 m = driver.find_element_by_id('nr') sleep(2) m.find_element_by_xpath('//*[@>).click() m.find_element_by_xpath('.//option[3]').click() sleep(2) # 点击保存设置 driver.find_elements_by_class_name("prefpanelgo")[0].click() sleep(2) # 处理弹出的警告页面 确定accept() 和 取消dismiss() driver.switch_to_alert().accept() sleep(2) # 找到百度的输入框,并输入 美女 driver.find_element_by_id('kw').send_keys('美女') sleep(2) # 点击搜索按钮 driver.find_element_by_id('su').click() sleep(2) # 在打开的页面中找到“Selenium - 开源中国社区”,并打开这个页面 driver.find_elements_by_link_text('美女_百度图片')[0].click() sleep(3) # 关闭浏览器 driver.quit()
百度页面
本文链接:http://task.lmcjl.com/news/6706.html