网页爬虫抓取百度图片(网站一般如何实现图片懒技术呢?-八维教育)
优采云 发布时间: 2022-03-03 14:05网页爬虫抓取百度图片(网站一般如何实现图片懒技术呢?-八维教育)
关键词:
逆流而上,用力撑着它,一分一毫的懈怠,它就退却了万千搜索。本文章主要介绍了python网络爬虫的图片懒加载技术selenium和PhantomJS相关的知识,希望对大家有所帮助。
一.什么是图片延迟加载?
- 案例研究:抓取站长素材中的图片数据
#!/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[@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 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[@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 的第三方库。外部提供的界面可以操作浏览器,然后让浏览器完成自动操作。
- 环境建设
1.安装硒:pip install selenium
2.获取浏览器驱动(以谷歌浏览器为例)
2.1 谷歌浏览器驱动下载地址:
2.2 下载的驱动必须和浏览器版本一致。可以根据提供的版本映射表进行映射
- 效果展示:可以运行以下代码观看效果
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(‘//*[@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名字查找
三.幻影JS
PhantomJS 是一款非界面浏览器,其自动化操作过程与上述谷歌浏览器的操作一致。由于没有界面,为了能够展示自动化的操作过程,PhantomJS为用户提供了截图功能,使用save_screenshot函数实现。
-案子:
from selenium import webdriver
import time
# phantomjs路径
path = r‘PhantomJS驱动路径‘
browser = webdriver.PhantomJS(path)
# 打开百度
url = ‘http://www.baidu.com/‘
browser.get(url)
time.sleep(3)
browser.save_screenshot(r‘phantomjsaidu.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 webdriver
from time import sleep
import time
if __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-windowsinphantomjs.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中的内容
html_source = bro.page_source # 该属性可以获取当前浏览器的当前页的源码(html)
with open(‘./source.html‘, ‘w‘, encoding=‘utf-8‘) as fp:
fp.write(html_source)
bro.quit()
四.谷歌无头浏览器
由于 PhantomJs 最近已经停止更新和维护,建议大家使用谷歌的无头浏览器,这是一款没有界面的谷歌浏览器。
1 from selenium import webdriver
2 from selenium.webdriver.chrome.options import Options
3 import time
4
5 # 创建一个参数对象,用来控制chrome以无界面模式打开
6 chrome_options = Options()
7 chrome_options.add_argument(‘--headless‘)
8 chrome_options.add_argument(‘--disable-gpu‘)
9 # 驱动路径
10 path = r‘C:UsersBLiDesktop1801day05ziliaochromedriver.exe‘
11
12 # 创建浏览器对象
13 browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)
14
15 # 上网
16 url = ‘http://www.baidu.com/‘
17 browser.get(url)
18 time.sleep(3)
19
20 browser.save_screenshot(‘baidu.png‘)
21
22 browser.quit()
至此,这篇关于Python网络爬虫selenium和PhantomJS的懒加载技术的文章就讲完了。如果您的问题无法解决,请参考以下文章: