Python3之urllib库的使用总结

Python3之urllib库的使用总结Urllib 库是 Python 中的一个功能强大 用于操作 URL 并在做爬虫的时候经常要用到的库 在 Python2 x 中 分为 Urllib 库和 Urllin2 库 Python3 x 之后都合并到 Urllib 库中 使用方法稍有不同 本文介绍的是 Python3 中的 urllib 库 什么是 Urllib 库 Urllib 是 Python 提供的一个用于操作 URL 的模块 我们爬取网页的时候 经常需要用到这个库 升级合并后 模块

Urllib库是Python中的一个功能强大、用于操作URL,并在做爬虫的时候经常要用到的库。在Python2.x中,分为Urllib库和Urllib2库,Python3.x之后都合并到Urllib库中,使用方法稍有不同。本文介绍的是Python3中的urllib库。


什么是Urllib库

Urllib是Python提供的一个用于操作URL的模块,我们爬取网页的时候,经常需要用到这个库。

升级合并后,模块中的包的位置变化的地方较多。在此,列举一些常见的位置变动,方便之前用Python2.x的朋友在使用Python3.x的时候可以快速掌握。

常见的变化有:

  • 在Pytho2.x中使用import urllib2——-对应的,在Python3.x中会使用import urllib.request,urllib.error。
  • 在Pytho2.x中使用import urllib——-对应的,在Python3.x中会使用import urllib.request,urllib.error,urllib.parse。
  • 在Pytho2.x中使用import urlparse——-对应的,在Python3.x中会使用import urllib.parse。
  • 在Pytho2.x中使用import urlopen——-对应的,在Python3.x中会使用import urllib.request.urlopen。
  • 在Pytho2.x中使用import urlencode——-对应的,在Python3.x中会使用import urllib.parse.urlencode。
  • 在Pytho2.x中使用import urllib.quote——-对应的,在Python3.x中会使用import urllib.request.quote。
  • 在Pytho2.x中使用cookielib.CookieJar——-对应的,在Python3.x中会使用http.CookieJar。
  • 在Pytho2.x中使用urllib2.Request——-对应的,在Python3.x中会使用urllib.request.Request。

快速使用Urllib爬取网页

import urllib.request 

在导入了模块之后,我们需要使用urllib.request.urlopen打开并爬取一个网页,此时,可以输入如下代码爬取百度首页(www.baidu.com),爬取后,将爬取的网页赋给了变量file:

>>>file=urllib.request.urlopen('www.baidu.com') 

此时,我们还需要将对应的网页内容读取出来,可以使用file.read()读取全部内容,或者也可以使用file.readline()读取一行内容。

>>>data=file.read() #读取全部 >>>dataline=file.readline() #读取一行内容 

读取内容常见的有3种方式,其用法是:

  1. read()读取文件的全部内容,与readlines()不同的是,read()会把读取到的内容赋给一个字符串变量。
  2. readlines()读取文件的全部内容,readlines()会把读取到的内容赋值给一个列表变量。
  3. readline()读取文件的一行内容。
  1. 爬取一个网页并将爬取到的内容读取出来赋给一个变量。
  2. 以写入的方式打开一个本地文件,命名为*.html等网页格式。
  3. 将步骤1中的变量写入该文件中。
  4. 关闭该文件

我们刚才已经成功获取到了百度首页的内容并读取赋给了变量data,接下来,可以通过以下代码实现将爬取到的网页保存在本地。

>>>fhandle=open("./1.html","wb")
>>>fhandle.write(data)
>>>fhandle.close()

此时,1.html已窜在我们指定的目录下,用浏览器打开该文件,就可以看到我们爬取的网页界面。

>>>file.info() 
     
    
>>>file.getcode() 200 

如果想要获取当前所爬取的URL地址,我们可以使用geturl()来实现。

>>>file.geturl() 'http://www.baidu.com' 
>>>urllib.request.quote('http://www.baidu.com') 'http%3A//www.baidu.com' 

那么相应的,有时候需要对编码的网址进行解码

>>>urllib.request.unquote('http%3A//www.baidu.com') 'http://www.baidu.com' 

浏览器的模拟—Headers属性

这里写图片描述

我们可以得到该信息:

User-Agent:Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 X-Requested-With:XMLHttpRequest 

接下来,我们讲解如何让爬虫模拟成浏览器访问页面的设置方法。

import urllib.request
import urllib.parse

url='http://www.baidu.com'
hearder={
   'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}

request=urllib.request.Request(url,headers=header)
reponse=urllib.request.urlopen(request).read()

fhandle=open("./1.html","wb")
fhandle.write(reponse)
fhandle.close()

超时设置

HTTP协议请求实战

  • GET请求:GET请求会通过URL网址传递信息,可以直接在URL中写上要传递的信息,也可以由表单进行传递。如果使用表单进行传递,这表单中的信息会自动转为URL地址中的数据,通过URL地址传递。
  • POST请求:可以向服务器提交数据,是一种比较主流也比较安全的数据传递方式,比如在登录时,经常使用POST请求发送数据。
  • PUT请求:请求服务器存储一个资源,通常要指定存储的位置。
  • DELETE请求:请求服务器删除一个资源。
  • HEAD请求:请求获取对应的HTTP报头信息。
  • OPTIONS请求:可以获取当前URL所支持的请求类型。

GET请求示例分析

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=hello

可以发现,对应的查询信息是通过URL传递的,这里采用的就是HTTP请求中的GET请求方法,我们将该网址提取出来进行分析,字段ie的值为utf8,代表的是编码信息,而字段wd为hello,刚好是我们要查询的信息,所以字段wd应该存储的就是用户检索的关键词。根据我们的猜测,化简一下该网址,可以化简为https://www.baidu.com/s?wd=hello,将该网址复制到浏览器中,刷新一下,会发现该网址也能够出现关键词为‘hello’的搜索结果。
由此可见,我们在百度上查询一个关键字时,会使用GET请求,其中关键性字段是wd,网址格式为:https://www.baidu.com/s?wd=关键词
分析到这里,你应该大概知道我们该怎么用爬虫实现自动地在百度上查询关键词结果了。直接上代码~




#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import urllib.request
import urllib.parse

url='http://www.baidu.com/s?wd='
key='fengxin的博客' 
key_code=urllib.request.quote(key)  #因为URL里含中文,需要进行编码
url_all=url+key_code
header={
    'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}   #头部信息
request=urllib.request.Request(url_all,headers=header)
reponse=urllib.request.urlopen(request).read()

fh=open("./baidu.html","wb")    #写入文件中
fh.write(reponse)
fh.close()


通过以上实例我们可以知道,如果要使用GET请求,思路如下:

  • 构建对应的URL地址,该URL地址包含GET请求的字段名和字段内容等信息,并且URL地址满足GET请求的格式,即“http://网址?字段名1=字段内容1&字段名2=字段内容2”
  • 以对应的URL为参数,构建Request对象。
  • 通过urlopen()打开构建的Request对象。
  • 按需求进行后续的处理操作,比如读取网页的内容、将内容写入文件等。

POST请求实例分析

  • 设置好URL网址。
  • 构建表单数据,并使用urllib.parse.urlencode对数据进行编码处理。
  • 构建Request对象,参数包括URL地址和要传递的数据。
  • 添加头部信息,模拟浏览器进行爬取。
  • 使用urllib.requesr.urlopen()打开对应的Request对象。完成信息的传递。
  • 后续处理,比如读取网页内容,将内容写入文件等。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import urllib.request
import urllib.parse

url='http://www.iqianyue.com/mypost'
header={
   'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}

data={'name':'fengxin','pass':'123'}
postdata=urllib.parse.urlencode(data).encode('utf8') #进行编码
request=urllib.request.Request(url,postdata)
reponse=urllib.request.urlopen(request).read()

fhandle=open("./1.html","wb")
fhandle.write(reponse)
fhandle.close()











版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216137.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午12:28
下一篇 2026年3月18日 下午12:28


相关推荐

  • 使用pycharm画图不显示

    使用pycharm画图不显示项目场景 提示 这里简述项目相关背景 例如 项目场景 示例 通过蓝牙芯片 HC 05 与手机 APP 通信 每隔 5s 传输一批传感器数据 不是很大 问题描述 提示 这里描述项目中遇到的问题 例如 数据传输过程中数据不时出现丢失的情况 偶尔会丢失一部分数据 APP 中接收数据代码 Overridepubl bytes mmInStream read buffer mHandler obta

    2026年3月27日
    2
  • Netty in action—Netty中的ByteBuf[通俗易懂]

    Netty in action—Netty中的ByteBuf[通俗易懂]正如之前所说,网络传输的基本单位是字节。JavaNIO提供了ByteBuffer作为它的容器,但是这个类使用起来比较复杂和麻烦。Netty提供了一个更好的实现:ByteBuf。ByteBuf的APINetty为数据处理提供的API通过抽象类ByteBuf和接口ByteBufHolder暴露出来。下面列出ByteBufAPI的优点:可扩展到用户定义的buffer类型中通过内置的复合buf

    2025年12月10日
    9
  • hdfs查看命令_windows命令提示符窗口

    hdfs查看命令_windows命令提示符窗口publicclassHdfsClient1{privateFileSystemfs;//初始化一个FileSystem@Beforepublicvoidinit()throwsURISyntaxException,IOException,InterruptedException{//1:获取文件系统URIuri=newURI(“hdfs://myhadoop105:9820”);.

    2022年10月4日
    3
  • 收藏!Java后端转AI Agent全攻略|小白/程序员入门大模型必看

    收藏!Java后端转AI Agent全攻略|小白/程序员入门大模型必看

    2026年3月14日
    2
  • SSDP协议基础_最核心的协议

    SSDP协议基础_最核心的协议http://net.zdnet.com.cn/network_security_zone/2010/0715/1814422.shtmlSSDP协议,不知道大家是否听说过呢?这个协议的使用多出现在端口当中。下面我们就来了解一下这个协议的具体内容吧。什么是SSDP协议呢?SS

    2022年10月11日
    6
  • 十五:IO流_什么是io流

    十五:IO流_什么是io流跳转到总目录文章目录01、File类的使用1.1、File类的实例化1.2、File类的常用方法11.3、File类的常用方法21.4、课后练习02、IO流原理及流的分类2.1、IO流原理2.2、流的分类2.3、IO流体系04、节点流(或文件流)4.1、FileReader读入数据的基本操作4.2、FileReader中使用read(char[]cbuf)读入数据4.3、FileWriter写出数据的操作4.4、使用FileReader和FileWriter实现文本文件的复制4.5、使用FileInp

    2022年10月20日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号