python3 中使用urllib问题以及urllib详解

时间:2021-05-22

今天遇到一个蛮奇怪的问题:当我在控制台中使用 urllib 没问题,但是当我在 vscode 中 .py 文件中导入 urllib 使用时会报错:

AttributeError: module 'urllib' has no attribute 'request'

查了一下资料是 python3 的 urllib 不会自动导入其under层的包,需要手动导入。

import urllibimport urllib.parseimport urllib.request

再次使用即可成功。

urllibe 是 python3 中将中文 urlencode 编码使用的函数,urlencode 使用如下:

import urllibimport urllib.parseurllib.parse.quote(string, safe='/', encoding=None, errors=None)

urllib 将编码后的字符串转为中文则使用:

import urllibimport urllib.parseurllib.parse.unquote(string, encoding='utf-8', errors='replace')

聊到这里就顺带讲讲 urllibe 的使用吧

urllib 是一个 python 内置包,不需要额外安装即可使用,它包含一下几个用来处理 url 的模版。

  • urllib.request,用来打开和读取 url,意思就是可以用它来模拟发送请求,就像在浏览器里输入网址然后敲击回车一样,获取网页响应内容。
  • urllib.error,用来处理 urllib.request 引起的异常,保证程序的正常执行。
  • urllib.parse,用来解析 url,可以对 url 进行拆分、合并等。
  • urllib.robotparse,用来解析 robots.txt 文件,判断网站是否能够进行爬取。

urllib.request 模块

urllib.request 模块定义了以下几个函数。

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

该函数主要用于模拟网站请求,返回一个 HTTPResponse 类型的对象。

urlopen 函数中参数定义

  • url,必选参数,是一个 str 字符串或者 Request 对象(后面会介绍)。
  • data,bytes 类型的可选参数,如果传递的是字典型数据,可以用 urllib.parse.urlencode() 进行编码,返回 str 字符串,再将 str 转换成 bytes 字节流。如果传递 data 参数,urlopen 将使用 HTTP POST 方式请求,否则为 HTTP GET 请求。
  • timeout,可选参数,设置超时时间(未设置时使用全局默认超时时间),以秒为单位计时,如果 urlopen 请求超出了设置时间还未得到响应则抛出异常。
  • cafile 和 capath,可选参数,在 HTTPS 连接请求时指定已认证的 CA 证书以及证书路径。
  • cadefault,一般可忽略该参数。
  • context,ssl.SSLContext 类型的可选参数,用来指定 SSL 设置。

urlopen 函数返回类型

urlopen 函数请求返回一个 HTTPResponse 响应上下文,或者请求异常抛出 URLError 协议错误,一般有如下属性:

  • geturl(),返回检索的 url,通常用于判定是否进行了重定向。
  • info(),返回网页的头信息。
  • getcode(),返回 HTTPResponse 响应的状态码。

urlopen 函数的应用实例

# 创建一个 HTTP GET 请求,输出响应上下文from urllib.request import urlopenresponse = urlopen("http://'url=base_url + '?' + urllib.parse.urlencode(params) # doseq 设置为 False,会解析成乱码print(url)url=base_url + '?' + urllib.parse.urlencode(params, True) # doseq 设置为 Trueprint(url)

urllib.robotparse 模块

rebotparser 模块提供了一个 RobotFileParser 类,主要用来解析网站上发布的 robots.txt,然后根据解析内容判断爬虫是否有权限来爬取这个网页。

robots.txt 文件

robots.txt,存放于网站根目录下,采用 ASCII 编码的文本文件,记录此网站中的哪些内容是不应被爬虫获取的,哪些是可以被爬虫获取的。

robots.txt 文件内容举例

User-agent: * Disallow: / Allow: /public/

  • User-agent,爬虫的名称,将其设置为 * 代表协议对任何爬虫有效,如果设置为 Baiduspider 则代表协议仅对百度爬虫有效,要是有多条则对多个爬虫有效,至少需要指定一条。
  • Disallow,网页中不允许抓取的目录,上述例子中设置的 / 代表不允许抓取所有的页面。
  • Allow,一般和 Disallow 一起使用,用来排除单独的某些限制,上述例子中设置为 /public/ 表示所有页面不允许抓取,但可以抓取 public 目录。

urllib.robotparser.RobotFileParser(url='') 类及其常用方法

  • set_url(url),设置引用 robots.txt 文件的 url,如果在创建 RobotFileParser 对象时传入了 url,那么就不需要使用这个方法设置 url。
  • read(),读取 robots.txt 文件并将其提供给解析器,不返回任何内容。
  • parse(lines),用来解析 robots.txt 某些行的内容,并安装语法规则来分析内容。
  • can_fetch(useragent, url),传入两个参数,用户代理以及要爬取的网站,返回的内容是该用户代理否可以抓取这个网站,结果为 True 或 False。

到此这篇关于python3 中使用urllib问题以及urllib详解的文章就介绍到这了,更多相关python3使用urllib内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章