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

news2024/12/22 23:38:21

文章目录

  • 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.request

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

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

import urllib.request
import urllib.error
import socket

try:
    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.request

request = 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,parse

url = '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.request

cookie = 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.request

filename = '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.request

cookie = 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.coloradmin.cn/o/1525455.html

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

相关文章

数字经济时代,数据清洗不是件小事

对于企业来说,数据无疑是当前时代业务增长和发展决策的核心要素,也是数字经济探索中的基础建设。不过随着数字化的加速普及,企业需要存储、处理的数据越来越多,海量的数据已经让企业难以理解,很难全面进行利用。尤其是…

数字化转型下的新质生产力:赋能未来发展新引擎

1. 引言:数字化转型与新质生产力的交融共生 在信息化、智能化的新时代,数字化转型已经成为推动经济社会发展的重要力量。而新质生产力,作为面向新兴领域和未来产业的先进生产力,正在数字化转型的浪潮中焕发出新的生机与活力。 数…

机器人路径规划:基于深度优先搜索(Depth-First-Search,DFS)算法的机器人路径规划(提供Python代码)

一、深度优先搜索算法介绍 深度优先搜索算法(Depth-First-Search)的基本思想是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已…

PTA-练习3

目录 实验4-2-3 换硬币 实验4-2-4 输出三角形字符阵列 实验4-2-5 输出整数各位数字 实验4-2-6 梅森数 实验4-2-7 找完数 实验4-2-9 水仙花数 实验6-2 英文字母替换加密(大小写转换后移1位) 实验6-5 简单计算器 实验6-10 统计单词的长度 实验4-2…

财富池指标公式--通达信主力资金指标公式,主力资金流向怎么看?

今日分享的通达信主力资金指标公式,是一个分析主力资金进出的指标。 具体信号说明: 当紫色的起涨点主力资金线和红色的拉升资金同时上传0线,并且紫色的拉升线超过资金线,大盘进入派发阶段,后市看涨,是参考…

pinia 的选项式和组合式的不同写法和持久化的方法

pinia 是vue3推荐的状态管理插件,它对标的是vue2中使用的vuex pinia 的引入方法 npm 安装 pinia在 src/store/index.js 中 创建一个pinia 的实例,并导出 在项目中的 main.js 中引入 2 中的pinia 并且使用 app.use(pinia) main.js中 import pinia from…

100天精通Python(实用脚本篇)——第118天:基于selenium和ddddocr库实现反反爬策略之验证码识别

文章目录 专栏导读一、前言二、ddddocr库使用说明1. 介绍2. 算法步骤3. 安装4. 参数说明5. 纯数字验证码识别6. 纯英文验证码识别7. 英文数字验证码识别8. 带干扰的验证码识别 三、验证码识别登录代码实战1. 输入账号密码2. 下载验证码3. 识别验证码并登录 书籍推荐 专栏导读 …

第111讲:Mycat实践指南:固定Hash算法分片下的水平分表详解

文章目录 1.固定Hash算法分片的概念1.1.固定Hash算法的概念1.2.固定Hash算法是如何将数据路由到分片节点的 2.使用固定Hash算法分片对某张表进行水平拆分2.1.在所有的分片节点中创建表结构2.2.配置Mycat实现固定Hash算法分片的水平分表2.2.1.配置Schema配置文件2.2.2.配置Rule分…

VMware虚拟机和主机之间无法复制粘贴,移动文件,重新安装vmware-tools变灰,VMware Tools继续运行脚本未能在虚拟机中成功运行。

起初,虚拟机只是无法和主机之间进行复制粘贴,移动文件。查询了很多资料,反反复复地安装卸载vmware-tools,但是都没有成功。通过这篇文章:虚拟机安装VMware Tools的两种方法_vmware tools有3种安装方式-CSDN博客 安装了vmware_too…

PCIE收发时序了解

文章目录 一、Pcie的发送时序1.1 不带数据的TLP包1.2 带数据的TLP包1.3 连续发送数据的TLP包 二、Pcie的接收时序2.1 不带数据的TLP包2.2 带数据的TLP包2.3 连续接收数据的TLP包 三、riffa框架和用户channel的接口3.1 RX接口波形:3.2 TX接口波形: 一、Pc…

用python写网络爬虫:3.urllib库进一步的使用方法

文章目录 异常处理URLErrorHTTPError设置超时时间 链接的解析、构造、合并urlparse方法urlsplit方法urljoin方法urlencode方法parse_qs方法quote方法 Robots 协议Robots 协议的结构解析协议 参考书籍 在上一篇文章:用python写网络爬虫:2.urllib库的基本用…

SpringBoot3整合Knife4j4.x版本(Swagger3、OpenApi3)

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: SpringBoot3整合Knife4j4.x版本(Swagger3、OpenApi3) ⏱️ 创作时间&a…

【每日力扣】131.分割回文串与450.删除二叉搜索树中的节点

🔥 个人主页: 黑洞晓威 😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害。 131.分割回文串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的…

C#使用MiniExcel读取excel表格文件

使用MiniExcel读取excel表格文件 MiniExecl提供了几种读取方法。 准备测试数据 测试类: public class Person{public int Id { get; set; }public string Name { get; set; }public string Description { get; set; }public double Value { get; set; }}测试数据…

伦敦数据科学与Scikit-learn:一次探索与实践的旅程

1.题目 Data Science London正在举办一场关于Scikit-learn的聚会。 这个比赛是尝试、分享和创建 sklearn 分类能力示例的练习场(如果这变成了有用的东西,我们可以跟进回归或更复杂的分类问题)。Scikit-learn(sklearn)…

Django项目不显示图片,路径找不到

1.问题 创建Django项目简单写一个网页,文字能显示,图片却无法加载,路径错误,找不到图片。 2.背景 我的项目结构 C:. ├─.idea │ └─inspectionProfiles ├─app01 │ ├─migrations │ ├─templates │ │ ├─app0…

postgres让别人连接自己本地的库

本地安装了postgres,一般只能自己连接,如果别人想要连接我们自己的库,需要修改postgres的配置。 找到pg.gba.conf,路径是:postgres安装路径/PostgreSQL/data 使用记事本打开这个文件,将别人的ip填入其中即…

Python数学建模-2.5Pandas库介绍

2.5.1Pandas基本操作 Pandas是一个强大的Python数据分析库,它提供了快速、灵活且富有表现力的数据结构,设计初衷是为了处理关系型或标记型数据。Pandas的基本操作涵盖了数据的读取、处理、筛选、排序、分组、合并以及可视化等多个方面。 以下是一些Pan…

CentOS7环境——yum安装nginx

目录 1.修改yum源为阿里云 2.下载wget 3.下载阿里云的 CentOS-Base.repo 到/etc/yum.repos.d/ 4.清空原本yum缓存 5.生成新的阿里云的yum缓存,加速下载预热数据 6.下载epel-release 7.下载nginx 8.启动并检查nginx状态 1.修改yum源为阿里云 cp /etc/yum.re…

QQ 截图工具独立版安装使用

前言 之前截图一直使用的QQ截图,相比于微信截图,QQ截图还支持长截图,总体来说,QQ截图是我使用过的最好的截图工具 。但是现在公司不让用微信、QQ、钉钉等通讯软件,要求使用公司自研的通讯软件,这样就不能使…