使用 Python 和 Selenium 进行网络抓取

news2024/11/29 22:52:15

如果你今天的工作是从竞争对手的网站上抓取定价页面信息。你会怎么做?复制粘贴?手动输入数据?当然不行!他们绝对会花费你超级多的时间,而且你可能会犯一些错误。

需要指出的是,Python已经成为最流行的数据抓取编程语言之一,它到底有什么魅力呢?

什么是网页抓取?

网页抓取是从网站提取数据的过程。这可以手动完成,但最好使用一些自动化工具或脚本来高效准确地收集大量数据。从网页复制和粘贴实际上也是进行网页抓取。

为什么使用 Python 进行网页抓取?

Python 被认为是网页抓取的最佳选择之一,原因如下:

  • 易于使用:由于清晰和直观,即使是初学者也可以使用 Python。
  • 强大的库:Python 拥有丰富的库系统,例如 Beautiful Soup、Scrapy 和 Selenium,可简化网络抓取任务。
  • 社区支持:Python 拥有庞大而活跃的社区,为故障排除和学习提供了丰富的资源和支持。

Python Web 抓取路线图

您准备好开始使用 Python 进行网页抓取了吗?在弄清楚基本步骤之前,请确保您知道会发生什么以及如何进行。

掌握网页抓取的基本步骤

网络抓取涉及一个系统的过程,包括四个主要任务:

1. 检查目标页面

在提取数据之前,您需要了解网站的布局和数据结构:

  • 探索网站
  • 分析 HTML 元素
  • 识别关键数据

2. 检索 HTML 内容

要抓取一个网站,首先需要访问它的 HTML 内容:

  • 使用 HTTP 客户端库
  • 发出 HTTP GET 请求
  • 验证 HTML 检索

3.从 HTML 中提取数据

获得 HTML 后,下一步就是提取所需的信息:

  • 解析 HTML 内容
  • 选择相关数据
  • 编写提取逻辑
  • 处理多个页面

4. 存储提取的数据

提取数据后,将其存储为可访问的格式至关重要:

  • 转换数据格式
  • 导出数据

提示:网站是动态的,因此请定期检查和更新您的抓取过程以保持数据是最新的。

网页抓取用例

Python 网页抓取可以应用于多种场景,包括:

  • 竞争对手分析:通过收集网站数据监控竞争对手的产品、服务和营销策略。
  • 价格比较:收集并比较不同电子商务平台的价格,以找到最优惠的价格。
  • 社交媒体分析:从社交媒体平台检索数据,以分析特定标签、关键词或影响者的受欢迎程度和参与度。
  • 潜在客户生成:从网站提取联系方式,创建有针对性的营销列表,同时考虑法律因素。
  • 情感分析:收集新闻和社交媒体帖子以追踪某个主题或品牌的公众观点。

克服网络爬取挑战

网络抓取有其自身的一系列挑战:

  • 多样化的网站结构:每个网站都有独特的布局,需要自定义的抓取脚本。
  • 更改网页:网站可能会在未经通知的情况下更改其结构,因此需要调整您的抓取逻辑。
  • 可扩展性问题:随着数据量的增加,请确保您的抓取工具使用分布式系统、并行抓取或优化代码保持高效。

此外,网站还采用了 IP 封锁、JavaScript 挑战和 CAPTCHA 等反机器人措施。这些措施可以通过轮换代理和无头浏览器等技术来规避。

陷入网络抓取困境?
绕过反机器人检测,简化网络抓取和自动化
免费试用 Nstbrowser!

网页抓取的替代方案

虽然网页抓取功能多样,但也有其他选择:

  • API:一些网站提供 API 来请求和检索数据。API 很稳定,通常不受抓取保护,但它们提供的数据有限,而且并非所有网站都提供它们。
  • 即用型数据集:在线购买数据集是另一种选择,尽管它们可能并不总是能满足您的特定需求。
    尽管存在这些替代方案,网络抓取由于其灵活性和全面的数据访问能力仍然是一种流行的选择。

使用 Python 踏上您的网络抓取之旅,释放在线数据的巨大潜力!

如何使用 Python 和 Selenium 进行网页抓取?

步骤 1. 前提

首先,我们需要安装我们的shell:

pip install selenium requests json

安装完成后请新建scraping.py文件并在文件中引入我们刚刚安装的库:

import json
from urllib.parse import quote
from urllib.parse import urlencode

import requests
from requests.exceptions import HTTPError
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By

步骤2. 连接到Nstbrowser

为了进行准确的演示,我们将使用 Nstbrowser(一款完全免费的反检测浏览器)作为完成我们任务的工具:

def create_and_connect_to_browser():
    host = '127.0.0.1'
    api_key = 'xxxxxxx' # your api-key
    config = {
        'once': True,
        'headless': False, # headless
        'autoClose': True,
        'remoteDebuggingPort': 9226,
        'userAgent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'fingerprint': {  # required
            'name': 'custom browser',
            'platform': 'windows', # support: windows, mac, linux
            'kernel': 'chromium', # only support: chromium
            'kernelMilestone': '120',
            'hardwareConcurrency': 4, # support: 2, 4, 8, 10, 12, 14, 16
            'deviceMemory': 4, # support: 2, 4, 8
            'proxy': '', # input format: schema://user:password@host:port eg: http://user:password@localhost:8080
        }
    }
    query = urlencode({
        'x-api-key': api_key, # required
        'config': quote(json.dumps(config))
    })

    url = f'http://{host}:8848/devtool/launch?{query}'
    print('devtool url: ' + url)

    port = get_debugger_port(url)
    debugger_address = f'{host}:{port}'
    print("debugger_address: " + debugger_address)

连接到Nstbrowser之后,我们通过Nstbrowser返回给我们的调试器地址连接到Selenium:

def exec_selenium(debugger_address: str):
    options = webdriver.ChromeOptions()
    options.add_experimental_option("debuggerAddress", debugger_address)
    # Replace with the corresponding version of WebDriver path.
    chrome_driver_path = r'./chromedriver' # your chrome driver path
    service = ChromeService(executable_path=chrome_driver_path)
    driver = webdriver.Chrome(service=service, options=options)

步骤 3. 抓取网页

至此,我们已经成功通过 Selenium 启动了 Nstbrowser。现在开始抓取吧!

  • 访问我们的目标网站,例如:IMDb Top 250 Movies
driver.get("https://www.imdb.com/chart/top")
  • 运行我们刚刚写的代码:
python scraping.py

如您所见,我们成功启动了 Nstbrowser 并访问了目标网站。

  • 打开Devtool可以看到我们想要爬取的具体信息,没错,显然都是具有相同dom结构的元素。

Devtool 提供具体信息

我们可以使用Selenium来获取这种dom结构,并分析其内容:

movies = driver.find_elements(By.CSS_SELECTOR, "li.cli-parent")
for row in movies:
  title = row.find_element(By.CLASS_NAME, 'ipc-title-link-wrapper') # get title
  year = row.find_element(By.CSS_SELECTOR, 'span.cli-title-metadata-item') # get created year
  rate = row.find_element(By.CLASS_NAME, 'ipc-rating-star') # get rate

  move_item = {
    "title": title.text,
    "year": year.text,
    "rate": rate.text
  }
  print(move_item)
  • 再次运行我们的代码,可以看到终端已经输出了我们想要获取的信息。

当然,在终端输出这些信息并不是我们的目的,接下来我们需要将爬取到的数据保存起来。

我们使用 JSON 库将检索到的数据保存到 JSON 文件:

movies = driver.find_elements(By.CSS_SELECTOR, "li.cli-parent")
movies_info = []
for row in movies:
  title = row.find_element(By.CLASS_NAME, 'ipc-title-link-wrapper')
  year = row.find_element(By.CSS_SELECTOR, 'span.cli-title-metadata-item')
  rate = row.find_element(By.CLASS_NAME, 'ipc-rating-star')

  move_item = {
    "title": title.text,
    "year": year.text,
    "rate": rate.text
  }
  movies_info.append(move_item)
# create the json file
json_file = open("movies.json", "w")
# convert movies_info to JSON
json.dump(movies_info, json_file)
# release the file resources
json_file.close()
  • 运行代码,打开文件,可以看到 scraping.py 旁边多了一个 movies.json,这意味着我们成功使用 Selenium 连接 Nstbrowser,并抓取到了目标网站的数据!

总结

如何使用 Python 和 Selenium 进行网页抓取?本详细教程涵盖了您正在寻找的所有内容。为了全面了解,我们讨论了 Python 用于网页抓取的概念和优势。然后,以免费的反检测浏览器 - Nstbrowser 为例,介绍具体步骤。我相信您现在已经学到了很多有关 Python 网页抓取的知识!是时候操作您的项目并收集数据了。

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

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

相关文章

超级马里奥-小游戏

学习目标: 练习Java面向对象的编程思想; 巩固Java语言基础,数据类型、集合、数组等; 深刻理解Java的三大特性,封装、继承、多态; 效果展示:

[发布]嵌入式系统远程测控软件-基于Qt

目录 一. 引言二. 软件功能2.1 原理2.2 软件功能2.3 运行环境 三. 软件操作使用3.1 软件界面3.2 软件功能使用详解3.2.1 连接3.2.2 数据监测(串口示波器)3.2.3 数据修改3.2.4 数据保存 3.3 软件的硬件连接 四. 通信协议——STM32移植篇4.1 通信协议4.2 S…

Java SE LTS版本商用收费,有那些开源的替代方案?

🚀 Java SE LTS版本商用收费,有那些开源的替代方案? 摘要 Java 对于云服务、大数据、电子商务、支付、欺诈和身份、交易等许多应用程序来说都是至关重要的语言。然而,Oracle 对 Java SE LTS 版本的商用收费政策引发了广泛关注和…

活体检验API在Java、Python、PHP中的使用教程

活体检验API是一种基于生物特征的身份验证技术,通过分析和识别用户的生物信息来确认其身份。这种技术广泛应用于各种领域,如金融、安全、社交媒体等,以提高身份验证的安全性和准确性。以下是描述”活体检验API”背景的一些关键点:…

python dropna怎么用

pandas的设计目标之一就是使得处理缺失数据的任务更加轻松些。pandas使用NaN作为缺失数据的标记。 使用dropna使得滤除缺失数据更加得心应手。 dropna常用参数: # DataFrame.dropna(axis0, howany, threshNone, subsetNone, inplaceFalse) 主要的2个参数&#xff…

首个共同祖先

题目链接 首个共同祖先 题目描述 注意点 所有节点的值都是唯一的p、q 为不同节点且均存在于给定的二叉树中 解答思路 第一种思路是后序遍历找到包含p和q时的根节点(注意可能是p或q作为根节点),对于任一节点node,会先查找其左…

win10及11暂停更新永久

windows更新永久暂停 winr 输入 regedit 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 新建 名称FlightSettingsMaxPauseDays 右击修改为9999代表禁用天数推迟,基数改16进制 点击高级选项调整截止日期,因为我一开始设置的6666所以是6666

ssldump一键分析网络流量(KALI工具系列二十二)

目录 1、KALI LINUX 简介 2、ssldump工具简介 3、在KALI中使用ssldump 3.1 目标主机IP(win) 3.2 KALI的IP 4、操作示例 4.1 监听指定网卡 4.2 指定端口 4.3 特定主机 4.4 解码文件 4.5 显示对话摘要 4.6 显示加密数据(需要私钥&…

分贝通到餐解决方案全新升级

消费小票总是神出鬼没;申请、报销驴唇不对马嘴;虚报陷阱难逐一排查 部门餐标视而不见;单笔超支屡见不鲜;规则复杂总被吐槽记不住 发票、单据多如牛毛;发票合规层出不穷;审核对账气血两亏; ...... 针对上述问题,分贝通全面升级了到餐解决方案。 从一线CBD商务区到地方县城,优…

微信服务号营销新篇章:HubSpot与MessageBox的强强联合

随着全球数字化浪潮的推进,越来越多的企业开始寻求海外市场的拓展机会。在这个过程中,微信服务号作为一个强大的数字化工具,为企业提供了无限的商业可能。本文将详细解析微信服务号的概念、功能、使用方法,以及它与HubSpot、Messa…

一个网站稳定的重要性

1.网站的初期 在网站的初期需要在网站的开发和搭建上花时间,正是网站诞生的时候,但是网站的基础建设是非常的重要,也就是说网站的底层的架构要牢固,要有一种顾忌以后扩展和稳定的开发觉悟,只有基础做好了&#…

深度学习 --- stanford cs231 编程作业(assignment1,Q3: softmax classifier)

stanford cs231 编程作业(assignment1,Q3: softmax classifier softmax classifier和svm classifier的assignment绝大多部分都是重复的,这里只捡几个重点。 1,softmax_loss_naive函数,尤其是dW部分 1,1 正向传递 第i张…

物业抄表与收费系统的现代化解决方案

1.系统简述 物业抄表与收费系统是当代物业管理方法不可或缺的一部分,它通过自动化的形式,高效地管理方法电力能源使用数据,提升收费标准高效率,降低人为失误,同时提供数据统计分析适用。该系统不但优化了物业企业的日…

人脸识别之--计算余弦相似度-android

余弦相似度是比对两个向量是否一致,余弦相似度是通过计算两个向量的夹角余弦值来衡量它们之间的相似度,算出来的值可以直接用作相似度的分数。 公式: 余弦相似度和欧式距离经常用来人脸识别特征对比。 其中: 1、余弦相似度是通…

vue富文本wangeditor加@人功能(vue2 vue3都可以)

依赖 "wangeditor/editor": "^5.1.23", "wangeditor/editor-for-vue": "^5.1.12", "wangeditor/plugin-mention": "^1.0.0",RichEditor.vue <template><div style"border: 1px solid #ccc; posit…

python中字典的创建

1.字典的概念 字典是一种存储键值对的结构。 在python中能够根据键&#xff08;key&#xff09;来快速找到值&#xff08;value&#xff09; 根据key能够快速的找到value&#xff08;一对一的映射关系&#xff09; 在python的字典中&#xff0c;可以同时包含很多个键值对&am…

江协科技STM32学习- 2安装Keil5-MDK

本文是根据哔哩哔哩网站上“江协科技STM32”视频的学习笔记&#xff0c;在这里会记录下江协科技STM32开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技STM32教学视频和链接中的内容。 引用&#xff1a; STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩…

基于小波脊线的一维时间序列信号分解方法(MATLAB R2018A)

信号分解技术是把一个复杂信号分解为若干含有时频信息的简单信号&#xff0c;研可通过分解后的简单信号来读取和分析复杂信号的有效特征。因此&#xff0c;信号分解技术对分析结果的影响是不言而喻的。 傅里叶分解是早期常用的信号分解方法&#xff0c;最初被用于分析热过程&a…

这些代码是APP自动化插件开发的关键!

在移动互联网高速发展的今天&#xff0c;APP的自动化插件开发成为了提升应用功能性和用户体验的重要手段。 而在这一过程中&#xff0c;五段源代码的巧妙运用往往能够起到事半功倍的效果&#xff0c;本文将为您科普分享这五段关键的源代码&#xff0c;帮助您更好地理解和应用自…

SJ708-II安全帽垂直间距配带高度测量仪

一、主要用途 依据GB/T2811-2007和GB/T2812-2006最新国家标准研发&#xff0c;主要用于安全帽垂直间距和配带高度试验&#xff0c;是安全帽生产企业办理生产许可证以及LA(劳安)认证&#xff0c;监督检测单位&#xff0c;科研机构必备安全帽检测设备。 二、仪器特征 1、采用铝…