用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.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 网络爬虫开发实战》崔庆才著

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

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

相关文章

Linux网络基础2

目录 实现网络版本计算器 自己定协议实现用json协议实现 重谈OSI七层模型HTTP协议 域名介绍url介绍HTTP请求和响应 实现一个简易的HTTP服务器 实现简易Http服务器初级版实现简易Http服务器中级版 实现一个简易的HTTP服务器最终版 请求方法HTTP状态码HTTP常见的Header 实现网…

【鸿蒙HarmonyOS开发笔记】常用组件介绍篇 —— Progress进度条组件

概述 Progress为进度条组件,用于显示各种进度。 参数 Progress组件的参数定义如下 Progress(options: {value: number, total?: number, type?: ProgressType})● value value属性用于设置当前进度值。 ● total total属性用于设置总值。 ● type type属…

加拿大光量子计算公司Xanadu入局英国多企业量子合作计划

内容来源:量子前哨(ID:Qforepost) 编辑丨慕一 编译/排版丨沛贤 深度好文:1200字丨8分钟阅读 英国航空发动机制造商罗尔斯罗伊斯(Rolls-Royce)、英国量子计算公司Riverlane和加拿大量子计算公…

【赠书】从深度学习到图神经网络:模型与实践

文章目录 赠书:《从深度学习到图神经网络:模型与实践》一、编辑推荐二、内容简介三、作者简介张玉宏杨铁军 四、精彩书评五、目录第1章 图上的深度学习 11.1 人工智能与深度学习 21.2 图神经网络时代的来临 61.3 图数据处理面临的挑战 91.4 图神经网络的…

AS-V1000视频监控平台如何加强系统安全,满足等保2.0规范要求

目 录 一、概述 (一)信息安全技术网络安全等级保护标准 (二)解读 1、等级保护工作的内容 2、等级保护的等级划分 3、不同等级的安全保护能力 第一级安全保护能力 第二级安全保护能力 第三级安全保护能力 第…

电子科技大学链时代工作室招新题C语言部分---题号D

1. 题目 这道题大概的意思就是对一个整形数组的元素进行排序,然后按新的顺序打印原本的下标; 例如,在题目给出的Note部分,{a1, a2, a3, a4, a5}进行排序之后变为了{a2, a1, a4, a3, a5},于是输出2 1 4 3 5。 排序的规则…

MyBatisPlus中MetaObjectHandler的使用

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 起因是公司一个同事接到需求,让把一条数据录入时createTime字段,设置为…

DM数据库(docker)

docker安装 安装必要的系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 配置阿里云Docker Yum源: yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 更新yum缓存 yum makecache fast 安装docker-CE: y…

抛弃Superhuman?这些替代方案让你眼前一亮!

Superhuman是一个极好的人工智能工具在电子邮件助理领域。根据SimilarWeb的最新统计,它在全球网站排名中排名第21980位,月访问量为1751798。然而市场上还有许多其他优秀的选择。为了帮助您找到最适合您需求的解决方案,我们为您精心挑选了10种…

海淘注意事项,海淘虚拟卡

2024年海淘visa信用卡,点击获取卡片 海淘注意事项 海淘(跨境购物)可以让人们在国外购买到更多种类的商品,但是也需要注意一些事项,以确保购物的顺利进行和商品的质量。以下是一些建议: 海淘网站的选择&…

零代码编程:用kimichat合并一个文件夹下的多个文件

一个文件夹里面有很多个srt字幕文件,如何借助kimichat来自动批量合并呢? 在kimichat对话框中输入提示词: 你是一个Python编程专家,完成如下的编程任务: 这个文件夹:D:\downloads\life.on.our.planet.(202…

C++中的using关键字

1. 类型别名 using关键字可以用来为类型创建一个新的名字,这在代码的可读性和维护性方面非常有帮助。 // 定义类型别名 using IntPtr int*;// 使用 int value 5; IntPtr ptr &value;2. 命名空间别名 如果你正在使用一个非常长的命名空间,可以使…

如何在MT4平台查询自己的账户杠杆?

如何在MT4平台查询自己的账户杠杆?MT4中直接没有这个选项,犟嘴的投资者千万不要犟嘴,说可以根据保证金水平计算。其实在交易账户中有3中方法可以查询自己的账户,投资者可以在这里开立一个MT4帐户,并将其附加到具有登录名和密码的…

Jenkins-pipeline流水线构建完钉钉通知

添加钉钉机器人 在钉钉群设置里添加机器人拿出Webhook地址,设置关键词 Jenkins安装钉钉插件 Dashboard > 系统管理 > 插件管理,搜索构建通知,直接搜索Ding Talk也行 安装DingTalk插件,重启Jenkins 来到Dashboard > 系…

想要了解更多商品信息?淘宝天猫详情接口API助你一键搞定!

想要了解更多商品信息?淘宝天猫详情接口API是你的理想选择!作为唯一提供官方商品数据的接口,它能够帮助你快速获取商品的多种详细信息,联讯数据让你在购物过程中做出更明智的决策。 简介:淘宝天猫详情接口API的功能及…

普通人搞副业,空闲时间做,月入5w+

我是电商珠珠 大家会发现,朱砂越来越火,不仅是因为它好看,而且商家对外扬言可以招财。现在的人对爱情不屑一顾,财神殿里可以长跪不起,人人都想求财,想要在空余时间搞副业赚大钱,但做什么还没有…

客服知识库到底好用在哪?企业真的需要吗?

在企业运营的众多环节中,客户服务无疑是至关重要的一环。然而,面对如洪水般涌入的客户问题和查询,你的客服团队是否能够做到快速应对,准确解答?这时,一个客服知识库就显得尤为重要。那么,客服知…

Java项目实战记录:雷达数据渲染

目录 Java项目实战记录:雷达数据渲染业务背景代码逻辑数据结构颜色渲染MapContent加载数据并输出截图 完整代码GenerateMapImage地图渲染工具测试代码 渲染效果 Java项目实战记录:雷达数据渲染 业务背景 我之前已经成功使用Java语言解析了C处理的雷达数…

Linux编程4.8 网络编程-建立连接

1、服务器端 #include <sys/types.h> #include <sys/socket.h>int listen(int sockfd, int backlog);返回&#xff1a;成功返回0&#xff0c;出错返回-1。参数&#xff1a;sockfd:套接字的文件描述符backlog:定义了sockfd的挂起连接队列可能增长的最大长度。…

鸿蒙4.0ArkUI快速入门(一)应用模型

ArkUI篇 应用模型Stage模型FA模型模型对比 应用模型 应用模型是HarmonyOS为开发者提供的应用程序所需能力的抽象提炼&#xff0c;它提供了应用程序必备的组件和运行机制。 HarmonyOS先后提供了两种应用模型&#xff1a; FA&#xff08;Feature Ability&#xff09;模型&…