Python 网络爬虫:初使用selenium爬取百度图片

初使用selenium爬取百度图片



前言

这周发生了很多悲伤的事情,一时间五味杂陈。不敢让自己停下,怕自己停下就会忍不住悲伤,继续向前走吧,这也许就是旅行的意义。


本文主要是初使用selenium,借助selenium方法来爬取百度的图片,在反爬机制日益增多的今天,像selenium这样的方法会给我们提供极大的便利。

一、selenium是什么?

Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE,Mozilla Firefox,Safari,Google Chrome,Opera等。使用selenium最大的好处就是,我们可以直接拿到经过js渲染过的页面html,这样就省去破译js等难缠的部分。

二、安装配置步骤

1.环境:python 3.8,win 10以及chrome和其对应的chromedriver.exe

chromedriver.exe的下载地址:http://chromedriver.storage.googleapis.com/index.html,进入后选择自己chrome对应的版本下载即可。

而chrome的版本在如下位置可以找到:
在这里插入图片描述
如果找不到chrome对应版本的chromedriver.exe怎么办呢?笔者在刚开始配置的时候也发生了这个问题,这里推荐大家一个小技巧,如果自己的chrome不是最新版本,我们可以直接将其升级到最新版本或者在官网重新下载一个最新版本,这样我们便可以找到对应的chromedriver.exe进行下载。

2.安裝selenium库

代码如下:

 pip install selenium

如果安装失败,请参考我那篇介绍pip命令的文章。如果安装成功,会有类似success的提示。

3.安裝配置chrome

将下载安装好的chromedriver.exe放入机chrome浏览器文件路径里,如:
在这里插入图片描述
注:找不到本机chrome的位置的,直接选择你桌面的chrome图标,单机右键,打开文件所在位置即可。

4.配置环境变量

设置系统环境变量,将chrome的路径添加到Path中(具体步骤如下图)。
在这里插入图片描述

5.测试是否可用

代码如下(示例):

from selenium import webdriver
 
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
 
driver.get(url)
driver.close()

如果成功会自动调起chrome浏览器,并访问百度。

三、分析编写代码

1.分析

正常我们打开百度搜索图片的正确方式应该是:百度导航—>输入关键词—》点击查找—》点击所有图片
例如:
在这里插入图片描述
在得知正常访问图片的顺序后,那么我们就用selenium模拟以上的访问过程。在访问前,我们先确定以下几个方面:

(1)搜索框

在这里插入图片描述

(2)点击百度一下按钮

在这里插入图片描述

(3)点击美女图片

在这里插入图片描述

2.代码实现

(1)访问代码

代码如下:

	from selenium import webdriver
	import time
	
    # 控制chrome浏览器
    driver = webdriver.Chrome()
    #窗口最大化
    driver.maximize_window()
    # 输入网址
    driver.get("https://www.baidu.com/")
    # 找到文本框,输入文字
    driver.find_element_by_xpath('//*[@id="kw"]').send_keys("迪迦奥特曼图片")
    #找到按钮,单击
    driver.find_element_by_xpath('//*[@id="su"]').click()
    #停一下,等待加载完毕
    time.sleep(2)

    #找到a标签,单击
    driver.find_element_by_xpath('//*[@id="1"]/h3/a').click()
    #停一下,等待加载完毕
    time.sleep(2)

这样我们便简单的实现了这个访问的过程,但还是有个小问题,那就是虽然打开了两个页面,但我们现在其实还停留在第一个页面上,因此我们需要切换一下窗口:

	#切换窗口,因为现在打开了一个窗口,目前还是在第1个窗口中
	driver.switch_to.window(driver.window_handles[1])

(2)鼠标滑动向下浏览

因为百度图片是异步加载,再用鼠标往下不断滑动的过程中,不断地增加图片,下面我们用Selenium+python自动化之js屏幕滑动,来模拟模拟人为鼠标滑轮滚动屏幕:

	scroll="document.documentElement.scrollTop=800"#垂直滚动 px
	scroll = "document.documentElement.scrollLeft=1000"#水平滚动
	scroll="window.scrollTo(0,10000)"#滚动到指定坐标
	scroll="window.scrollBy(0,100)"#滑动到相对坐标
	scroll="window.scrollTo(0,document.body.scrollHeight)"#获取body的高度,滑到底部
	document.body.scrollWidth 获取body宽度
	driver.execute_script(scroll)

在这里,笔者使用的是鼠标滑动到指定的坐标,这里已经提前验证过:

	window.scrollTo(0,10000)

在这里,我们选择滑动10次:

    for i in range(10):
        #执行js
        driver.execute_script("window.scrollTo(0,10000)")
        time.sleep(1)

(3)该部分完整代码

	from selenium import webdriver
	from lxml import etree
	import os
	import time
	import requests
	import re
	import random
	
	headers = {
	    "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
	}
	
	#创建文件夹
	if not os.path.exists("./files/baidu"):
	    os.makedirs("./files/baidu")
	
	def get_html():
	    # 控制chrome浏览器
	    driver = webdriver.Chrome()
	    #窗口最大化
	    driver.maximize_window()
	    # 输入网址
	    driver.get("https://www.baidu.com/")
	    # 找到文本框,输入文字
	    driver.find_element_by_xpath('//*[@id="kw"]').send_keys("哆啦a梦图片")
	    #找到按钮,单击
	    driver.find_element_by_xpath('//*[@id="su"]').click()
	    #停一下,等待加载完毕
	    time.sleep(2)
	
	    #找到a标签,单击
	    driver.find_element_by_xpath('//*[@id="1"]/h3/a').click()
	    #停一下,等待加载完毕
	    time.sleep(2)
	    #切换窗口,因为现在打开了一个窗口,目前还是在第1个窗口中
	    driver.switch_to.window(driver.window_handles[1])
	    for i in range(10):
	        #执行js
	        driver.execute_script("window.scrollTo(0,10000)")
	        time.sleep(1)
	    #获取页面html
	    html = driver.page_source
	    # 关闭
	    driver.quit()
	    #保存html
    	with open(f"./files/baidu.html", "w", encoding="utf-8") as file:
	        file.write(html)
	
	    return html
	
	if __name__ == '__main__':
	    get_html()

这样我们便得到了整个页面的html,下面我们只需要分析html,提取出我们想要的图片url即可。

2.提取图片链接

(1)分析html页面

我们通过对html的分析不难发现,图片的url主要都是以下几种:

data-imgurl="https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2709465685,1833449660&fm=11&gp=0.jpg"
data-objurl="https://gss0.baidu.com/70cFfyinKgQFm2e88IuM_a/forum/w=580/sign=3ab3bea0ea50352ab16125006343fb1a/4d3fbdf082025aafa44fcfdcf8edab64034f1a50.jpg" 	

我们访问以下试试:
在这里插入图片描述
在这里插入图片描述
这的确是我们需要的图片url,下面便开始提取,这里采用的是正则提起,如果正则不熟悉,使用bs,xpath都行。

(2)提取图片url

    #读数据
    with open(f"./files/baidu.html", "r", encoding="utf-8") as file:
        html = file.read()
    #通过正则获取img url
    img_list1 = re.findall(r'data-objurl="(.*?)"', html)
    img_list2 = re.findall(r'data-imgurl="(.*?)"', html)
    #合并
    img_list1.extend(img_list2)
    print(img_list2)

(3)下载图片

    for img_url in  img_list2:
        rr = requests.get(url=img_url.replace("amp;",""),headers=headers)
        rr.encoding = rr.apparent_encoding  # 修改编码
        img_name = "./files/baidu/{}".format(img_url.split("/")[-1])
        with open(img_name, 'wb') as file:
            file.write(rr.content)

3.完整代码

from selenium import webdriver
from lxml import etree
import os
import time
import requests
import re



headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}

# 创建文件夹
if not os.path.exists("./files/baidu"):
    os.makedirs("./files/baidu")


def get_html():
    # 控制chrome浏览器
    driver = webdriver.Chrome()
    # 窗口最大化
    driver.maximize_window()
    # 输入网址
    driver.get("https://www.baidu.com/")
    # 找到文本框,输入文字
    driver.find_element_by_xpath('//*[@id="kw"]').send_keys("美丽小姐姐")
    # 找到按钮,单击
    driver.find_element_by_xpath('//*[@id="su"]').click()
    # 停一下,等待加载完毕
    time.sleep(2)

    # 找到a标签,单击
    driver.find_element_by_xpath('//*[@id="1"]/h3/a').click()
    # 停一下,等待加载完毕
    time.sleep(2)
    # 切换窗口,因为现在打开了一个窗口,目前还是在第1个窗口中
    driver.switch_to.window(driver.window_handles[1])
    for i in range(10):
        # 执行js
        driver.execute_script("window.scrollTo(0,10000)")
        time.sleep(1)
    # 获取页面html
    html = driver.page_source
    # 关闭
    driver.quit()
    # 保存html
    with open(f"./files/baidu.html", "w", encoding="utf-8") as file:
        file.write(html)

    return html

def get_data():
    with open("./files/baidu.html", "r", encoding="utf-8") as file:
        html = file.read()

    #通过正则获取img url
    img_list1 = re.findall(r'data-objurl="(.*?)"', html)
    img_list2 = re.findall(r'data-imgurl="(.*?)"', html)
    print(len(img_list1))
    print(len(img_list2))

    # 合并
    img_list1.extend(img_list2)

    for img_url in  img_list2:
        rr = requests.get(url=img_url.replace("amp;",""),headers=headers)
        rr.encoding = rr.apparent_encoding  # 修改编码
        img_name = "./files/baidu/{}".format(img_url.split("/")[-1])
        with open(img_name, 'wb') as file:
            file.write(rr.content)

if __name__ == '__main__':
    get_html()
    get_data()

效果如下:
在这里插入图片描述


总结

这样便实现的使用selenium自动化的办法爬取了百度图片,以上是笔者对selenium方法的简单使用,更多深入的操作设置有待于我们继续学习。如果哪里有写误或没写清楚的地方,欢迎大家指正,相互学习,天天进步!共勉。

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值