数据爬取技术进阶:从表单提交到页面点击的实现

ops/2024/11/20 18:21:09/

<a class=爬虫代理" />

引言

随着互联网的迅速发展,数据需求日益多样化。简单的静态页面爬取已难以满足现代应用场景的需求,特别是在涉及到登录、表单提交、页面点击等交互操作的情况下,数据的获取变得更加复杂。为了解决这些难题,使用代理 IP 是必不可少的手段,它能有效规避网站的反爬虫机制,防止 IP 被封禁。本文将结合 Python 和代理 IP 技术,详细讲解如何从表单提交到页面点击,完成动态网页的数据爬取。

百度贴吧作为中文社区平台,涵盖了资讯、视频、图片、知道、文库等多个领域,为用户提供了广泛的交流与分享空间。贴吧的分类覆盖面极广,包括娱乐明星、体育、小说、生活、游戏、动漫、地区等,几乎涉及用户日常生活的方方面面。这种多样化的内容布局不仅为数据爬取提供了丰富的数据源,也显著增加了爬取的复杂性和技术挑战。

正文

1. 表单提交和页面点击概述

在现代网页中,许多数据需要通过用户交互才能显示。这种交互包括表单提交、页面点击、动态加载等。我们可以利用 Python 的 requestsSelenium 库来模拟这些用户行为,实现表单提交和页面点击等操作。

  • 表单提交:常用于登录界面、搜索功能,模拟用户填写表单并提交请求。
  • 页面点击:用于模拟用户点击网页按钮或链接,触发动态内容加载。
2. 使用代理 IP

在进行大规模爬取时,代理 IP 是绕过反爬虫机制的关键。本文将使用爬虫代理服务进行配置,通过在请求中添加代理,避免因频繁请求导致 IP 被限制。

代理配置示例

python"># 配置IP信息 亿牛云爬虫代理加强版 www.16yun.cn
proxy = {"http": "http://用户名:密码@域名:端口","https": "https://用户名:密码@域名:端口"
}
3. 实现流程

为了演示表单提交和页面点击的实际应用,本文选择百度贴吧(https://tieba.baidu.com/index.html)作为爬取目标。实现流程如下:

  1. 使用代理 IP 和伪装请求头:避免被检测为爬虫。
  2. 模拟登录获取 Cookie:通过 Selenium 模拟登录操作。
  3. 发帖和页面点击操作:在贴吧内模拟发帖和页面交互。
  4. 采集帖子数据:获取指定贴吧内的帖子列表和详情。

实例代码

环境准备

安装所需 Python 库和浏览器驱动:

pip install requests selenium

下载并安装 ChromeDriver:ChromeDriver 下载链接

代码实现
python">import time
import requests
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
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 Options# 配置IP信息 亿牛云爬虫代理加强版 www.16yun.cn
proxy_host = "proxy.16yun.cn"
proxy_port = "12345"
proxy_user = "your_username"
proxy_pass = "your_password"proxy = {"http": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}","https": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"
}# 请求头配置
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}# 初始化 Selenium 驱动
def init_driver():options = Options()options.add_argument(f'--proxy-server={proxy["http"]}')options.add_argument('--headless')  # 无头模式options.add_argument('--disable-gpu')options.add_argument('--ignore-certificate-errors')service = Service(executable_path='path/to/chromedriver')driver = webdriver.Chrome(service=service, options=options)return driver# 模拟登录百度贴吧
def login_tieba(driver):driver.get("https://tieba.baidu.com/index.html")# 点击登录按钮login_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "登录")))login_button.click()time.sleep(3)# 切换到用户名密码登录driver.find_element(By.XPATH, "//p[contains(text(),'用户名密码登录')]").click()# 输入用户名和密码username_input = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "TANGRAM__PSP_11__userName")))username_input.send_keys("your_baidu_username")password_input = driver.find_element(By.ID, "TANGRAM__PSP_11__password")password_input.send_keys("your_baidu_password")# 点击登录login_submit = driver.find_element(By.ID, "TANGRAM__PSP_11__submit")login_submit.click()time.sleep(5)print("登录成功")# 发帖功能
def post_tieba(driver):driver.get("https://tieba.baidu.com/f?kw=python")post_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[contains(@class,'j_th_tit')]")))post_button.click()title_input = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "tb-editor-editarea")))title_input.send_keys("Python爬虫发帖测试")content_input = driver.find_element(By.CLASS_NAME, "tb-editor-editarea")content_input.send_keys("这是通过Python脚本自动发帖的测试内容。")submit_button = driver.find_element(By.CLASS_NAME, "j_submit_btn")submit_button.click()print("发帖成功")# 采集帖子数据
def scrape_posts(driver):driver.get("https://tieba.baidu.com/f?kw=python")posts = driver.find_elements(By.CLASS_NAME, 'j_th_tit')for post in posts[:5]:print(post.text, post.get_attribute('href'))# 主程序入口
if __name__ == "__main__":driver = init_driver()try:login_tieba(driver)post_tieba(driver)scrape_posts(driver)finally:driver.quit()

结论

本文通过 Python 的 requestsSelenium 库,结合代理 IP 技术,详细展示了如何在动态网页环境下实现从表单提交到页面点击的数据爬取。选取百度贴吧作为示例,完整演示了登录、发帖和数据采集的流程。

通过本案例可以看出,在面对现代网页复杂的交互和反爬机制时,结合代理 IP、模拟浏览器操作和请求伪装,是实现高效数据爬取的关键。


http://www.ppmy.cn/ops/135296.html

相关文章

c++设计模式之适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09; 定义 适配器模式的目的是让不兼容的接口能够协同工作。通过定义一个适配器类&#xff0c;将原本接口不兼容的两种类的接口转化为一致的接口&#xff0c;使得原本无法交互的类可以互操作。 应用场景 当你希望将一些已经存在…

vscode 关闭绑定元素 隐式具有“any”类型这类错误

在vue的项目里面&#xff0c;经常看到any类型的报错&#xff0c;真的很烦的 在tsconfig.json中配置以下参数 “noImplicitAny”: false 就可以了 出现类型“never”上不存在属性“userName”。ts-plugin(2339) 配置该参数 modeuleResolution : node "compilerOptions&qu…

【Qt 蓝牙服务器实现】

在 Qt 中实现一个蓝牙服务器可以使用 Qt Bluetooth 模块。下面是一个基本的蓝牙服务器示例,它能够接受来自客户端的连接。 首先,请确保你已经安装了 Qt Bluetooth 模块并在项目文件中包含了相关库。 1. 项目文件 (.pro) 配置 在项目文件中添加以下行,以确保包含 Qt Bluet…

IO流(九):打印流-字节打印流PrintStream、字符打印流PrintWriter

目录 1、什么是打印流&#xff1f; 2、字节打印流-PrintStream 2.1 代码演示以及注释 2.2 演示几种字节打印流常用的创建方式 3、字符打印流-PrintWriter 3.1 代码演示以及注释 3.2 演示几种字符打印流常用的创建方式 4、案例-System.out.println();输出内容重定向到指…

vue功能基础元素使用

4.:inline"true"元素&#xff0c;能够左右元素保持在同一行 这个好处非常直观&#xff0c;但要注意和el-col同时使用时&#xff0c;就会出现el-input换行&#xff0c;即便调整好&#xff0c;放大缩小也会出现换行问题。 5.filterable 下拉框带搜索功能 6.clearable下…

JSONP处理跨域请求

JSONP 背景 由于浏览器存在安全策略&#xff0c;所以当访问的请求中的协议、域名、端口其中一个与本站不同时就会形成跨域&#xff0c;这里介绍一种比较简单的方案——jsonp。 原理 浏览器对 script、img这些带有src属性的的标签在发送请求时是不会触发跨域的校验&#xff…

tcp的网络惊群问题

1. SO_REUSEPORT 可以解决epoll的惊群问题 但是&#xff0c;现在的 TCP Server&#xff0c;一般都是 多进程多路IO复用(epoll) 的并发模型&#xff0c;比如我们常用的 nginx 。如果使用 epoll 去监听 accept socket fd 的读事件&#xff0c;当有新连接建立时&#xff0c;所有进…

时序数据基础TDEngine

时序数据基础 什么是时序数据&#xff1f;​ 时序数据&#xff0c;即时间序列数据&#xff08;Time-Series Data&#xff09;&#xff0c;它们是一组按照时间发生先后顺序进行排列的序列数据。日常生活中&#xff0c;设备、传感器采集的数据就是时序数据&#xff0c;证券交易…