从零开始学Python爬虫:(二)使用基本库urllib(上)

urllib库是python内置库,并不需要我们额外安装。

通过它,我们就可以完成请求和响应,得到网页内容。

现在,我们来详细看一看: 

一、urllib库构成

而urllib库包含以下四个模块:

  • urllib.request:用于打开和读取URL,相当于在浏览器输入网址并按下回车。
  • urllib.parse:提供处理URL的功能。
  • urllib.error:定义了在使用 urllib.request 过程中可能出现的异常类。
  • urllib.robotparser:用于解析和处理robots.txt文件,判断网站是否可以爬取。

二、urllib库使用

(1)爬取源代码

我们以Pycharm网站为例: 

先导入request库,然后写入代码:

import urllib.request
a=urllib.request.urlopen(r'https://www.jetbrains.com/zh-cn/pycharm/')
print(a.read().decode('utf-8'))

其中的urlopen,用来打开和读取 URL 地址。

运行后,我们可以看到:

输出框中的,便是网页的源代码

有了源代码,我们想要爬取的图片、链接也就都有了

(tips:有的网站有反爬措施,日后再说如何解决)


当然了,如果我们想要它输出一些具体的内容,比如status、getheaders等

我们可以这么写:

(2)urlopen的参数

在上述代码行

a=urllib.request.urlopen(r'https://www.jetbrains.com/zh-cn/pycharm/')中

括号里看到的便是url 参数,作为网址,不必多说,咱们已经见过

然而它还有其他的可选参数(可写可不写):

下面我们来看一看他们的具体作用:


1.data参数

data参数,用来给链接传递数据。

什么意思呢?

就是,我们之前代码中的网址,是GET请求,是直接点链接就进去的那种

但是如果遇到POST请求,我们就需要提交一份表单了(即需要输入账号密码的那种)

这时候,我们就可以用data参数,直接将数据输入进去

换句话说:如果你想通过POST方法发送数据给服务器,可以通过这个参数提供数据。

我们通过实例来看一下:

假如我传递一个name参数,值为Asir

import urllib.request
import urllib.parse

#将字典转换为URL编码的字符串,再转为字节
data=bytes(urllib.parse.urlencode({'name':'Asir'}),encoding='utf-8')

a=urllib.request.urlopen('https://www.httpbin.org/post',data=data)
print(a.read().decode('utf-8'))

解释:

因为data 参数通常是字节数据类型,所以采用bytes()进行格式转化

urllib.parse.urlencode的作用在于将字典转换为URL编码的字符串

另外,这里的网址https://www.httpbin.org/post,是一个提供http测试的链接。

输出:

我们可以看到在form一栏下多了名为name的参数,其值为Asir

2.timeout参数

timeout参数用来设置超时时间(单位秒),即如果请求超出了这个时间,还没有得到响应,就抛出异常

示例格式如下:

a=urllib.request.urlopen('https://www.httpbin.org/post',data=data,timeout=0.1)

至此,我们已经可以实现对网页的简单抓取。

但是,这个因为过于简单了,所以我们还需要其他参数来补充:

3.headers参数

用来伪装成浏览器

谷歌示例格式:

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0'}

4.method参数

用于指定HTTP请求方法(如 "GET" 或 "POST")

(3)示例

完整代码示范如下:

import urllib.request
import urllib.parse

#提前写好各参数
url='https://www.httpbin.org/post'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0'}
dict={'name':'Asir'}
data=bytes(urllib.parse.urlencode(dict),encoding='utf-8')

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

#打开该对象
response=urllib.request.urlopen(a)

#输出响应
print(response.read().decode('utf-8'))

首先提前写好各参数:url(网址)、headers(请求头:用于伪装)、dict(传递内容)、data

然后将各参数放置到urllib.request.Request()中

由此,构建了一个完整的请求

然后我们打开该请求对象,并赋值给response

最后以utf-8解码后输出

结果如下:


除此之外,还有一些高级用法,我们结合部分实例讲解: 

(了解步骤原理即可)

三、几个实例

(1)验证

在访问网址时,有时会弹出认证窗口

即,输入账户名+密码才能下一步。

而爬虫,关于它的解决办法如下:

借助一些模块即可完成:

from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError

注:这样导入可以使得下文写模块更简单。如,之前要写urllib.request.abc,那么现在写abc.即可

之后我们提前写好网址、账号名、密码:

url='某某某'
username='Asir'
password='123'

再创建一个实例,用来存储 URL 和对应的认证信息。

p=HTTPPasswordMgrWithDefaultRealm()

将用户名和密码添加到 p 中,与指定的 URL关联。None 表示没有特定的认证域。

p.add_password(None,url,username,password)

创建一个 HTTPBasicAuthHandler 实例,使用 p 中存储的认证信息,在发送请求时自动添加基本认证头部。

auth_handler=HTTPBasicAuthHandler(p)

创建一个 opener,这个 opener 在发送请求时会自动使用基本认证信息。

openr=build_opener(auth_handler)

最后,发送请求并处理响应

try:
    #发送 HTTP 请求到指定的 URL。由于 openr 已经包含了认证信息,它会带着基本认证头发送请求。
    result=openr.open(url)

    #读取返回的响应内容,并将其解码为 UTF-8 格式的字符串。
    html=result.read().decode('utf-8')
    print(html)

#如果请求过程中发生错误,捕获并输出错误原因。
except URLError as e:
    print(e.reason)

之后获取的结果便是打开成功后的网页源代码。

(2)代理

如果要添加代理,

我们可以这么写:

from urllib.error import URLError
from urllib.request import ProxyHandler,build_opener

a=ProxyHandler(
    {'http': 'http://127.0.0.1:8080',
     'https': 'https://127.0.0.1:8080'}
)
opener=build_opener(a)

try:
    ……

当然这里需要先在本地搭建一个HTTOP代理,并让其运行在8080端口上

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI Deep Research被huggingface 24小时复现开源了

自OpenAI发布Deep Research(一种使用推理来综合大量在线信息并完成多步骤研究任务的AI Agent)之后开源社区已经迎来一大波复现了,PaperAgent进行了梳理: 1.2k星 https://github.com/jina-ai/node-DeepResearch 825 https://gith…

【DeepSeek × Postman】请求回复

新建一个集合 在 Postman 中创建一个测试集合 DeepSeek API Test,并创建一个关联的测试环境 DeepSeek API Env,同时定义两个变量 base_url 和 api_key 的步骤如下: 1. 创建测试集合 DeepSeek API Test 打开 Postman。点击左侧导航栏中的 Co…

​阿里妈妈推出“淘宝星辰·图生视频”,AI电商内容创作全面升级

近日,基于自研的淘宝星辰视频生成大模型,阿里妈妈正式推出商用级图生视频AI Native应用——淘宝星辰图生视频,目前已对淘宝天猫商家开放使用。这一全新的AI Native工具,结合了海量电商数据、丰富的设计语言以及业内领先的营销经验,将推动电商AI内容创作的全流程智能化升级。 【…

AGI的基石:什么是机器学习

什么是机器学习:机器学习是人工智能的子集,深度学习是其重要的组成部分,包括不限于:deep neural networks 、deep belief networks和recurrent neural networks。在深度学习中,有三种基本的神经网络架构:FF…

游戏引擎学习第95天

回顾昨天的内容 我们一起完成游戏开发。我们正在进行自定义渲染的工作,这非常棒。我们基本上是在实现一个GPU的功能,自己来做这一切,这样我们可以看到它是如何运作的。 令人惊讶的是,整个过程并没有花费太多时间。当最初想到要实…

DFS+回溯+剪枝(深度优先搜索)——搜索算法

DFS也就是深度优先搜索,比如二叉树的前,中,后序遍历都属于DFS。其本质是递归,要学好DFS首先需要掌握递归。接下来咱们就一起来学习DFS涉及的算法。 一、递归 1.什么是递归? 递归可以这样理解把它拆分出来&#xff0…

Windows 11 重装系统后蓝屏错误:INACCESSIBLE_BOOT_DEVICE 的解决方案

Windows 11 重装系统后蓝屏错误:INACCESSIBLE_BOOT_DEVICE 的解决方案 在安装 Windows 11 后,用户可能会遇到一个令人头疼的问题:蓝屏错误,错误代码为 INACCESSIBLE_BOOT_DEVICE。这个错误通常表示系统无法访问启动设备&#xff…

瑞熙贝通实验室安全综合管理平台更新迭代v4.0产品介绍

随着科研事业的蓬勃发展,科研实验室是高校科研的重要场所 ,是培养学生科研能力、进行科学实验、创造科研成果的重要基地。然而,实验室也存在诸多安全隐患,如化学品泄露、火灾、设备故障、中毒、辐射、窒息等,这些都可能…

【读书笔记·VLSI电路设计方法解密】问题46:什么是bug覆盖率

在IC设计项目的验证过程中,功能测试(通过使用测试平台)有助于定位设计错误或漏洞。这个验证过程有三个阶段:构建和启动测试平台、验证基本测试用例以及验证边界情况。 在前两个阶段,漏洞很容易被检测到,因…

UA-Track:不确定性感知端到端3D多目标跟踪

论文地址:https://arxiv.org/pdf/2406.02147 主页:https://liautoad.github.io/ua-track-website/ 3D多目标跟踪(MOT)在自动驾驶感知中起着至关重要的作用。最近基于端到端查询的跟踪器可以同时检测和跟踪对象,这在3D …

CSS入门学习笔记(二)

学习视频:https://www.bilibili.com/video/BV1zN2UYoEEo/ 目录 浮动浮动的几种应用效果设置img浮动,去掉空隙设置div重叠,位于上下层多个div水平排列宽度不足时,会自动换行li元素水平排列 浮动的副作用解决副作用——清除浮动方法…

解锁 DeepSeek 模型高效部署密码:蓝耘平台深度剖析与实战应用

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

打家劫舍3

今天和打家讲一下打家劫舍3 题目: 题目链接:337. 打家劫舍 III - 力扣(LeetCode) 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为root。 除了 root 之外,每栋房子有且只有一个“父“…

redis项目

短信登录 这一块我们会使用redis共享session来实现 商户查询缓存 通过本章节,我们会理解缓存击穿,缓存穿透,缓存雪崩等问题,让小伙伴的对于这些概念的理解不仅仅是停留在概念上,更是能在代码中看到对应的内容 优惠…

每日一题洛谷P5733 【深基6.例1】自动修正c++

#include<iostream> #include<string> using namespace std; int main() {string t;cin >> t;for (int i 0; i < t.length(); i){if (t[i] > a && t[i] < z){t[i] A - a;}cout << t[i];}return 0; }

windows + visual studio 2019 使用cmake 编译构建静、动态库并调用详解

环境 windows visual studio 2019 visual studio 2019创建cmake工程 1. 静态库.lib 1.1 静态库编译生成 以下是我创建的cmake工程文件结构&#xff0c;只关注高亮文件夹部分 libout 存放编译生成的.lib文件libsrc 存放编译用的源代码和头文件CMakeLists.txt 此次编译CMak…

【含文档+PPT+源码】基于微信小程序的校园志愿者管理系统的设计与实现

项目介绍 本课程演示的是一款 基于微信小程序的校园志愿者管理系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…

SOME/IP--协议英文原文讲解5

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 这一章节…

Linux之Http协议分析以及cookie和session

Linux之Http协议分析以及cookie和session 一.分析请求行与响应行1.1请求行1.1.1资源的URL路径1.1.2常见的方法1.2响应行 二.cookie和session2.1cookie2.2session 一.分析请求行与响应行 在我们简单了解了请求和响应的格式以及模拟实现了请求和响应后我们已经可以通过网页来访问…

vue+element-ui简洁完美实现ju动漫网站

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.日漫 4.更多>排行榜 5.详情页 6.简单登陆页 三、源码实现 1.路由配置 2.首页 四、总结 一、项目介绍 本项目在线预览&#xff1a;点击访问 本项目为vue项目&#xff0c;以动漫为主题来设计元素&#xff…