网页爬虫抓取百度图片(网站一般如何实现图片懒技术呢?-八维教育)

优采云 发布时间: 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的懒加载技术的文章就讲完了。如果您的问题无法解决,请参考以下文章:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线