如何保存提取的信息?
要保存提取的信息,必须先了解一下用于存储结果的格式:
CSV - 一种最常用的表格数据存储格式。它是一种文本文件,每行对应一条记录,数值之间用逗号分隔。这种格式的优点包括:支持大多数数据处理应用程序,包括 Excel;易于使用文本编辑器进行阅读和编辑。
JSON--一种基于文本的数据交换格式,便于表示结构化数据。它广泛应用于网络开发。优点:支持嵌套和分层数据结构;大多数编程语言都支持;易于人机阅读。JSON 适用于存储可能需要通过 API 传输的数据。
XLS--专为 Excel 电子表格设计,可存储有关单元格、格式和公式的数据。它通常用于存储数据库。要在 Python 中使用 XLS,您需要第三方库,如 pandas。这种格式允许以可读和可展示的格式存储数据。
XML--一种用于存储和传输数据的标记语言。它支持嵌套结构和属性。优点:结构化;允许存储复杂的数据结构;得到各种标准和系统的良好支持。
数据库用于存储大量结构化数据。例如,MySQL、PostgreSQL、MongoDB 和 SQLite。优点:支持大量数据和快速访问;易于组织和关联数据;支持事务和数据恢复。缺点:需要额外的设置和维护工作。
对于我们的刮擦工具,我们将选择 CSV 格式,因为提取的数据是表格形式的(引用文本和作者、产品名称和链接),而且数据量相对较小,没有嵌套结构。有关如何读写这种格式的其他信息,请点击此处。我们将在报价代码中添加 CSV 导入,创建写入器对象,并写入报价数据(报价本身及其作者):
with open('quotes.csv', 'w', newline='', encoding='utf-8') as csvfile: csvwriter = csv.writer(csvfile) csvwriter.writerow(['Quote', 'Author']) for quote in quotes[:3]: text = quote.select_one('.text').get_text(strip=True) author = quote.select_one('.author').get_text(strip=True) csvwriter.writerow([text, author])
我们还将添加额外的控制台输出和错误处理:
print("数据成功写入 quotes.csv")except requests.RequestException as e: print(f'Error requesting the page: {e}')except Exception as e: print(f'An error occurred: {e}')
以下是完整的更新代码:
导入请求 from bs4 import BeautifulSoup import csv # 目标页面的 URL url = 'https://quotes.toscrape.com/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36' } try: # 使用用户代理向页面发送 GET 请求 response = requests.get(url, headers=headers) response.raise_for_status() # 检查 HTTP 错误 # 创建用于解析 HTML 的 BeautifulSoup 对象 soup = BeautifulSoup(response.text, 'html.parser') # 查找所有带引号的块 quotes = soup.select('.quote') # 用 open('quotes.csv', 'w', newline='', encoding='utf-8') as csvfile 打开 CSV 文件以便写入: # 创建写入器对象 csvwriter = csv.writer(csvfile) # 写入标题 csvwriter.writerow(['quote', 'Author']) # 写入引用数据 for quote in quotes[:3]: # 提取引用文本 text = quote.select_one('.text').get_text(strip=True) # 提取作者姓名 author = quote.select_one('.author').get_text(strip=True) # 写入 CSV 文件 csvwriter.writerow([text, author]) print("Data successfully written to quotes.csv") except requests.requestException as e: print(f'Error requesting the page: {e}') except Exception as e: print(f'An error occurred: {e}')
我们将使用第二个刮板执行类似操作:
from playwright.sync_api import sync_playwright import csv # 目标页面的 URL url = 'https://parsemachine.com/sandbox/catalog/' def scrape_with_playwright(): try: with sync_playwright() as p: # 启动 Chromium 浏览器 browser = p.chromium.launch(headless=False) # 将无头模式改为 True try: # 打开一个新标签页 page = browser.new_page() # 浏览到目标页面 page.goto(url) # 查找所有产品卡 product_cards = page.query_selector_all('.card.product-card') # 打开 CSV 文件进行编写 with open('products.csv', 'w', newline='', encoding='utf-8') as csvfile: # 创建写入器对象 csvwriter = csv.writer(csvfile) # 写入标题 csvwriter.writerow(['Title', 'Link']) # 从产品卡中提取数据并写入 CSV for card in product_cards: # 提取产品标题 title_tag = card.query_selector('.card-title .title') title = title_tag.inner_text() if title_tag else 'No title available' # 链接到产品页面 product_link = title_tag.get_attribute('href') if title_tag else 'No link available' # 如果链接是相对的,则添加基本 URL if product_link and not product_link.startswith('http'): product_link = f'https://parsemachine.com{product_link}' # 将数据写入 CSV 文件 csvwriter.writerow([title, product_link]) # 打印产品信息 print(f'Title: {title}, Link: {product_link}') print("Data successfully written to products.csv") except Exception as e: print(f'Error working with Playwright: {e}') finally: # 关闭浏览器.close() print("Browser closed.") except Exception as e: print(f'Error launching Playwright: {e}') scrape_with_playwright()
网络抓取中的障碍
不断变化的复杂网站结构:网络抓取中最常见的障碍之一是不断变化的网站结构和代码混淆。即使是 HTML 标记或页面结构的细微变化也会导致搜索脚本停止工作。这可能需要频繁更新代码以适应新的变化。
请求限制:许多网站对在一定时间内发送的请求数量有限制。
IP 封锁:网站可能会封锁他们认为可疑或过于活跃的 IP 地址,这可能会成为刮擦的重大障碍。在这种情况下,可能需要高质量的代理服务器来绕过此类阻止。
验证码:许多网站资源都采用验证码形式的保护措施来防止自动操作。
当今最好的服务之一是 CapMonster 云 - 其 API 允许轻松集成到代码中,以绕过验证码并继续进行刮擦操作。它易于连接,可为各种类型的验证码提供快速解决方案,且错误极少--它支持 reCAPTCHA、DataDome、Amazon CAPTCHA 等。CapMonster Cloud 可被视为辅助工具的最佳选择,也是网络刮擦流程的重要组成部分。
成功刮擦的建议
- 使用代理和用户代理轮换:为了避免 IP 屏蔽和绕过请求限制,这有助于模仿来自各种设备和浏览器的请求。
- 添加错误处理和重试:网页可能暂时不可用,或者请求可能失败。重试机制和错误处理将有助于确保您的脚本能够应对此类情况,并防止刮擦过程被中断。
- 查看网站的 robots.txt 文件:该文件包含针对机器人的指南,说明网站的哪些部分可以抓取,哪些部分不能抓取。
- Introduce Random Delays Between Requests: To avoid suspicious activity and reduce the likelihood of blocking.
这些建议将帮助您的脚本模仿真实用户的行为,从而降低被检测到的几率。
结论
总之,使用 Python 进行网络刮擦是从各种网站中有效收集数据的最常用方法之一。我们讨论了如何为网络刮擦选择正确的工具、Python 和必要库的安装过程,以及如何编写代码以提取数据并将结果保存为方便的格式。通过本文介绍的循序渐进的方法,即使是开发新手也能掌握网络搜刮的基本技术,并创建自己的第一个搜刮脚本。网络搜刮为数据分析、信息收集、市场监测和许多其他任务提供了重要机会。
通过使用本指南中提到的 BeautifulSoup、requests、Selenium、Playwright 等库和工具,您可以从静态和动态网站中提取信息。在使用网络刮擦时,重要的是要考虑到法律和道德方面的问题,并做好绕过验证码或动态内容加载等各种障碍的准备。
所讨论的每种工具和方法都有其优势和局限性。选择合适的工具取决于任务的具体情况、网页的复杂性和数据量。
我们希望这些说明能够帮助您更好地理解网络刮擦流程,并为您创建自己的刮擦工具提供必要的基础知识。祝您在数据收集和分析项目中好运!
注意:我们在此提醒您,该产品用于在您自己的网站和您拥有合法访问权限的网站上自动进行测试。