Python爬虫入门03:用Urllib假装我们是浏览器

news2024/12/26 12:11:32

文章目录

      • 引言
      • Urllib库简介
        • Request模块详解
        • Error模块与异常处理
        • Parse模块与URL解析
        • Robotparser模块
      • 模拟浏览器请求
        • 使用Request方法添加请求头信息
        • 代码示例
          • 1. 设置请求URL和请求头
          • 2. 定义请求参数并转换为适当的格式
          • 3. 使用Request方法封装请求
          • 4. 发送请求并获取响应
        • 常用使用方法总结
        • 模拟请求的重要性和实用性
        • 结语

引言

在网络的世界里,浏览器是我们与互联网沟通的桥梁。当我们在浏览器地址栏输入一个网址或点击一个链接时,浏览器就会向服务器发起一个HTTP请求。服务器接收到请求后,会处理并返回相应的数据,这通常是一个HTML页面、一张图片或一段视频。这些数据随后会被浏览器解析并展示给我们。

然而,在自动化测试或数据抓取的场景中,我们可能需要用程序模拟浏览器的行为,这就是Python的Urllib库大显身手的地方。Urllib是一个强大的内置库,它允许我们用代码来发送请求、接收响应,就像浏览器一样。

Urllib库简介

Python的Urllib库是一个用于处理URL的库,它提供了一系列丰富的功能来帮助我们与互联网进行交互。Urllib库主要由以下四个模块组成:

  • request:用于发起网络请求。
  • error:包含定义和处理请求错误的异常类。
  • parse:用于解析URL以及URL的各个组成部分。
  • robotparser:用于解析网站的robots.txt文件,以确定哪些页面可以被爬虫访问。
Request模块详解

Request模块是Urllib中使用最频繁的模块之一。它允许我们构造请求并发送到服务器。以下是一些常用方法和语法:

  • urllib.request.urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *, cafile=None, capath=None, cadefault=False, context=None):发送GET或POST请求。
    • url:请求的URL地址。
    • data:发送的数据,通常用于POST请求。
    • timeout:请求的超时时间。

代码示例:

import urllib.request

# 发起GET请求
response = urllib.request.urlopen('http://www.example.com')
print(response.read().decode('utf-8'))

# 发起POST请求
data = bytes(urllib.parse.urlencode({'key': 'value'}).encode('utf-8'))
response = urllib.request.urlopen('http://www.example.com', data)
print(response.read().decode('utf-8'))
Error模块与异常处理

Error模块提供了一些异常类,用于处理网络请求过程中可能遇到的错误。常见的异常有:

  • urllib.error.URLError:所有URL错误的基类。
  • urllib.error.HTTPError:HTTP错误,包含状态码和错误信息。

异常处理示例:

try:
    response = urllib.request.urlopen('http://www.example.com')
except urllib.error.URLError as e:
    print('Failed to reach a server:', e.reason)
Parse模块与URL解析

Parse模块提供了一些函数来解析URL和构造URL。常用函数包括:

  • urllib.parse.urlparse(url):将URL分解为6个组件:scheme, netloc, path, params, query, fragment。
  • urllib.parse.urlencode(query, doseq=False, encoding='utf-8'):将字典或列表字典编码成x-www-form-urlencoded格式的数据。

URL解析示例:

from urllib.parse import urlparse, urlencode

url = 'http://www.example.com/path?arg=value#anchor'
parsed_url = urlparse(url)
print(parsed_url.scheme, parsed_url.netloc, parsed_url.path)

data = {'key1': 'value1', 'key2': 'value2'}
encoded_data = urlencode(data)
print(encoded_data)
Robotparser模块

Robotparser模块用于解析网站的robots.txt文件,这个文件用来告诉爬虫哪些页面可以访问,哪些不可以。Robotparser模块的常用方法包括:

  • urllib.robotparser.RobotFileParser().set_url(url):设置robots.txt文件的URL。
  • urllib.robotparser.RobotFileParser().can_fetch(user_agent, url):判断指定的爬虫是否可以访问某个URL。

Robotparser使用示例:

from urllib.robotparser import RobotFileParser

rp = RobotFileParser()
rp.set_url('http://www.example.com/robots.txt')
if rp.can_fetch('*', 'http://www.example.com/somepage'):
    print('This page can be fetched.')
else:
    print('This page cannot be fetched.')

通过这些模块和方法,我们可以使用Python的Urllib库来构建复杂的网络请求,模拟浏览器行为,进行自动化测试或数据抓取。

模拟浏览器请求

在网络请求中,服务器可以通过请求头(Headers)来获取发起请求的客户端信息,例如使用的浏览器类型、操作系统、语言偏好等。通过模拟这些请求头信息,我们可以欺骗服务器,让它认为请求来自于一个真实的浏览器或移动设备,这对于某些需要特定用户代理(User-Agent)才能访问的网站尤其有用。

使用Request方法添加请求头信息

urllib.request.Request 方法允许我们自定义请求的各个方面,包括URL、请求方法、数据以及请求头。以下是构造请求头信息的基本步骤:

  1. 构造请求头字典:定义一个字典,包含所有需要的请求头信息,如User-AgentAccept-LanguageReferer等。

  2. 创建Request对象:使用urllib.request.Request构造函数创建一个请求对象,传入URL、数据(如果有)、请求头以及请求方法。

  3. 发送请求:使用urllib.request.urlopen方法发送请求,并获取响应。

代码示例

以下是一个构造请求头信息并发起自定义GET请求的示例:

import urllib.request
import urllib.parse

# 构造请求头信息
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
    'Accept-Language': 'en-US,en;q=0.5',
    'Referer': 'http://www.example.com/'
}

# 创建请求对象
url = 'http://www.example.com/somepage'
request = urllib.request.Request(url, headers=headers)

# 发送请求并获取响应
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

对于POST请求,除了设置请求头,我们还需要传递数据:

# 构造POST请求的数据
data = {'key1': 'value1', 'key2': 'value2'}.items()
data = urllib.parse.urlencode(data).encode('utf-8')

# 创建请求对象,指定POST方法
request = urllib.request.Request(url, data=data, headers=headers, method='POST')

# 发送请求并获取响应
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

通过这种方式,我们可以模拟浏览器或手机的请求,绕过一些简单的客户端验证,获取服务器的响应数据。然而,需要注意的是,某些网站可能使用更复杂的机制来验证请求的合法性,仅仅修改请求头可能不足以成功模拟请求。

  1. 实战演练:模拟登录操作
    • 选择一个具体网站(如百度)作为示例。

    • 抓取登录页面的请求参数和请求头信息。

    • 这里的具体方法就是打开fiddler,然后打开百度的网页,选择登录,提交表单后抓取到这个表单信息,如下在这里插入图片描述

    • 接着是我们的请求头信息:

    • 在这里插入图片描述

    • 编写代码模拟登录过程:
      根据您的要求,下面是按照指定顺序组织的代码示例:

1. 设置请求URL和请求头
import urllib.parse
import urllib.request
import ssl
import json

# 创建SSL上下文
context = ssl.create_default_context()

# 设置请求URL(请替换为实际的登录API URL)
url = "https://www.baidu.com/some_actual_login_api"

# 设置请求头,模拟浏览器访问
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
}
2. 定义请求参数并转换为适当的格式
# 定义请求参数字典
params = {
    "username": "your_username",  # 替换为您的用户名
    "password": "your_password",  # 替换为您的密码
    # 其他参数根据API要求添加
}

# 对参数字典进行URL编码
encoded_params = urllib.parse.urlencode(params).encode('utf-8')
3. 使用Request方法封装请求
# 使用Request方法封装请求
request = urllib.request.Request(
    url,
    data=encoded_params,  # 发送编码后的参数
    headers=headers,      # 设置请求头
    method='POST'         # 指定请求方法为POST
)
4. 发送请求并获取响应
try:
    # 发送请求并获取响应
    with urllib.request.urlopen(request, context=context) as response:
        response_data = response.read().decode('utf-8')
        print("Response from server:", response_data)
except urllib.error.HTTPError as e:
    print(f"HTTPError: {e.code} - {e.msg}")
except urllib.error.URLError as e:
    print(f"URLError: {e.reason}")
except Exception as e:
    print(f"An unexpected error occurred: {e}")
常用使用方法总结
  1. 使用urlopen方法:进行基本的GET请求,获取网页内容。
  2. 自定义请求头:通过构造Request对象,模拟浏览器或移动设备的请求头,以绕过一些简单的客户端验证。
  3. 异常处理:使用error模块中的异常类来处理请求过程中可能出现的错误。
  4. URL解析:利用parse模块解析和构造URL,处理查询字符串。
  5. 遵守Robot协议:使用robotparser模块来检查爬虫是否被允许访问特定的页面。
模拟请求的重要性和实用性

使用Urllib进行模拟请求在多个领域都有其重要性和实用性:

  1. 自动化测试:自动化测试脚本可以模拟用户行为,测试网站的功能和性能。
  2. 数据抓取:爬虫程序可以通过模拟浏览器请求来获取网页数据,进行信息收集和分析。
  3. API交互:与Web API进行交互时,Urllib可以用来发送请求并接收响应。
  4. 跨平台兼容性:由于Urllib是Python的内置库,它在不同的操作系统上都能保持一致的行为,这使得编写跨平台的网络应用程序变得更加容易。
结语

虽然Urllib提供了丰富的功能来处理网络请求,但在实际应用中,我们还需要考虑到请求的效率、网站的反爬虫策略以及数据的合法使用等问题。合理利用Urllib库,不仅可以提高开发效率,还可以帮助我们更好地理解和使用网络资源。随着技术的不断进步,我们也应该持续学习新的库和框架,以适应不断变化的网络环境。

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

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

相关文章

项目实战_表白墙(升级版)

你能学到什么 表白墙(升级版)Mybatis的一些简单应用 正文 前⾯的案例中, 我们写了表⽩墙, 但是⼀旦服务器重启, 数据就会丢失. 要想数据不丢失, 需要把数据存储在数据库中,接下来咱们借助MyBatis来实现数据库的操作。 数据准备 如果我们…

Linux-用户和用户组管理

用户管理 创建 useradd USERNAME(名字) [rootlocalhost ~]# useradd bao 创建指令 怎么判断创建成功与否(是否报错) 观察是否报错可行但用变量的方式判断会更加直观 [rootlocalhost ~]# echo $? 变量 什么是变量&…

Vant2框架tab切换list不加载问题(切换后onload不继续触发)

遇到的问题: van-list 加载,页面上有个切换的 van-tab,实现切换不同的类型,加载不同的list的功能。 Vant2 的 List 列表 就有个 bug,当切换 tab 的时候,它的 onload 没有自动触发。 然而在当前标签页&#…

AMD第二季度财报:数据中心产品销售激增,接近总收入一半

#### 财报亮点 7月30日,AMD公布了截至6月29日的第二季度财务业绩,利润超过了华尔街的预期。根据TechNews的报道,最值得注意的是,AMD现在近一半的销售额来自于数据中心产品,而非传统的PC芯片、游戏主机或是工业与汽车嵌…

IDEA打开项目显示在顶端

问题 IDEA打开项目显示在顶端,更改到左侧 解决方案 删除项目中.idea文件,重新打开

【pikachu靶场】跨站脚本攻击详细教程Cross-Site Scripting(xss)

文章目录 XSS(跨站脚本)概述 1.反射型xss(get) 2.反射型xss(post) 3.存储型XSS 4.DOM型xss 5.DOM型XSS-X 6.xss之盲打 7.xss之过滤 8.xss之htmlspecialchars 9.xss之href输出 10.xss之js输出 XSS…

并发编程相关面试题-Synchronized

重量级锁实现的原理 1、synchronized是JVM内置锁,基于Monitor机制实现,依赖底层操作系统的互斥锁Mutex(互斥量),它是一个重量级锁、 2、synchronized同步方法是通过方法中的access_flags中设置ACC_SYNCHRONIZED标志来…

换根dp学习总结3

我也不想搞这么多,但是这东西真的太难了,因为我还是个蒟蒻。算了蒟蒻继续写这次的总结了 寻找全图最远路径问题——Computer ——题目来源于hdu2196 题意:题目就是说会输入多组数据,每组数据给你一个n,表示结点的总数…

怎么评价程序员40岁了竟然还在撸代码?

怎么评价外卖员40岁了竟然还在送外卖? 怎么评价滴滴司机40岁了竟然还在跑滴滴? 怎么评价老师40岁了竟然还在教书?难道程序员的本职工作不是敲代码吗?无论你是管理层还是螺丝钉,工业环境下怎么可能一行代码都不敲呢&…

RocketMQ Dashboard安装

RocketMQ Dashboard 是一个基于 Web 的管理工具,用于监控和管理 RocketMQ 集群。它提供了一个用户友好的界面,使管理员能够轻松地查看和操作 RocketMQ 系统中的各种组件和状态。 主要功能包括: 集群管理: 监控和管理 NameServer 和 Broker …

web框架:django基础(二)

文章目录 django基础(二)1.回顾2.今日概要3.路由系统3.1 传统的路由3.2 正则表达式路由3.3 路由分发小结 3.4 name3.5 namespaceapp_namenamespace的多层嵌套 3.4 最后的 / 如何解决?3.5 当前匹配对象小结 4.视图4.1 文件or文件夹4.2 相对和绝…

《QDebug 2024年7月》

一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.Qt5 QML 在某些环境下,有些字体中文渲染有问题 如 Qt5.15 在部分安卓机上复制的复只有半截宽,半径的径字也不对,等等 用 Qt6.7 测试则正常,或者换成其他如小米、阿里巴巴…

Golang的TLS版本配置参数-排坑经历

一、背景 公司有个黑盒监控拨测组件,类似可以通过各种协议如HTTP、TCP、ICMP等等针对目标主机、目标IP、目标站点进行定时拨测,通过返回的状态码等信息来推断,目标业务系统/主机、站点是否存在异常,健康情况如何。 最近在配置一个…

一文搞懂机器学习!2024.6月最新!(附代码实现)

前言 机器学习入门精品文章 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文介绍机器学习的基础内容。 机器学习是人工智能的一个分支,它使计算机系统能够从数据中学习并做出决策或预测&am…

Jangow-1.0.1靶机漏洞复现(未完成)

首先,这个靶机只能使用VirtualBox打开,靶机下载地址为 https://download.vulnhub.com/jangow/jangow-01-1.0.1.ova 虚拟机软件下载地址为 Download_Old_Builds – Oracle VM VirtualBox 开启靶机后访问ip进入如下页面,点击site进入到一个…

【C++】哈希容器

unordered系列关联式容器 在之前的博文中介绍过关联式容器中的map与set,同map与set一样,unordered_set与unordered_set也是关联式容器。 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,查询效率可以达到logN;在…

详解HTTP代理与SOCKS代理之间的差异

代理服务器在网络安全和隐私保护方面,发挥着十分重要的作用。其中,HTTP代理和SOCKS代理是两种常见的代理方式,它们在原理、功能和应用场景上有着明显的差异。本文将为大家深入分析这两种代理之间的区别,帮助大家更好地选择适合自己…

Linux中如何添加磁盘分区

在Linux中添加分区通常涉及到几个步骤,包括识别磁盘、创建分区、格式化分区,以及挂载或将其用作特定的文件系统类型(如LVM、RAID等)。以下是一个基本的步骤指南,假设你正在使用命令行界面(CLI)和…

《技术人求职之道》之简历优化篇(下):技能与项目亮点,如何让你的简历熠熠生辉

摘要 本文将深入探讨技术求职者在撰写简历时的关键要素,包括专业技能的表达和项目经验的描述。文章首先提出专业技能描述的六条基本原则,包括统一技术词汇、标点符号一致性、技术关键字的驼峰命名法、技术分类、技术热度和掌握度排序以及慎用“精通”。接着,指导读者如何美…

FFmpeg Windows安装教程

一. 下载ffmpeg 进入Download FFmpeg网址,点击下载windows版ffmpeg。 下载第一个essentials版本就行。 二. 环境配置 上面源码解压后如下 将bin添加到系统环境变量 验证安装是否成功,输入ffmpeg –version,显示版本即为安装成功。