Python爬虫技术详解:从基础到高级应用,实战与应对反爬虫策略【第93篇—Python爬虫】

前言

随着互联网的快速发展,网络上的信息爆炸式增长,而爬虫技术成为了获取和处理大量数据的重要手段之一。在Python中,requests模块是一个强大而灵活的工具,用于发送HTTP请求,获取网页内容。本文将介绍requests模块的基础用法,并通过实际代码演示,带领读者一步步掌握常用爬虫技术。

image-20240223143051519

安装requests模块

首先,确保你的Python环境中已经安装了requests模块。如果没有安装,可以使用以下命令进行安装:

pip install requests

基础用法

发送GET请求

import requestsurl = 'https://www.example.com'
response = requests.get(url)print(response.text)

以上代码通过requests.get()方法发送了一个GET请求,并将服务器的响应存储在response对象中。response.text包含了网页的HTML内容。

发送带参数的GET请求

import requestsurl = 'https://www.example.com/search'
params = {'q': 'python', 'page': 1}
response = requests.get(url, params=params)print(response.text)

在这个例子中,我们通过params参数传递了查询字符串参数,这对于搜索等需要动态参数的场景非常有用。

发送POST请求

import requestsurl = 'https://www.example.com/login'
data = {'username': 'your_username', 'password': 'your_password'}
response = requests.post(url, data=data)print(response.text)

通过requests.post()方法,我们可以发送POST请求并传递表单数据,模拟登录等操作。

代码实战:爬取网页内容

让我们通过一个实际的例子,使用requests模块爬取并解析网页内容。

import requests
from bs4 import BeautifulSoupurl = 'https://www.example.com'
response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')# 解析网页内容
title = soup.title.text
paragraphs = soup.find_all('p')# 打印结果
print(f'Title: {title}\n')
print('Paragraphs:')
for paragraph in paragraphs:print(paragraph.text)

在这个示例中,我们使用了BeautifulSoup库来解析HTML内容。首先,我们获取网页内容,然后通过BeautifulSoup的解析器解析HTML。最后,通过选择器定位标题和段落等信息,实现对网页内容的抽取。

进阶用法

设置请求头

有些网站可能需要模拟浏览器进行访问,因此我们可以通过设置请求头来伪装请求:

import requestsurl = 'https://www.example.com'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
response = requests.get(url, headers=headers)print(response.text)

在这个例子中,我们通过headers参数设置了用户代理,模拟了一个浏览器访问。

处理Cookies

有些网站通过Cookies来进行用户认证和跟踪,我们可以使用requests模块来处理Cookies:

import requestsurl = 'https://www.example.com'
response = requests.get(url)# 获取Cookies
cookies = response.cookies# 使用Cookies进行后续请求
response2 = requests.get('https://www.example.com/some_page', cookies=cookies)print(response2.text)

处理异常

在实际爬虫中,网络请求可能会遇到各种异常情况,为了保证爬虫的稳定性,我们可以添加异常处理:

import requestsurl = 'https://www.example.com'try:response = requests.get(url)response.raise_for_status()  # 检查请求是否成功print(response.text)
except requests.exceptions.HTTPError as errh:print(f"HTTP Error: {errh}")
except requests.exceptions.ConnectionError as errc:print(f"Error Connecting: {errc}")
except requests.exceptions.Timeout as errt:print(f"Timeout Error: {errt}")
except requests.exceptions.RequestException as err:print(f"Request Exception: {err}")

代码实战:使用requests模块爬取天气数据

为了进一步加深对requests模块的理解,我们将通过一个实际的案例,使用该模块爬取实时天气数据。在这个例子中,我们将使用OpenWeatherMap提供的API来获取天气信息。

首先,你需要在OpenWeatherMap注册账号并获取API Key。然后,我们可以使用以下代码来获取实时天气信息:

import requests
import json# 替换为你自己的OpenWeatherMap API Key
api_key = 'your_api_key'
city = 'Berlin'  # 替换为你要查询的城市# 构造API请求URL
url = f'http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}'try:response = requests.get(url)response.raise_for_status()  # 检查请求是否成功# 解析JSON格式的响应weather_data = response.json()# 提取天气信息temperature = weather_data['main']['temp']description = weather_data['weather'][0]['description']# 打印结果print(f'Current temperature in {city}: {temperature}°C')print(f'Weather description: {description}')except requests.exceptions.HTTPError as errh:print(f"HTTP Error: {errh}")
except requests.exceptions.ConnectionError as errc:print(f"Error Connecting: {errc}")
except requests.exceptions.Timeout as errt:print(f"Timeout Error: {errt}")
except requests.exceptions.RequestException as err:print(f"Request Exception: {err}")

在这个例子中,我们构造了一个API请求URL,发送GET请求获取天气信息。然后,使用json模块解析返回的JSON数据,并提取出温度和天气描述信息。最后,打印结果。

这个实例展示了如何使用requests模块来访问API,并处理返回的JSON数据。这对于获取实时数据或者进行数据分析非常有用。在实际项目中,你可以根据需要扩展这个例子,比如添加更多的天气信息或者结合其他API来获取更多有用的数据。

高级应用:使用Session保持会话状态

在某些情况下,我们需要保持会话状态,模拟用户在同一个会话中进行多个请求,比如登录后爬取需要登录状态的页面。为了实现这一功能,可以使用Session对象。

以下是一个简单的例子,模拟登录GitHub并获取登录后的用户页面:

import requestslogin_url = 'https://github.com/login'
user_url = 'https://github.com/your_username'# 替换为你的GitHub用户名和密码
username = 'your_username'
password = 'your_password'# 创建一个Session对象
session = requests.Session()# 发送登录请求
login_data = {'login': username, 'password': password}
login_response = session.post(login_url, data=login_data)# 检查登录是否成功
if 'Sign out' in login_response.text:print('Login successful!')# 使用保持会话状态的Session对象进行后续请求user_response = session.get(user_url)# 处理用户页面的响应print(user_response.text)
else:print('Login failed.')

在这个例子中,我们使用Session对象首先发送登录请求,将登录信息保存在会话中。然后,使用同一个会话对象进行后续的请求,这样就能够保持登录状态,获取登录后的页面内容。

附加内容:处理动态网页和反爬虫策略

在实际爬虫过程中,经常会遇到动态网页和反爬虫策略。动态网页是指页面的内容通过JavaScript等前端技术动态加载,而不是一开始就包含在HTML中。为了处理这种情况,我们可以使用Selenium等工具。

使用Selenium处理动态网页

首先,确保你已经安装了Selenium:

pip install selenium

然后,通过以下代码使用Selenium模拟浏览器行为:

from selenium import webdriver
import timeurl = 'https://example.com'
driver = webdriver.Chrome()  # 请确保已安装ChromeDriver,并将其路径添加到系统环境变量中try:driver.get(url)# 等待页面加载time.sleep(3)# 获取页面内容page_content = driver.page_sourceprint(page_content)finally:driver.quit()

在这个例子中,我们使用了Chrome浏览器驱动,打开了一个网页并等待3秒,然后获取了页面的源代码。通过这种方式,我们可以获取到动态加载的内容。

处理反爬虫策略

有些网站为了防止被爬虫访问,采取了一些反爬虫策略,比如设置访问频率限制、验证码验证等。在面对这些情况时,我们可以采取以下措施:

  • 设置请求头: 模拟浏览器行为,设置合适的User-Agent和Referer等请求头,使请求看起来更像正常用户的访问。

  • 使用代理IP: 轮换使用代理IP可以降低被封禁的风险,但注意代理IP的合法性和稳定性。

  • 处理验证码: 使用第三方库或者服务识别和处理验证码,自动化解决验证码问题。

  • 合理设置访问频率: 避免过于频繁的访问,可以通过设置访问间隔或者使用随机休眠时间来规避被封禁的风险。

请注意,爬虫行为应当遵循网站的使用规则,并尊重相关法律法规。过于频繁或不当的爬取行为可能导致IP封禁或其他法律责任。在实际应用中,可以根据具体情况灵活调整策略,确保爬虫的合法性和稳定性。

总结:

通过本文的详细介绍,读者对Python爬虫技术有了从基础到高级的全面了解。我们从requests模块的基础用法开始,包括发送GET和POST请求、处理参数、设置请求头、处理Cookies、异常处理等方面。通过实际的代码演示,读者学会了如何使用requests模块进行网络爬取,并解析HTML内容,实现数据的抽取。

随后,我们进行了一个实际的爬虫项目,使用requests模块获取实时天气数据,并通过JSON解析提取所需信息。这个实例展示了如何使用爬虫技术获取实时数据,为数据分析和应用提供支持。

在高级应用部分,我们介绍了使用Session对象保持会话状态,模拟用户在同一个会话中进行多个请求的方法。同时,我们提及了使用Selenium处理动态网页和一些反爬虫策略的方法,使得爬虫能够更好地应对复杂的网站结构和防护机制。

最后,强调了在实际应用中需要遵循网站的使用规则,合法合规地进行网络爬取。在面对动态网页和反爬虫策略时,我们介绍了一些常见的应对措施,包括使用Selenium、设置请求头、使用代理IP、处理验证码等。

希望本文能够帮助读者建立起扎实的爬虫基础,理解爬虫技术的广泛应用,同时对于高级应用和反爬虫策略有一定的认识。在实际项目中,读者可以根据需要灵活运用这些技术,提升爬虫的效率和稳定性。

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

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

相关文章

力扣hot100题解(python版7-9题)

7、接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,…

JSON(javaScript Object Notation,Js对象标记)—我耀学IT

Json是一种轻量级的数据交换格式,目前使用非常广泛,是一种轻量级的数据交换格式。易于人阅读和编写,可以在多种语言之间进行数据交换 。同时也易于机器解析和生成 1.1json的值: 值可以是对象、数组、数字、字符串或者三个字面值(false、nul…

PBM模型学习

本专栏着重讲解PBM学习所得,学习笔记、心得,并附有视频素材资料,视频详细目录如下: PBM相关参数解释1 PBM相关参数解释2 PBM相关案例实践1 PBM相关案例实践2 PBM相关案例实践2 PBM相关案例实践3 PBM多相流中次相界面设置1 PBM多相…

Ubuntu20.04开启/禁用ipv6

文章目录 Ubuntu20.04开启/禁用ipv61.ipv62. 开启ipv6step1. 编辑sysctl.confstep2. 编辑网络接口配置文件 3. 禁用ipv6(sysctl)4. 禁用ipv6(grub)附:总结linux网络配置 Ubuntu20.04开启/禁用ipv6 1.ipv6 IP 是互联网…

mysql和sql server 中如何创建和管理用户

阅读本文之前请参阅----MySQL 数据库安装教程详解(linux系统和windows系统) 在MySQL和SQL Server中创建和管理用户的过程有所不同。下面分别介绍这两种数据库系统中用户管理的常见步骤。 MySQL 创建用户 在MySQL中创建用户的语法通常如下…

Oracle迁移到mysql-表结构的坑

1.mysql中id自增字段必须是整数类型 id BIGINT AUTO_INCREMENT not null, 2.VARCHAR2改为VARCHAR 3.NUMBER(16)改为decimal(16,0) 4.date改为datetime 5.mysql范围分区必须int格式,不能list类型 ERROR 1697 (HY000): VALUES value for partition …

Redis 事务机制之ACID属性

事务属性 事务是对数据库进行读写的一系列操作。在事务执行时提供ACID属性保证: 包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)…

YOLOv5改进 | Conv篇 | 利用YOLOv9的GELAN模块替换C3结构(附轻量化版本 + 高效涨点版本 + 结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的GELAN模块来改进YOLOv5中的C3,GELAN融合了CSPNet和ELAN机制同时其中利用到了RepConv在获取更多有效特征的同时在推理时专用单分支结构从而不影响推理速度,同时本文的内容提供了两种版本一…

8.qt5使用opencv的库函数打开图片

1.配置opencv动态库的环境变量 2.在创建的qt工程中加入如下opencv代码,具体代码如下: 使用opencv库函数显示图片

ACL权限、特殊位与隐藏属性的奥秘

1.2 操作步骤 # 1. 添加测试目录,用户,组,并将用户添加到组 ------------------- [rootlocalhost ~]# mkdir /project[rootlocalhost ~]# useradd zs[rootlocalhost ~]# useradd ls[rootlocalhost ~]# groupadd tgroup[rootlocalhost ~]# g…

亿道丨三防平板丨加固平板丨为零售业提供四大优势

随着全球经济的快速发展,作为传统行业的零售业也迎来了绝佳的发展机遇,在互联网智能化的大环境下,越来越多的零售企业选择三防平板电脑作为工作中的电子设备。作为一种耐用的移动选项,三防平板带来的不仅仅是坚固的外壳。坚固耐用…

4 buuctf解题

[CISCN 2019 初赛]Love Math1 打开题目 题目源码 <?php error_reporting(0); //听说你很喜欢数学&#xff0c;不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];if (strlen($content) > 80) {die("…

在项目中应用设计模式的实践指南

目录 ✨✨ 祝屏幕前的您天天开心&#xff0c;每天都有好运相伴。我们一起加油&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 引言 一. 单例模式&#xff08;Singleton Pattern&#xff09; 1、实现单例模式的方式 1…

回归预测 | Matlab实现PSO-BiLSTM-Attention粒子群算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测

回归预测 | Matlab实现PSO-BiLSTM-Attention粒子群算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测 目录 回归预测 | Matlab实现PSO-BiLSTM-Attention粒子群算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测预测效果基本描述程序设计参考资料 预测效果…

使用 yarn 的时候,遇到 Error [ERR_REQUIRE_ESM]: require() of ES Module 怎么解决?

晚上回到家&#xff0c;我打开自己的项目&#xff0c;执行&#xff1a; cd HexoPress git pull --rebase yarn install yarn dev拉取在公司 push 的代码&#xff0c;然后更新依赖&#xff0c;最后开始今晚的开发时候&#xff0c;意外发生了&#xff0c;竟然报错了&#xff0c;…

easyui 手风琴Accordion 面板的高度设置

今天接到一个新的小需求&#xff0c;如下图&#xff0c;当预算表单只有一个时&#xff0c;要求不显示预算表单这块的内容。 考虑到页面创建时用到了表单的回调和点击方法&#xff0c;所以不能单纯的移除&#xff0c;移除右侧表格的创建会报错&#xff0c;所以只能隐藏。 隐藏…

Flutter 数据持久化存储之Hive

Flutter 数据持久化存储之Hive 前言正文一、配置项目二、UI① 增加UI② 显示和删除UI 三、使用Hive① 初始化Hive② TypeAdapter自定义对象③ 注册TypeAdapter③ CURD 四、源码 前言 在Flutter中&#xff0c;有多种方式可以进行数据持久化存储。以下是一些常见的方式&#xff1…

Java核心-核心类与API(2)

话接上回&#xff0c;继续核心类与API的学习&#xff0c;这次介绍StringBuffer/StringBuilder/StringJoiner类。StringBuffer和StringBuilder是我们学习的重点&#xff0c;建议对比学习&#xff0c;做好区分。 一、StringBuffer类 1、概述 1&#xff09;问题 由于 String 类…

CLion 2023:专注于C和C++编程的智能IDE mac/win版

JetBrains CLion 2023是一款专为C和C开发者设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它集成了许多先进的功能&#xff0c;旨在提高开发效率和生产力。 CLion 2023软件获取 CLion 2023的智能代码编辑器提供了丰富的代码补全和提示功能&#xff0c;使您能够更…

❤ hexo主题+Gitee搭建个人博客

Hexo的基本使用 1. ​认识 官网 官网地址&#xff1a;https://hexo.io/zh-cn/ 介绍 Hexo是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown&#xff08;或其他渲染引擎&#xff09;解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。即把用…