简介
本文档在介绍一个基于 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. 本程序仅供学习和研究之用,请勿用于商业用途或违法行为。
示例运行代码
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)
示例运行结果
免责声明
作者不对因使用本程序而导致的任何直接或间接损失负责。用户需对使用本程序产生的结果自行承担风险。
总结
本文档提供了关于网络爬虫程序的详细介绍和使用方法,希望能够帮助用户理解和使用该程序。如有任何问题或建议,欢迎与作者联系。