用Python实现自动化的Web测试(Selenium)

Python作为数据科学和自动化领域的主流语言,在网络爬虫开发中占据着重要地位。本文将全面介绍Python爬虫的技术栈、实现方法和最佳实践。

爬虫技术概述

网络爬虫(Web Crawler)是一种按照特定规则自动抓取互联网信息的程序。它可以自动化地浏览网络、下载内容并提取有价值的数据,广泛应用于搜索引擎、数据分析和商业智能等领域。

核心库与技术栈

1. 基础请求库

  • Requests:简洁易用的HTTP库,适合大多数静态页面抓取

  • urllib:Python标准库中的HTTP工具集

2. 解析库

  • BeautifulSoup:HTML/XML解析库,适合初学者

  • lxml:高性能解析库,支持XPath

  • PyQuery:jQuery风格的解析库

3. 高级框架

  • Scrapy:完整的爬虫框架,适合大型项目

  • Selenium:浏览器自动化工具,处理JavaScript渲染

  • Playwright:新兴的浏览器自动化库,支持多浏览器

4. 异步处理

  • aiohttp:异步HTTP客户端/服务器框架

  • Asyncio:Python异步IO框架

实战示例

示例1:基础静态页面抓取

python

import requests
from bs4 import BeautifulSoup
import pandas as pddef scrape_basic_website(url):"""抓取静态网站基本信息"""try:# 设置请求头模拟浏览器headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}# 发送GET请求response = requests.get(url, headers=headers, timeout=10)response.raise_for_status()  # 检查请求是否成功# 解析HTML内容soup = BeautifulSoup(response.content, 'lxml')# 提取数据data = {'title': soup.title.string if soup.title else '','headings': [h.get_text().strip() for h in soup.find_all(['h1', 'h2', 'h3'])],'links': [a.get('href') for a in soup.find_all('a') if a.get('href')],'text_content': soup.get_text()[0:500] + '...'  # 限制文本长度}return dataexcept requests.exceptions.RequestException as e:print(f"请求错误: {e}")return None# 使用示例
if __name__ == "__main__":result = scrape_basic_website('https://httpbin.org/html')if result:print("网页标题:", result['title'])print("前5个链接:", result['links'][:5])

示例2:处理动态内容(使用Selenium)

python

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Optionsdef scrape_dynamic_content(url):"""抓取需要JavaScript渲染的动态内容"""# 配置浏览器选项chrome_options = Options()chrome_options.add_argument('--headless')  # 无头模式chrome_options.add_argument('--no-sandbox')chrome_options.add_argument('--disable-dev-shm-usage')driver = webdriver.Chrome(options=chrome_options)try:driver.get(url)# 等待特定元素加载完成wait = WebDriverWait(driver, 10)element = wait.until(EC.presence_of_element_located((By.TAG_NAME, "main")))# 提取动态生成的内容dynamic_content = driver.find_element(By.TAG_NAME, "main").text# 截图功能(用于调试)driver.save_screenshot('page_screenshot.png')return dynamic_content[:1000]  # 返回部分内容finally:driver.quit()# 使用示例
# content = scrape_dynamic_content('https://example.com')
# print(content)

示例3:使用Scrapy框架

创建Scrapy项目:

bash

scrapy startproject myproject
cd myproject

定义爬虫(spiders/example_spider.py):

python

import scrapy
from myproject.items import WebsiteItemclass ExampleSpider(scrapy.Spider):name = "example"allowed_domains = ["example.com"]start_urls = ["https://example.com"]custom_settings = {'CONCURRENT_REQUESTS': 1,'DOWNLOAD_DELAY': 2,  # 遵守爬虫礼仪'USER_AGENT': 'MyWebCrawler/1.0 (+https://mywebsite.com)'}def parse(self, response):# 提取数据item = WebsiteItem()item['url'] = response.urlitem['title'] = response.css('title::text').get()item['content'] = response.css('p::text').getall()yield item# 跟踪链接(可选)for next_page in response.css('a::attr(href)').getall():if next_page is not None:yield response.follow(next_page, callback=self.parse)

高级技巧与最佳实践

1. 处理反爬机制

python

import random
import timedef advanced_scraper(url):"""高级爬虫,应对反爬措施"""headers_list = [{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'},{'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36'},{'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'}]# 使用代理(可选)proxies = {'http': 'http://10.10.1.10:3128','https': 'http://10.10.1.10:1080',}try:# 随机选择请求头headers = random.choice(headers_list)response = requests.get(url, headers=headers, timeout=15,# proxies=proxies  # 如果需要使用代理取消注释)# 随机延迟,避免请求过于频繁time.sleep(random.uniform(1, 3))return responseexcept Exception as e:print(f"高级抓取错误: {e}")return None

2. 数据存储

python

import json
import csv
import sqlite3def save_data(data, format='json', filename='data'):"""多种格式保存数据"""if format == 'json':with open(f'{filename}.json', 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=2)elif format == 'csv':if data and isinstance(data, list) and len(data) > 0:keys = data[0].keys()with open(f'{filename}.csv', 'w', newline='', encoding='utf-8') as f:writer = csv.DictWriter(f, fieldnames=keys)writer.writeheader()writer.writerows(data)elif format == 'sqlite':conn = sqlite3.connect(f'{filename}.db')c = conn.cursor()# 创建表(根据实际数据结构调整)c.execute('''CREATE TABLE IF NOT EXISTS scraped_data(id INTEGER PRIMARY KEY, title TEXT, content TEXT)''')# 插入数据(根据实际数据结构调整)for item in data:c.execute("INSERT INTO scraped_data (title, content) VALUES (?, ?)",(item.get('title'), str(item.get('content'))))conn.commit()conn.close()

3. 异步爬虫提高效率

python

import aiohttp
import asyncioasync def async_scraper(urls):"""异步爬虫,提高抓取效率"""async with aiohttp.ClientSession() as session:tasks = []for url in urls:task = asyncio.ensure_future(fetch(session, url))tasks.append(task)results = await asyncio.gather(*tasks)return resultsasync def fetch(session, url):"""异步获取单个URL"""try:async with session.get(url, timeout=aiohttp.ClientTimeout(total=10)) as response:return await response.text()except Exception as e:print(f"Error fetching {url}: {e}")return None# 使用示例
# urls = ['https://example.com/page1', 'https://example.com/page2']
# results = asyncio.run(async_scraper(urls))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/923581.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/923581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「Memene 摸鱼日报 2025.9.17」上海张江人工智能创新小镇正式启动,华为 DCP 技术获网络顶会奖项

theme: condensed-night-purple 以下内容包括「人工智能生成内容」 上海张江人工智能创新小镇正式启动,华为 DCP 技术获网络顶会奖项 👏在昨天(2025.9.16),AI领域有这些内容可能值得你关注: 上海张江人工智…

Vehiclehal的VehicleService.cpp

VehicleService.cpp 是 Android Automotive OS 中负责车辆相关功能的核心服务组件,主要处理车身信息获取及状态设置接口,通过 HIDL(Hardware Interface Definition Language)接口与系统框架层交互。 ‌12核心功能VehicleService.c…

《LINUX系统编程》笔记p11

公共资源也称为共享资源,是指可以被多个并发进程或线程共同访问(读取或写入)的系统资源。临界资源是公共资源的一个子集。特指那些一次仅允许一个进程或线程访问的公共资源。如果一个进程正在使用它,其他试图访问该资源的进程必须…

spring-kafka消费异常处理

默认的消费异常处理 默认情况下,如果程序没有显式做任何的异常处理,spring-kafka会提供一个默认的DefaultErrorHandler, 它会使用FixedBackOff做重试,会不间断的连续重试最多9次,也就是说一个消息最多会被消费10次。如果重试次数耗…

leecode73 矩阵置零

我的思路 这个题目不难,就是一句话,遍历这个矩阵的时候,当遇到0的时候就把该行该列改为0,同时为了不影响后续的遍历,我们可以将这个遍历和修改分为两个数组。使用mn的辅助空间 class Solution {public void setZeroe…

Spring Boot 与前端文件上传跨域问题:Multipart、CORS 与网关配置

前言在前后端分离架构下,文件上传是一个常见功能。但在 Spring Boot 项目中,我们经常会遇到前端调用接口上传文件时出现 跨域问题,表现为:浏览器控制台报错:Access-Control-Allow-Origin 缺失或不匹配。使用 FormData …

快速解决云服务器的数据库PhpMyAdmin登录问题

打开PhpMyAdmin数据库管理器登录页面账号密码就是你的用户名(如YiXun)和密码注意:root账户的密码,点击下面的“root密码”即能看到或修改PhpMyAdmin无法打开如果打不开:在数据库,点击PHPMyAdmin&#xff0c…

vite+vue3中使用FFmpeg@0.12.15实现视频编辑功能,不依赖SharedArrayBuffer!!!

FFmpeg0.12.15完全不依赖SharedArrayBuffer!!!强烈推荐使用 本文章主要是在vitevue3项目中使用FFmpeg,只展示了如何在项目中引入和基础的使用 更多详细参数可参照 ffmpeg官网https://ffmpeg.org/ 一、安装FFmpeg 可通过npm直接安装 npm install ffmpeg/core0.12.10…

构网型5MW中压储能变流升压一体机技术方案

1 构网型储能背景概述1.1 新型电力系统亟需构网支撑众所周知,新型电力系统具有两高特征:高比例新能源大规模并网、高比例电力电子大范围接入。近年来风光装机占比越来越高,而传统火电装机占比越来越低,并在2023年首次降至50%以下…

SRE 系列(七)| 从技术架构到团队组织

目录SRE落地与组织架构实践技术架构与组织架构的匹配技术架构示例运维职责分工技术保障体系SRE 多角色团队总结SRE落地与组织架构实践 在落地 SRE 时,很多团队最关心的问题之一就是组织架构:我们究竟需要怎样的团队形态,才能支撑微服务和分…

香港期权市场的主要参与者有哪些?

本文主要介绍香港期权市场的主要参与者有哪些?香港期权市场作为全球重要的金融衍生品市场,其参与者结构呈现多元化、专业化的特征,主要涵盖以下核心群体。香港期权市场的主要参与者有哪些?1. 机构投资者(主导力量&…

搜维尔科技:全身可穿戴Teslasuit动捕服的功能,自立式FES装置

功能性电刺激 (FES) 设备广泛应用于康复和医疗实践。其底层技术利用低能量电脉冲,在中风、脊髓损伤、多发性硬化症、脑瘫等各种疾病患者中人工产生身体运动。一般来说,FES系统可以分为三类:开环、有限状态控制和闭环方法。这三种方法描述了 F…

【深度学习新浪潮】MoE是什么技术?

混合专家模型(Mixture of Experts,MoE)是大模型时代提升计算效率与模型能力的核心技术之一。其核心思想是将复杂任务分解为多个子任务,通过动态路由机制激活特定专家网络处理输入数据,从而在保持模型容量的同时大幅降低计算成本。以下是技术细节与实际应用的深度解析: 一…

Java进阶教程,全面剖析Java多线程编程,实现Callable接口实现多线程,笔记05

Java进阶教程,全面剖析Java多线程编程,实现Callable接口实现多线程,笔记05 参考资料 多线程&JUC-05-多线程的第三种实现方式一、实现Callable接口实现多线程 二、三种方式对比 优点缺点继承Thread类编程比较简单,可以直接使…

轨道交通绝缘监测—轨道交通安全的隐形防线

轨道交通绝缘监测作为保障行车安全的核心环节,正面临多重技术与环境挑战。复杂运营环境是首要痛点,隧道内高湿度(月均湿度达95%)会增大钢轨表面电导率,雾气中的盐分更会加速扣件绝缘性能下降,导致过渡电阻骤…

tar-符号连接(软连接)

1.符号连接是什么符号链接(symbolic link,也叫软链接)本质上是一个 指向路径的特殊文件。例如:ln -s /etc/passwd passwd_link这会创建一个叫 passwd_link 的文件,但它本身不存放 /etc/passwd 的内容,而是存…

ffmpeg切割音频

ffmpeg切割音频 我希望对指定音频切割,按照开始时间,结束时间,切割成新文件,自动保存,非常好用 step1: from pydub import AudioSegment import os# 配置FFmpeg路径(确保路径正确) ffmpeg_path …

Python 批量处理:Markdown 与 HTML 格式相互转换

文章目录引言与同类工具的优势对比Python 将 Markdown 转换为 HTMLPython 将 HTML 转换为 Markdown批量转换与自动化处理引言 在多平台内容分发与管理的场景中,文档格式转换已成为内容生态系统中的关键环节。Markdown 作为轻量级标记语言,以其语法简洁、…

御控物联网远程控制水泵启停智能自控解决方案

在农业灌溉、城市排水、工业供水等场景中,水泵作为核心设备,长期面临以下难题:人工依赖度高:需24小时值守,暴雨或干旱时响应滞后; 能耗浪费严重:空转、过载运行导致电费居高不下; …

RedisI/O多路复用:单线程网络模型epoll工作流程

epoll1. 在内核创建eventpoll结构体,返回句柄epfd(唯一标识)eventpoll包含存放被监听的fd的红黑树,和存放已就绪的fd的链表2. 将要监听的fd加入到epoll红黑树中,并设置callback回调函数callback触发时,就将…