什么是图片懒加载?
#!/usr/bin/env python# -*- coding:utf-8 -*-import requestsfrom lxml import etreeif __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[@id="container"]/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标签中首先会使用一个“伪属性”(通常使用src2,original......)去存放真正的图片链接而并非是直接存放在src属性中。当图片出现到页面的可视化区域中,会动态将伪属性替换成src属性,完成图片的加载。
通过细致观察页面的结构后发现,网页中图片的链接是存储在了src2这个伪属性中
#!/usr/bin/env python# -*- coding:utf-8 -*-import requestsfrom lxml import etreeif __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[@id="container"]/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)#打印图片名称
是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作。
环境搭建
安装selenum:pip install selenium
获取某一款浏览器的驱动程序(以谷歌浏览器为例)
谷歌浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
下载的驱动程序必须和浏览器的版本统一,大家可以根据http://blog.csdn.net/huilan_same/article/details/51896672中提供的版本映射表进行对应
效果展示:
from selenium import webdriverfrom 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(‘//*[@id="nr"]/option[3]‘).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()
代码介绍 :
导包:
from selenium import webdriver
创建浏览器对象, 通过该对象可以操作浏览器
browser = webdriver.Chrome(‘驱动路径‘)
使用浏览器发起指定请求
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名字查找
from selenium import webdriverimport time# phantomjs路径path = r‘PhantomJS驱动路径‘browser = webdriver.PhantomJS(path)# 打开百度url = ‘http://www.baidu.com/‘browser.get(url)time.sleep(3)browser.save_screenshot(r‘phantomjsbaidu.png‘)# 查找input输入框my_input = browser.find_element_by_id(‘kw‘)# 往框里面写文字my_input.send_keys(‘美女‘)time.sleep(3)#截屏browser.save_screenshot(r‘phantomjsmeinv.png‘)# 查找搜索按钮button = browser.find_elements_by_class_name(‘s_btn‘)[0]button.click()time.sleep(3)browser.save_screenshot(r‘phantomjsshow.png‘)time.sleep(3)browser.quit()
重点:
selenium+phantomjs 就是爬虫终极解决方案:有些网站上的内容信息是通过动态加载js形成的,所以使用普通爬虫程序无法回去动态加载的js内容。例如豆瓣电影中的电影信息是通过下拉操作动态加载更多的电影信息。
综合操作:需求是尽可能多的爬取豆瓣网中的电影信息
from selenium import webdriverfrom time import sleepimport timeif __name__ == ‘__main__‘: 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:UsersAdministratorDesktop爬虫授课day05ziliaophantomjs-2.1.1-windowsbinphantomjs.exe‘ # 创建无界面的浏览器对象 bro = webdriver.PhantomJS(path) # 发起url请求 bro.get(url) time.sleep(3) # 截图 bro.save_screenshot(‘1.png‘) # 执行js代码(让滚动条向下偏移n个像素(作用:动态加载了更多的电影信息)) js = ‘window.scrollTo(0,document.body.scrollHeight)‘ bro.execute_script(js) # 该函数可以执行一组字符串形式的js代码 time.sleep(2) bro.execute_script(js) # 该函数可以执行一组字符串形式的js代码 time.sleep(2) bro.save_screenshot(‘2.png‘) time.sleep(2) # 使用爬虫程序爬去当前url中的内容 html_source = bro.page_source # 该属性可以获取当前浏览器的当前页的源码(html) with open(‘./source.html‘, ‘w‘, encoding=‘utf-8‘) as fp: fp.write(html_source) bro.quit()
from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsimport time # 创建一个参数对象,用来控制chrome以无界面模式打开chrome_options = Options() chrome_options.add_argument(‘--headless‘) chrome_options.add_argument(‘--disable-gpu‘) # 驱动路径path = r‘C:UsersZBLiDesktop1801day05ziliaochromedriver.exe‘ # 创建浏览器对象browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options) # 上网url = ‘http://www.baidu.com/‘browser.get(url)time.sleep(3) browser.save_screenshot(‘baidu.png‘) browser.quit()