赞
踩
这周发生了很多悲伤的事情,一时间五味杂陈。不敢让自己停下,怕自己停下就会忍不住悲伤,继续向前走吧,这也许就是旅行的意义。
本文主要是初使用selenium,借助selenium方法来爬取百度的图片,在反爬机制日益增多的今天,像selenium这样的方法会给我们提供极大的便利。
Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE,Mozilla Firefox,Safari,Google Chrome,Opera等。使用selenium最大的好处就是,我们可以直接拿到经过js渲染过的页面html,这样就省去破译js等难缠的部分。
chromedriver.exe的下载地址:http://chromedriver.storage.googleapis.com/index.html,进入后选择自己chrome对应的版本下载即可。
而chrome的版本在如下位置可以找到:
如果找不到chrome对应版本的chromedriver.exe怎么办呢?笔者在刚开始配置的时候也发生了这个问题,这里推荐大家一个小技巧,如果自己的chrome不是最新版本,我们可以直接将其升级到最新版本或者在官网重新下载一个最新版本,这样我们便可以找到对应的chromedriver.exe进行下载。
代码如下:
pip install selenium
如果安装失败,请参考我那篇介绍pip命令的文章。如果安装成功,会有类似success的提示。
将下载安装好的chromedriver.exe放入机chrome浏览器文件路径里,如:
注:找不到本机chrome的位置的,直接选择你桌面的chrome图标,单机右键,打开文件所在位置即可。
设置系统环境变量,将chrome的路径添加到Path中(具体步骤如下图)。
代码如下(示例):
from selenium import webdriver
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
driver.close()
如果成功会自动调起chrome浏览器,并访问百度。
正常我们打开百度搜索图片的正确方式应该是:百度导航—>输入关键词—》点击查找—》点击所有图片
例如:
在得知正常访问图片的顺序后,那么我们就用selenium模拟以上的访问过程。在访问前,我们先确定以下几个方面:
代码如下:
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])
因为百度图片是异步加载,再用鼠标往下不断滑动的过程中,不断地增加图片,下面我们用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)
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即可。
我们通过对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都行。
#读数据
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)
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)
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方法的简单使用,更多深入的操作设置有待于我们继续学习。如果哪里有写误或没写清楚的地方,欢迎大家指正,相互学习,天天进步!共勉。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。