前言
python实现网络爬虫非常简单,只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点,方便以后复习。
申明
本系列所涉及的代码仅用于个人研究与讨论,并不会对网站产生不好影响。
目录结构
这次爬虫实战,采用的库为:selenium
,这次就以那种动态加载的图片网页为目标,本次的网站就是家大业大的百度图片。
再次说明,案例本身并不重要,重要的是如何去使用和分析,另外为了避免侵权之类的问题,我不会放涉及到网站的图片,希望能理解。
写爬虫第一件事情,就是确定目标网页地址。这里,我们的目标是百度图片,因此直接打开百度图片搜索美女
,然后观察它的url:
https://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&dyTabStr=MCwxLDMsMiw0LDUsLDYsOCw3LDk%3D&word=美女
这个链接非常的长,因为它有很多无关的参数,所以我们第一件事情就是化繁为简,大胆的删除一些无关参数(之前讲解过参数形式都是&xxx=value
),得到结果如下:
https://image.baidu.com/search/index?tn=baiduimage&word=美女
另外,观察这个网页,你会发现:随着滚轮往下滚,图片越来越多。这就是动态网页,也是我们常用的requests
库难以处理的场景,这同样告诉我们使用selenium
这个库。
这部分就是中规中矩了,看过前面关于selenium
讲解的应该都可以轻松写出来。
代码如下:
# 请求百度图片
def get_baidu_images():
# 初始化
driver = webdriver.Chrome()
# 网址
base_url = 'https://image.baidu.com/search/index?tn=baiduimage&word='
target = input('请输入想要下载的图片名字:')
url = base_url + target
# 请求
driver.get(url)
本次代码有很多实现思路,我这里想的是:首先,滚轮滚动一定距离,然后获取图片的下载地址,接着询问是否还需要滚动,如果不,则停止加载,开始下载图片,否则继续滚动。
想要实现滚动,需要执行js代码。肯定有些人没有学习过,没关系,虽然我学过的,但是也已经忘得差不多了。
所以,我们直接百度js代码实现滚动条向下滚动
,即可找到js代码如下:
window.scrollBy(0,100)
# 这个是移动多少的距离,即每次移动100像素
那么,可以来写代码了,如下:
#( 接着上面的函数写的 )
# 是否滚动
flag = True
while flag:
# 先让滚动条滚动五次.每次间隔0.5秒,给浏览器一定的加载时间
for i in range(5):
driver.execute_script('window.scrollBy(0,300)')
time.sleep(0.5)
# 询问是否继续滚动
decision = input('是否继续滚动(Y/N):')
if decision == 'N':
flag = False
给大家展示一下运行效果:
可以看出,没有什么问题,那么继续,下一步就是解析网页,获取所有的图片链接。
首先,看下图:
我们可以通过xpath
来解析代码:
//div[@class="imgbox-border"]//img
那么,代码如下:
# (接着上面写)
# 解析
img_list = driver.find_elements(by=By.XPATH,value='//div[@class="imgbox-border"]//img')
href = [img.get_attribute('src') for img in img_list]
# 退出
driver.close()
return href
运行结果如下图所示:
最后一步,就是下载图片,我们可以重新写一个函数来实现。
下载图片很简单,流程就是:
1. 请求图片网址
2. 获取图片源码
3. 将图片以二进制的形式写入文件即可
但是,这里需要注意,不能使用selenium去请求图片,不然你相当于打开了图片所在的网页,并没有真正的打开图片,建议还是使用requests去访问。
代码如下:
# 下载图片
def download_image(url,index):
'''
:param url: 下载图片的链接
:param index: 索引,用于文件名
'''
# 参数
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}
# 请求
response = requests.get(url,headers=headers)
source_code = response.content
# 保存到文件
with open('image'+str(index)+'.jpg','wb') as f:
f.write(source_code)
运行结果如下:
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import requests
# 请求百度图片
def get_baidu_images():
# 初始化
driver = webdriver.Chrome()
# 网址
base_url = 'https://image.baidu.com/search/index?tn=baiduimage&word='
target = input('请输入想要下载的图片名字:')
url = base_url + target
# 请求
driver.get(url)
# 是否滚动
flag = True
while flag:
# 先让滚动条滚动五次.每次间隔0.5秒,给浏览器一定的加载时间
for i in range(5):
driver.execute_script('window.scrollBy(0,300)')
time.sleep(0.5)
# 询问是否继续滚动
decision = input('是否继续滚动(Y/N):')
if decision == 'N':
flag = False
# 解析
img_list = driver.find_elements(by=By.XPATH,value='//div[@class="imgbox-border"]//img')
href = [img.get_attribute('src') for img in img_list]
# 退出
driver.close()
return href
# 下载图片
def download_image(url,index):
'''
:param url: 下载图片的链接
:param index: 索引,用于文件名
'''
# 参数
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}
# 请求
response = requests.get(url,headers=headers)
source_code = response.content
# 保存到文件
with open('image'+str(index)+'.jpg','wb') as f:
f.write(source_code)
if __name__ == '__main__':
url_list = get_baidu_images()
for i,url in enumerate(url_list):
download_image(url,i)
本篇讲解了selenium的主要用途,处理动态网页。另外告诉了大家如何使用selenium执行js代码,还有一点就是如何爬取图片并保存到本地。