利用selenium与etree抓取必应图片

利用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,从而将图片保存到本地

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值