urllib是python的一个库,包含四个模块:

注意,别把你的python文件名命名为urllib,不然会报错!!!

一:request模块

这是基本的http请求模块,相当在浏览器输入网址然后回车一样。只需要传入URL以及其他参数就可以模拟网址访问。

request模块内部存在几个方法用来访问网址:

(1)urlopen()方法

代码示例:

import urllib.requestresponse = urllib.request.urlopen("https://www.python.org")
print(response.read().decode("UTF-8"))

上述代码就通过urllib的request模块的urlopen()方法得到了python官网的网页源代码,并储存在名为response的变量里面。再对response调用方法和属性就可以得到网页的详细信息。

比如调用read()方法可以得到请求的网页内容(代码示例中的decode("UTF-8")是解码格式),调用status属性可以得到返回的响应状态码。当然还有其他方法和属性,这里不再赘述。

urlopen方法里必须有的参数是url地址,其他参数都是可选的。

可选参数之一,data:

如果在urlopen里面传入了data参数,那么访问网站的方法不再是get方法,而是post方法,会将data参数的值以表单的形式传递给该网站。要注意,data参数的值要进行转码处理,就是使用bytes()方法,该方法第一个参数是要转化的str,第二个参数指定编码格式(encoding="  ")。这里我使用了urllib.parse.urlencode()来字典转化为字符串。

下面是代码示例:

import urllib.request
import urllib.parseurl = "http://httpbin.org/post"
a = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='UTF-8')
response = urllib.request.urlopen(url,data=a)
print(response.read())

在结果中可以看到,返回值的form的值就是我们传入的word:hello,表示这是以post方式传递的请求。

可选参数之二,time:

timeout参数就是设置超时时间,单位为秒,如果超时还没得到响应就会抛出异常,不指定该参数就使用全局默认时间。一般跟try-except结合使用,如果超时,就接收异常进行处理。

代码示例:

import urllib.request
import urllib.errorurl = "https://www.baidu.com"
try:response = urllib.request.urlopen(url,timeout=0.0000000000000001)
except urllib.error.URLError as e:if isinstance(e.reason,socket.timeout):print('超时辣')

上述代码要求在0.00000000001秒内访问百度,这是肯定超时的,然后程序接收urllib.error.URLError的异常,socket。timeout判断是否为timeout错误,是的话就输出 "超时辣"。

还有其他可选参数,用处不大或不那么重要,这里不再赘述。

2.Request()方法

这个方法用来创建一个请求对象的数据结构,可以让我们将请求独立为一个对象,可以更加丰富灵活地配置参数,比如加入Headers等信息。而实际发送请求,还是使用的urlopen方法。

代码示例:

import urllib.requesturl = "https://www.baidu.com"req=urllib.request.Request(url)  #创建一个请求对象response = urllib.request.urlopen(req)  #发送请求
print(response.read().decode("UTF-8"))

Request()方法的强大构造能力跟它的参数有关。共有六个参数:url,data,headers,origin_req_host,unverifiable和method,其中url是必传从参数,其他是可选参数。

url不必多说,data跟urlopen的data参数一样,必须用bytes()方法转换为bytes类型的;origin_req_host是请求方的host名称或者ip地址;unverifiable表示这个请求是否是无法验证的,默认为FALSE;method是一个字符串,表示请求的方法是什么(POST,GET,PUT等)

重点是headers(请求头),它的参数值是一个字典,最常用的是通过修改User-Agent来伪装浏览器,默认的是Python-urllib,我们可以通过修改它来伪装成浏览器。

3.高级操作工具:Handler

​​​​​​urllib.request模块里的baseHandler类时其他Handler的父类,它提供最基本的方法如default_open()等。

常用的Handler类有:

  • HTTPDefaultErrorHandler:处理http响应错误
  • HTTPRedirectHandler:处理重定向
  • HTTPCookieProcessor:处理cookie
  • ProxyHandler:用于设置代理,默认为空
  • HTTPPasswordMgr:用于管理密码,维护用户名和密码的表
  • HTTPBasicAuthHandler:用于管理认证,可以解决认证问题

Handler的常用方式就是和urllib.request里的build_opener一起使用,创建新的opener。opener就是一个对象,可以使用open()方法,像urlopen和Request一样可以访问网站。opener的一般创建格式为:opener=build_opener(某一功能的Handler类)

代码示例:

from urllib.request import ProxyHandler,build_openerurl = "https://www.baidu.com"proxyHandler=ProxyHandler({'http':'http://127.0.0.1:9743','https':'https://127.0.0.1:9743'})
opener=build_opener(proxyHandler)
response = opener.open(url)
print(response.read().decode("UTF-8"))

上面就是添加代理的一个例子。

总结步骤为:

  1. 导入
  2. 使用需要的Handler方法创建一个对象赋值给变量
  3. 将该变量传参给build_opener()方法,创建opener对象
  4. opener对象使用open()方法访问传入的url,将返回的源代码赋值给变量
  5. 从该变量中获取需要的信息

二:error模块

在上文的timeout的介绍中出现了urllib.error.URLError的异常类型,request模块产生的异常都可以通过这个异常类型捕获然后处理。

URLError只有一个属性reason,即错误的原因

代码示例:

import urllib.error
import urllib.requesttry:response=urllib.request.urlopen("https://libiafdfd.com")#一个根本不存在的网页except urllib.error.URLError as e:print(e.reason)

URLError还有子类HTTPError,专门用来处理HTTP请求错误,有三个属性:code(返回http状态码),reason(返回错误原因),headers(返回请求头)建议先捕获子类异常,再捕获父类异常。

三:parse模块

parse模块可以对url进行识别分段,合并以及链接转换。

1.urlparse()

该方法可以实现url的识别和分段。

代码示例:

import urllib.parseurl = "https://www.baidu.com"
result = urllib.parse.urlparse(url)
print(result)

result就是对该url的成分解析,它其实是一个元组,可以通过下标或属性名访问对应信息。urlparse()还有两个参数scheme和allow_fragments,不是很重要,这里不多介绍。

2.urlunparse()

这个方法就是将传入的长度为6的元组或列表构造为url

代码示例:

import urllib.parsedata=["http","www.baidu.com","index.html","user","a=6","comment"]
print(urllib.parse.urlunparse(data))

还有urlsplit()和urlunsplit()方法,分别跟urlparse和urlunparse对应,变化不大且不常用,这里不多介绍。

3.urljoin()

这个方法可以实现对url的更新或补充。使用方法为:第一个参数是基础url,第二个参数可以是基础url没有的链接元素,会补充到基础url上;基础url有的,则会更新,就是使用第二个参数里面的元素取替换基础url里的。

4.urlencode()

这个方法常用来构造GET请求的参数,可以将字典的内容转化为GET请求的参数。

5.parse_qs()

这个方法可以将GET请求的参数转化为字典(就是跟urlencode()反着来的)

6.parse_qsl()

这个方法也是转化GET的参数,只不过是转化为列表,并且其中每一个元素都是元组。

7.quote()

该方法可以将内容转化为url编码的格式,可以转化中文字符。

代码示例:

from urllib.parse import quotename = '李白'
url = 'https://www.baidu.com'+quote(name)print(url)

8.unquote()

该方法就是解码,跟quote()反着来的。

四:robotparser模块

robot协议用来告诉爬虫和搜索引擎哪些东西是可以抓取,哪些是不能抓取的。该协议一般放在名为robots.txt的文件里,一般有三类信息:User-agent,Allow,Disallow。

User-agent就是爬虫的名称,Allow就是允许爬取的目录,Disallow就是不允许爬取的目录。

比如:

表示不允许任何爬虫访问任何目录:
User-agent:*
Disallow:/  表示允许所有爬虫访问所有目录:
User-agent:*
Allow:/  禁止所有爬虫访问一些目录:
User-agent:*
Disallow:/private/
Disallow:/jntm/只允许一个爬虫访问:
User-agent:cxk
Disallow:
User-agent:*
Disallow:/

robotparse模块就是用来解析网站的robots.txt文件的。

首先要创建RobotFileParse对象:

rp= RobotFileParse()

然后通过这个对象来使用robotparse模块里的方法解析robots.txt文件

1.set_url()

用来设置robots.txt文件的链接

rp.set_url('https://www.baidu.com/robots.txt')

2.read()

这个方法用来执行一个读取和分析的操作,不会返回任何值,但是必须有,建议在使用完set_url()方法后第二步马上衔接一个这个操作rp.read()

3.parse()

这个方法用来解析robots.txt文件,传入的参数是该文件某些行的内容。

4.can_fetch()

这个方法传入两个参数,第一个是User-agent,第二个是要抓取的url,返回内容是True或False,表示这个网站能否被该User-agent爬虫爬取。

5.mtime()

这个返回抓取和分析robots.txt的时间,用于定期检查和抓取最新的robots.txt

6.modified()

这个方法会将当前时间设置为上次抓取和分析robots.txt的时间,也是用于定期检查和抓取最新的robots.txt。

代码示例

from urllib.robotparser import RobotFileParserrp = RobotFileParser()
rp.set_url("https://www.baidu.com/robots.txt")
rp.read()
a = rp.can_fetch("*","https://www.baidu.com")
print(a)

Python爬虫学习日志——day1(urllib)相关推荐

  1. python爬虫学习3:urllib.parse中urlencode(),quote()

    urllib.parse 模块提供了很多解析和组建 URL 的函数,它定义了处理URL的标准接口,例如实现URL各部分的抽取.合并以及链接转换. 其中用来编码是 urlencode() 与 quote ...

  2. Python爬虫学习日志(8)

    实例2:当当网商品信息的定向爬虫 编写爬虫 1.功能描述 在当当网站搜索关键词"东野圭吾" 2.程序的结构设计 操作步骤 源代码 3.存在的问题 编写爬虫 1.功能描述 (淘宝网的 ...

  3. python爬虫学习19

    python爬虫学习19 经过urllib与requests库的学习,相信我们已经对python爬虫有了一个初步的掌握了,下面我们将一起学习正则表达式的运用(还记得之前挖的坑嘛?). 三.正则表达式 ...

  4. Python爬虫学习系列教程

    大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫 ...

  5. 新手python爬虫代码_新手小白必看 Python爬虫学习路线全面指导

    爬虫是大家公认的入门Python最好方式,没有之一.虽然Python有很多应用的方向,但爬虫对于新手小白而言更友好,原理也更简单,几行代码就能实现基本的爬虫,零基础也能快速入门,让新手小白体会更大的成 ...

  6. Python爬虫学习系列教程-----------爬虫系列 你值的收藏

    静觅 » Python爬虫学习系列教程:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把 ...

  7. Python 爬虫学习 系列教程

    Python爬虫 --- 中高级爬虫学习路线 :https://www.cnblogs.com/Eeyhan/p/14148832.html 看不清图时,可以把图片保存到本地在打开查看... Pyth ...

  8. python爬虫学习14

    python爬虫学习14 这里写目录标题 python爬虫学习14 get 请求 简单的GET请求 附加信息的GET请求 返回值的类型 抓取网页 抓取二进制数据 添加请求头 get 请求 简单的GET ...

  9. 铁憨憨的Python 爬虫学习 Python_Learn

    通过网课和万能的B站学习 Python 和爬虫(本文基本是对视频内程序和内容的笔记内容) B站 Python 爬虫学习链接 Python 学习网络爬虫主要分3个大的版块:明确目标,抓取,分析,存储 明 ...

最新文章

  1. 重磅!公开课|四旋翼飞行器:算法与实战
  2. 报告视频录制:腾讯会议录屏+人像画中画特效
  3. 9.Methods(二)
  4. Win32系统下安装Win64补充说明
  5. Linux查看swap使用情况小脚本
  6. [云炬python3玩转机器学习]5-10 更多关于线性回归的讨论
  7. vue 单选框样式_作为一位Vue工程师,这些开发技巧你都会吗?
  8. C++静态成员和非静态成员的区别 及修饰
  9. 论文浅尝 | 基于神经网络的推理(DeepMind Relational Reasoning)
  10. 从零学ELK系列(四):Docker安装Elasticsearch(超详细图文教程)
  11. (How to)Windows Live Writer插入Latex公式(补充)
  12. Centos 下tomcat环境搭建
  13. 金融类自定义View(二)--股票分时图
  14. 使用python绘制热力图(调用百度地图API)
  15. UOS启用wayland
  16. 实例学习网页制作中常用的网页表单的应用
  17. 【Luat-esp32】3.陀螺仪-mpu6050
  18. EF更新使用AutoMapper_se7en3_新浪博客
  19. 全国大学生数学建模竞赛获奖难度
  20. Javascript 计算一年中的第几周 从几号开始到几号结束

热门文章

  1. python按照号段生成手机号接收验证码,验证手机号码格式的正则表达式编写思路详解...
  2. 每个无线路由器都是窃听神器:房间里的一举一动它都能感应
  3. mysqlplus 批量插入_mybatis+mysql批量插入和批量更新
  4. 博阅电纸书_博阅电纸书评测:轻松阅读的开始
  5. 异步社区两周年记-好礼不断
  6. 组合导航(四):惯性导航系统
  7. STM32HAL 移植 cJSON开源库 (裸机开发神器)
  8. 2016年数学建模美赛题目原文及翻译-C [个人思路]
  9. UGUI—Slider控制变量
  10. demo代码目录整理