通过网路爬虫模拟用户操作实现对百度搜索结果中图片的采集和保存

简介

本文档在介绍一个基于 Python 的网络爬虫程序,通过模拟用户操作实现对百度搜索结果中图片的采集和保存。该程序使用了 Selenium 和 requests 库,具有搜索指定关键词、异步加载页面、获取高质量图片链接并保存到本地等功能。

程序结构

1.启动浏览器
  • 使用 Selenium 中的 webdriver.Chrome() 方法实例化一个 Chrome 浏览器对象。
  • 打开百度首页,并最大化窗口。
2.搜索数据
  • 在搜索框中输入指定的关键词,点击搜索按钮。
3.进入二级页面
  • 点击搜索结果中的第一个链接,进入二级页面。
4.异步加载图片
  • 通过执行 JavaScript 实现页面的滚动加载,获取异步加载的图片链接和名称。
5.采集数据
  • 处理获取到的图片链接和名称,通过 requests 库下载图片并保存到本地指定目录。

使用方法

1.安装依赖库
  • 确保已安装 Python 3.x,并使用 pip 安装所需的依赖库:
pip install selenium requests lxml
2.准备 WebDriver
  • 下载 Chrome 浏览器对应版本的 WebDriver,并将可执行文件放置在指定路径下。
3.运行程序
  • 运行 Python 脚本,按提示输入要加载的页数和要采集的图片名称。

稳定性优化

为确保网络稳定性和程序运行顺畅,可以进行以下优化:

  1. 异常处理:在程序中加入异常处理机制,捕获网络请求、页面元素定位等可能出现的异常,并给出友好提示或重试机制。

  2. 网络超时设置:对请求设置合理的超时时间,避免长时间等待造成程序阻塞。

  3. 重试机制:针对网络请求失败的情况,可引入重试机制,多次尝试连接,提高数据获取成功率。

  4. 日志记录:添加日志记录功能,记录程序运行状态、异常信息等,有助于排查问题和优化程序。

  5. 断点续传:在数据下载过程中,考虑实现断点续传功能,避免因网络中断或程序异常导致数据丢失。

注意事项

1 .请遵守网站规定和相关法律法规,避免对目标网站造成不必要的影响。
2. 本程序仅供学习和研究之用,请勿用于商业用途或违法行为。

示例运行代码

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
import requests
from lxml import etree
import os
import random
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

class BaiDu:
    def __init__(self, count, name):
        self.url1 = "https://www.baidu.com/"
        self.url2 = ""
        self.js = "window.scrollBy(0,600)"
        self.count = count
        self.data_name = name

    def start_browser(self):
        options = webdriver.ChromeOptions()
        # 设置中文
        options.add_argument('lang=zh_CN.UTF-8')
        options.add_experimental_option('excludeSwitches', ['enable-automation'])  # 干活公式
        options.add_argument(
            'user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.35 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"')
        driver = webdriver.Chrome(executable_path=r"D:\Python project\python爬虫\chromedriver.exe", options=options)
        driver.get(self.url1)
        driver.maximize_window()
        self.search_data(driver)

    def search_data(self, driver):
        name = driver.find_element(By.XPATH, '//*[@id="kw"]')
        clicks = driver.find_element(By.XPATH, '//*[@id="su"]')
        time.sleep(2)
        name.send_keys(f"{self.data_name}")
        clicks.click()
        time.sleep(5)
        self.second_url(driver)

    def second_url(self, driver):
        clicks = driver.find_element(By.XPATH, '//*[@id="1"]/div/h3/a')
        clicks.click()
        time.sleep(15)
        # current_window = driver.current_window_handle
        # print("当前窗口句柄:", current_window)
        handles = driver.window_handles
        print("handles:", handles)
        # 获取新的窗口对象
        driver.switch_to.window(handles[-1])
        self.asynchronous_loading(driver)

    # 异步加载
    def asynchronous_loading(self, driver):
        try:
            for i in range(self.count):
                driver.execute_script(self.js)
                time.sleep(0.8)
            second_datas = driver.page_source
            # print(second_datas)
            html2 = etree.HTML(second_datas)
            image_url = html2.xpath("//li[@class='imgitem']/div/div[2]/a/img/@src")
            image_url = [item for item in image_url if item.startswith("https")]
            image_name = html2.xpath("//li[@class='imgitem']/a/text()")
            driver.close()
            driver.quit()
            print(image_url)
            print(len(image_url))
            print(image_name)
            print(len(image_name))
            self.collect_data(image_url, image_name)
        except Exception as E:
            print("二级目录访问出现问题了", E)

    def collect_data(self, new_url, image_name):
        new_list = []
        new_name = []
        for j in image_name:
            names = j.replace('?', '').replace('*', '').replace('<', '').replace('> ', '').replace("(", '').replace(")",
                                                                                                                    '').replace(
                " ", '').replace("【全球购】", '').replace("|", '').replace("、", '').replace("/", '').replace("【",
                                                                                                         '').replace(
                '】', '').replace("[", '').replace("]", '').replace('\"', '').replace('\"', '').replace(':',
                                                                                                       '-').replace("?",
                                                                                                                    '').replace(
                r"'?'", '').replace(r"'?' (0x63ed)", '').replace('!', '').replace('"', '').replace('_', '')
            new_name.append(names)
        for node in zip(new_url, new_name):
            if "https://" in node[0]:
                new_list.append(node)
        try:
            li_ur = [1, 2, 3, 4, 5]
            new_li = random.choice(li_ur)
            headers = {
                "user-agent": f"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.3{new_li}",
                "referer": "https://www.bilibili.com/",
                "Connection": "close",
            }
            print("图片正在采集...")
            for nodes in new_list:
                url = nodes[0]
                print(url)
                name = nodes[1]
                re = requests.get(url=url, headers=headers, verify=False)
                contents = re.content
                path = f"D:/{self.data_name}"
                if os.path.exists(path) == False:
                    os.mkdir(path)
                with open(f"{path}/{name}.jpg", "wb") as files:
                    files.write(contents)
            print("图片采集完毕")
            print("图片路径->>>" + "D:/香米图片")
        except Exception as a:
            print("图片采集出现问题了", a)
            print()
            print("采集出错了,重新采集即可!")


if __name__ == '__main__':
    try:
        print("--------------------------------------")
        print("1.此程序只能采集香米图片采集,采集每一个步骤程序会图像化界面是形式展示给你")
        print("2.由于网站上的图片通过异步加载的形式展示,所以我们必须先加载图片然后去采集")
        print("3.程序会提醒你,加载多少!")
        print("--------------------------------------\n")
        print("输入1是,会加载出来15个左右的图片")
        count = int(input("请输入你要加载的页数:"))
        print("--------------------------------------")
        print("请输入你要采集的图片名称")
        print("香米图片,黑客图片,肌肉男图片等,当然你可以输入别的试试看程序能不能跑起来!")
        name = input("请输入:")
        mai = BaiDu(count, name)
        mai.start_browser()
    except Exception as e:
        print("出现问题了,问题原因:", e)

示例运行结果

点击运行结果

免责声明

作者不对因使用本程序而导致的任何直接或间接损失负责。用户需对使用本程序产生的结果自行承担风险。

总结

本文档提供了关于网络爬虫程序的详细介绍和使用方法,希望能够帮助用户理解和使用该程序。如有任何问题或建议,欢迎与作者联系。

  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

力江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值