利用selenium与etree抓取必应图片
文章目录
一、导入库
import time
from lxml import etree
import requests
from fake_useragent import UserAgent
from selenium import webdriver
from selenium.webdriver.edge.options import Options
二、selenium模拟网页滚动
options = Options()
options.add_argument('--headless')
driver = webdriver.Edge(options=options) # 不打开浏览器界面,在内存中加载网页
driver.get(url)
roll = 1000
while True:
html_before = driver.execute_script('return document.documentElement.scrollTop')
time.sleep(1)
driver.execute_script(f'window.scrollTo(0,{roll})')
time.sleep(1)
html_after = driver.execute_script('return document.documentElement.scrollTop')
roll += 2000
print(html_after, html_before)
if html_before == html_after:
break
# 模拟浏览器网页滚动,当下次滚动下界面像素值等于滚动前的值时,结束模拟网页滚动
每隔1秒滚动2000像素,直到网页滚动到底
实现代码参考自官方文档
三、etree解析selenium保存的网页内容
text = driver.page_source # 保存网页内容到text
etree_html = etree.HTML(text)
img_url = etree_html.xpath('//img/@src') # 利用etree解析保存网页内容中的图片网址
四、遍历img_url筛选出可访问的url
for i in range(0, len(img_url)):
if i == 200:
# 设定的保存数量,图片资源达到200时自动结束循环
break
if img_url[i].startswith('http'): # 筛选可以访问的图片网址,部分图片网址不可访问
print(img_url[i])
Url = img_url[i]
string.startswith()
用于检测img_url列表中的每个元素是否以http开头
五、图片的下载
img_name = 'picture\\' + name + '{}.jpg'.format(number) # 图片保存到本地
with open(img_name, 'wb') as save_img:
save_img.write(img)
将图片保存到picture文件夹
六、完整代码
import time
from lxml import etree
import requests
from fake_useragent import UserAgent
from selenium import webdriver
from selenium.webdriver.edge.options import Options
def picture_download():
print("请输入要抓取的图片名称:")
name = input() # 输入要抓取的图片类型
url = 'https://cn.bing.com/images/search?q=' + name + '&first=1' # 图片url的网址来源
options = Options()
options.add_argument('--headless')
driver = webdriver.Edge(options=options) # 不打开浏览器界面,在内存中加载网页
driver.get(url)
roll = 1000
while True:
html_before = driver.execute_script('return document.documentElement.scrollTop')
time.sleep(1)
driver.execute_script(f'window.scrollTo(0,{roll})')
time.sleep(1)
html_after = driver.execute_script('return document.documentElement.scrollTop')
roll += 2000
print(html_after, html_before)
if html_before == html_after:
break
# 模拟浏览器网页滚动,当下次滚动下界面像素值等于滚动前的值时,结束模拟网页滚动
text = driver.page_source # 保存网页内容到text
# print(text)
useragent = UserAgent()
headers = {
'User-Agent': useragent.random
}
etree_html = etree.HTML(text)
img_url = etree_html.xpath('//img/@src') # 利用etree解析保存网页内容中的图片网址
number = 0
for i in range(0, len(img_url)):
if i == 200:
# 设定的保存数量,图片资源达到200时自动结束循环
break
if img_url[i].startswith('http'): # 筛选可以访问的图片网址,部分图片网址不可访问
print(img_url[i])
Url = img_url[i]
img = requests.get(url=Url, headers=headers).content
number += 1
print('正在下载第{}张图片'.format(number))
img_name = 'picture\\' + name + '{}.jpg'.format(number) # 图片保存到本地
with open(img_name, 'wb') as save_img:
save_img.write(img)
driver.quit()
if __name__ == '__main__':
picture_download()
七、运行效果截图
1、输入抓取类别,开始网页滚动
此处输入的名称为你想抓取的任意图片
2、图片下载及网址打印
3、抓取结果
一共抓取了180张图片
思路总结
使用selenium模拟网页滚动,避免抓取数据不全的问题,再通过etree对抓取数据进一步处理,获取图片url,从而将图片保存到本地