用python写网络爬虫:2.urllib库的基本用法

文章目录

  • urllib库
    • 抓取网页
    • data参数
    • timeout参数
    • 更灵活地配置参数
    • 登录
    • 代理
    • Cookies
  • 参考书籍

建议新入门的小伙伴先看我同一专栏的文章:用python写网络爬虫:1.基础知识

urllib库

urllib是python中一个最基础的HTTP库,一般是内置的,不需要额外下载

抓取网页

使用urllib中的request模块可以方便向服务器发送请求,以抓取目标网页的源代码。

import urllib.requests

以抓取CSDN官网为例,代码如下

import urllib.request# 使用urllib库发送HTTP请求到指定的网站,将响应保存在response变量中。
response = urllib.request.urlopen('https://www.csdn.net/')
print(response.read())

运行上述代码,结果如下结果太长,只截取一部分
为方便看懂,修改代码,使输出结果按utf-8解码

print(response.read().decode('utf-8'))

结果就是我们可以看到解码后的汉字了
在这里插入图片描述

如果想获取更多特定的信息,可以把输出改为以下命令

print(type(response)) #获取响应的类型
print(response.status) #获取响应状态码
print(response.getheaders()) #获取响应头
print(response.getheader('Server')) #获取Server信息,即服务器的搭建方式

结果示例如下
其中

  • 第一行表示它是一个HTTPResponse类型的对象
  • 第二行状态码为200,表示响应成功
  • 下面一大段表示响应头,给出了该网站的信息
  • 最后一行的Server信息就是从响应头里获取的

利用上述最基本urlopen()方法,可以完成最基本的get请求,下面演示用urlopen可选的参数去完成更多的事情

data参数

如果添加这个参数,就意味着要向服务器传送一些信息,即GET请求变为POST请求
我们将目标网址改为http://httpbin.org/post,这是一个专门测试POST请求的链接
修改前文的代码,改动主要有:加载urllib库中的parse模块、添加参数data、修改目标网址。如下所示

import urllib.request
import urllib.parse# 使用urllib库中的parse模块,将字符串转换为字节流,便于网络传输
data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf-8')
response = urllib.request.urlopen('http://httpbin.org/post',data=data)print(response.read())

输出结果如下

这里我们传递了一个参数word,其值为hello,从输出结果中可以发现我们传递的参数出现在了form字段中

timeout参数

该参数的作用是设置一个超时时间(单位为秒),若服务器超过了这个时间还未响应,则返回URLError异常;若不指定该参数,则会使用默认时间。

以下是一个由于响应超时会返还异常的例子

import urllib.requestresponse = urllib.request.urlopen('http://httpbin.org/get',timeout=0.1)
print(response.read())

实际应用中,往往通过设置这个超时时间,让程序正常运行。原理是:如果超过这个超时时间,则跳过这部分网页的抓取。
下面是一个使用try except语句进行实现的例子

import urllib.request
import urllib.error
import sockettry:response = urllib.request.urlopen('http://httpbin.org/get',timeout=0.1)
except urllib.error.URLError as e:# 检查异常对象e的原因部分是否是socket.timeout类型,即是否是超时错误if isinstance(e.reason,socket.timeout):print('Time out')

更灵活地配置参数

仅仅使用urlopen()及其几个参数,不足以灵活地构建一个请求,我们使用request类以更方便地加入更多信息
这里更方便的意思是,我们把urlopen()方法的参数改成一个Request类型的对象,用以添加参数,如下例

import urllib.requestrequest = urllib.request.Request('https://www.csdn.net/')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

参数

  • url:用于请求URL,是必传参数,其他都是可选参数
  • data:用于传递(POST)请求的数据
  • herders={}:即请求头
  • origin_req_host:请求方的host名称或IP地址
  • unverifiable:用于指示请求是否是不可验证的。默认为False,当设置为True时,表示请求的可信度无法得到验证,可能会触发一些警告。在处理一些不太可靠的网站或者资源时可能会有用。
  • method:指定请求方法的类型,如:POST,GET,PUT等

举个例子:

from urllib import request,parseurl = 'http://httpbin.org/post'
headers = {'User-Agent':'MOzilla/4.0(compatible ; MSIE 5.5;Windows NT)','Host':'httpbin.org'
}
dict ={'name':'Germey'
}
data = bytes(parse.urlencode(dict),encoding='utf-8')
req = request.Request(url=url,data=data,headers=headers,method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

这里headers指定了User-Agent和Host,User-Agent是一种身份信息,默认值为Python-urllib,我们可以修改它以进行伪装。
比如上例伪装的是IE浏览器,设置为
MOzilla/4.0(compatible ; MSIE 5.5;Windows NT)
也可以伪装成火狐浏览器:
Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11

登录

前文提到的urlopen(),我们称作它是一个opener,是用来发送URL请求的对象。urlopen是已经写好的一个opener,包含了我们常用的请求,但如果我们想要实现更高级的功能时,需要自定义一个opener,以实现需求。在这个过程中,我们要构建一个handler,可以把它理解成一个工具:针对不同的需求,我们定制不同的handler,opener使用这个handler工具就可以实现我们的需求。

访问有些网站时,需要进行登录,这时我们应在请求中添加用户名和密码的信息,这是urlopen方法不包含的,需要自定义opener。

以下两个类可以帮助实现登录功能

HTTPPasswordMgrWithDefaultRealm 类:允许你为特定的 URL 和域名添加用户名和密码。可以避免在每个请求中都手动指定用户名和密码,提高代码的可维护性和可重用性

HTTPBasicAuthHandler 类:它负责在请求中包含适当的认证头,以便通过服务器的认证机制

from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError# 这里输入目标网站的URL和你的用户名、密码
username = 'username'
password = 'password'
url = 'http://localhost:5000/'p = HTTPPasswordMgrWithDefaultRealm()
p.add_password(None,url,username,password)
auth_handler = HTTPBasicAuthHandler(p)
opener = build_opener(auth_handler)# 尝试使用 opener 打开指定的 URL
# 如果成功打开,则读取返回的内容并打印出来;如果发生 URLError,则打印出错误原因
try:result = opener.open(url)html = result.read().decode('utf-8')print(html)
except URLError as e:print(e.reason)

代理

可以使用ProxyHandler类在爬虫程序中添加代理,同样地,你需要自定义一个opener

from urllib.request import ProxyHandler,build_opener
from urllib.error import URLError# 这里填写你的代理地址
proxy_handler = ProxyHandler({'http':'http://127.0.0.1:9743','https':'https://127.0.0.1:9743'
})opener = build_opener(proxy_handler)
try:response = opener.open('https://www.baidu.com')print(response.read().decode('utf-8'))
except URLError as e:print(e.reason)

Cookies

Cookies是服务器储存在用户端的信息,比如用户的账户信息就可以被储存在Cookies中,以便下次访问该网站的时候不需登录即可进入到相同账户。

我们利用HTTPCookieProcessor来建立一个handler,从而获取cookies

import http.cookiejar,urllib.requestcookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:print(item.name+"="+item.value)

输出结果如下
在这里插入图片描述
可以看见结果中包含了三条cookie的名称和值,我们还可以把数据储存在文件里,为生成文件,需要将CookieJar改为MozillaCookieJar,代码如下

import http.cookiejar,urllib.requestfilename = 'cookies.txt'
cookie = http.cookiejar.MozillaCookieJar(filename) 
handler = urllib.request.HTTPCookieProcessor(cookie) 
opener = urllib.request.build_opener(handler) 
response = opener.open ('http://www.baidu.com') 
cookie.save(ignore_discard=True , ignore_expires=True)

要生成LWP格式的文件,则使用LWPCookieJar,只需修改

cookie = http.cookiejar.LWPCookieJar(filename) 

可以用load()方法读取并利用Cookies文件,以LWP格式为例

import http.cookiejar,urllib.requestcookie = http.cookiejar. LWPCookieJar() 
# 从文件 'cookies.txt' 中加载 Cookie 信息到 LWPCookieJar 对象中
# ignore_discard=True 表示即使 cookies.txt 中的 cookie 已经过期也将其保存,
# ignore_expires=True 表示即使 cookies.txt 中的 cookie 已经过期也将其保存。
cookie.load('cookies.txt', ignore_discard=True, ignore_expires=True) 
handler = urllib.request .HTTPCookieProcessor(cookie) 
opener = urllib .request.build_opener(handler) 
response= opener.open('http://www.baidu.com') 
print (response.read(). decode ('utf-8')) 

基本用法介绍到这,更多详见官方文档https://docs.python.org/3/library/urllib.request.html

参考书籍

《python3 网络爬虫开发实战》崔庆才著

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

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

相关文章

2024年 前端JavaScript Web APIs 第三天 笔记

3.1-表单全选反选案例 <!DOCTYPE html><html><head lang"en"><meta charset"UTF-8"><title></title><style>* {margin: 0;padding: 0;}table {border-collapse: collapse;border-spacing: 0;border: 1px solid …

网络安全实训Day5

写在前面 昨天忘更新了......讲的内容不多&#xff0c;就一个NAT。 之前记的NAT的内容&#xff1a;blog.csdn.net/Yisitelz/article/details/131840119 网络安全实训-网络工程 NAT 公网地址与私网地址 公网地址 可以在互联网上被寻址&#xff0c;由运营商统一分配全球唯一的I…

在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手

本文首发于公众号&#xff1a;Hunter后端 原文链接&#xff1a;在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手 最近 ChatGPT 式的聊天机器人比较火&#xff0c;可以提供各种问答功能&#xff0c;阿里最近推出了 Qwen1.5 系列的大模型&#xff0c;提供了各个参数…

在线BLOG网|基于springboot框架+ Mysql+Java+JSP技术的在线BLOG网设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

【C#算法实现】可见的山峰对数量

文章目录 前言一、题目要求二、算法设计及代码实现2.1 算法思想2.2 代码实现 前言 本文是【程序员代码面试指南&#xff08;第二版&#xff09;学习笔记】C#版算法实现系列之一&#xff0c;用C#实现了《程序员代码面试指南》&#xff08;第二版&#xff09;栈和队列中的可见的…

OpenCV-Java 开发简介

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a; 如何在“Microsoft Visual Studio”中使用OpenCV编译应用程序 下一篇&#xff1a;暂无 ​ 警告&#xff1a; 本教程可能包含过时的信息。 从 OpenCV 2.4.4 开始&…

java集合框架——Map集合概述

前言&#xff1a; 之前接触了单列合集&#xff0c;现在又接触了双列合集。整理下心得&#xff0c;打好基础&#xff0c;daydayup&#xff01;&#xff01; Map集合 Map集合称为双列集合&#xff0c;也被称为“键值对集合”。格式&#xff1a;{key1value1,key2value2...}&#…

【GPT-SOVITS-01】源码梳理

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

jwt以及加密完善博客系统

目录 一、背景 二、传统登陆功能&强制登陆功能 1、传统的实现方式 2、session存在的问题 三、jwt--令牌技术 1、实现过程 2、令牌内容 3、生成令牌 4、检验令牌 四、JWT登陆功能&强制登陆功能 1、JWT实现登陆功能 2、强制登陆功能 3、运行效果 五、加密/加…

论文阅读——SpectralGPT

SpectralGPT: Spectral Foundation Model SpectralGPT的通用RS基础模型&#xff0c;该模型专门用于使用新型3D生成预训练Transformer&#xff08;GPT&#xff09;处理光谱RS图像。 重建损失由两个部分组成&#xff1a;令牌到令牌和频谱到频谱 下游任务&#xff1a;

[数据集][目标检测]铝片表面工业缺陷检测数据集VOC+YOLO格式400张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;400 标注数量(xml文件个数)&#xff1a;400 标注数量(txt文件个数)&#xff1a;400 标注类别…

Coursera上Golang专项课程2:Functions, Methods, and Interfaces in Go 学习笔记

Functions, Methods, and Interfaces in Go Course Certificate 本文是学习 Functions, Methods, and Interfaces in Go 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Functions, Methods, and Interfaces in GoMODULE 1: FUNCTIONS AND ORGANIZ…

Epuck2机器人固件更新及IP查询

文章目录 前言一、下载固件更新软件包&#xff1a;二、查询机器人在局域网下的IP 前言 前面进行了多机器人编队仿真包括集中式和分布式&#xff0c;最近打算在实物机器人上跑一跑之前的编队算法。但由于Epuck2机器人长时间没使用&#xff0c;故对其进行固件的更新&#xff0c;…

【Godot4.0】几何图形、网格、刻度线顶点求取函数库ShapePoints

概述 用于生成常见二维几何图形顶点数据&#xff08;PackedVector2Array&#xff09;的静态函数库。 生成的数据可用于_draw和Line2D、Polygon2D等进行绘制和显示。 枚举 enum{AXIS_X 1,AXIS_Y 2, }enum{SIDE_UP 1,SIDE_RIGHT 2,SIDE_BOTTOM 3,SIDE_LEFT 4 }测试场景 …

从JVM的退出机制分析Java程序的优雅关闭退出

前言 Java程序启动从main函数开始启动&#xff0c;是程序入口和主线程&#xff0c;但程序会在什么时候结束&#xff1f;为什么有的Java程序在启动后很快就结束了&#xff0c;比如HelloWorld程序&#xff0c;有的程序却能一直在运行&#xff0c;比如Tomcat启动后就一直保持进程…

odoo17开发教程(8):设置界面UI的字段属性

目录 添加字段 给字段设置只读和不可拷贝 给字段添加默认值 保留字段 本节目标&#xff1a;在本文末尾&#xff0c;售价(selling price)应为只读值&#xff0c;卧室数量(bedrooms)和可用日期(availability date)应为默认值。此外&#xff0c;在复制记录时&#xff0c;售价和…

【解读】保障软件供应链安全:SBOM推荐实践指南(含指南获取链接)

2023年11底&#xff0c;美国NSA&#xff08;National Security Agency&#xff09;、CISA&#xff08;Cybersecurity and Infrastructure Security Agency&#xff09;等多个政府机构部门组成的ESF&#xff08;Enduring Security Framework&#xff0c;持久安全框架&#xff09…

OGRE Pittfals Design proposal for Ogre 2.0

OGRE Pittfals & Design proposal for Ogre 2.0

Python的网络爬虫介绍与实战

Python的网络爬虫基础介绍与实战 定义流程包和函数静动态网页爬虫实战红牛分公司&#xff1f;二手房数据&#xff08;静态网页&#xff09;豆瓣读书&#xff08;动态网页&#xff09; 定义 网络爬虫是按照一定的规则&#xff0c;自动地抓取万维网&#xff08;www&#xff09;信…

rust引用本地crate

我们可以动态引用crate&#xff0c;build时从crate.io下载&#xff0c;但可能因无法下载导致build失败。首次正常引用三方crate&#xff0c;build时自动下载的crate源码&#xff0c;我们将其拷贝到固定目录中&#xff1b; build后可在RustRover中按住Ctrl键&#xff0c;在crat…