Python爬虫之urllib库

Python爬虫之urllib库python爬虫之urllib库一、urllib简介urllib是python中的一个http请求库,借助urllib,我们可以向浏览器发出请求,只需向urllib库中的方法传入url和一些参数即可。urllib库中包含以下模块:urllib.requesthttp请求模块,用于模拟向浏览器发出请求的过程;urllib.error异常处理模块,当利用urllib.request模拟向浏览器发出请求时,如果出现请求错误,可以利用此模块捕获异常信息,然后进行重试或其他操作,以保证程序不会意

大家好,欢迎来到IT知识分享网。

一、urllib简介

urllib是python中的一个http请求库,借助urllib,我们可以向浏览器发出请求,只需向urllib库中的方法传入url和一些参数即可。

urllib库中包含以下模块:

  1. urllib.request

    http请求模块,用于模拟向浏览器发出请求的过程;

  2. urllib.error

    异常处理模块,当利用urllib.request模拟向浏览器发出请求时,如果出现请求错误,可以利用此模块捕获异常信息,然后进行重试或其他操作,以保证程序不会意外终止;

  3. urllib.parse

    包含了针对url的许多处理方法,如url拆分、url解析、url合并等;

  4. urllib.robotparser

    robots.txt解析模块,主要用于识别网站的robots.txt文件,判断哪些网站可以爬,那些网站不可爬。此模块不太经常被使用。

每个模块中常用的方法及详细解释可参考博文,下面主要用python来展示一些常用的urllib库用法。

二、Python爬虫中常用的urllib方法

首先需要导入urllib模块,如下

import urllib.request
import urllib.parse  # 解析器,将键值对按utf-8或其他形式解析
  1. 获取某个网站的方式
    (1)获取一个get请求
response = urllib.request.urlopen("http://www.baidu.com")
print(response.read().decode("utf-8"))   
# 第二行的输出是对获取到的对象response的信息-网页源码进行utf-8的解码

此时返回的即是百度官网首页的html信息,如下图所示:
在这里插入图片描述
(2)获取pose请求

data = bytes(urllib.parse.urlencode({ 
   "hello": "world"}), encoding='utf-8')  # 一般模拟用户登录时使用此种方式,在{}内加上cookie内容
response = urllib.request.urlopen("https://baidu.com", data=data)
print(response.read().decode("utf-8"))

采用post访问时需要传递表单信息,通过表单的封装才能访问post,代码中bytes将信息转换为二进制包。代码返回信息同上图:

当需要模拟浏览器发出请求时,必须用post形式来封装数据(用data封装),否则有405报错。

  1. 超时处理
    当要访问的服务器排斥爬虫,或链接是死链接、网络不好等情况出现时,页面在一定的时间内会没有反应,这时可以设置一个时间限制,避免一直等待。代码如下:
response = urllib.request.urlopen("https://baidu.com", timeout=0.1)
print(response.read().decode("utf-8"))

若访问超时会出现如下报错:
在这里插入图片描述

此时我们可以利用异常处理结束循环或者停止爬取该网页,向其他网页发送get请求。代码如下:

try:
    response = urllib.request.urlopen("http://www.baidu.com",timeout=0.1)
    print(response.read().decode("utf-8"))
except urllib.error.URLError as e:
    print("time out!")

此时若访问超时会返回如下结果:
在这里插入图片描述

  1. 简单解析-响应头
    网络爬虫有时会返回一些错误信息,此时我们可以返回响应状态码来大致判断报错类型。
response = urllib.request.urlopen("http://www.baidu.com")
print(response.status)   # 返回状态码-200、404、418等
print(response.getheaders())  # 返回头部所有信息

常见的状态码如418报错是因为访问的服务器发现该请求是一个爬虫,也即爬虫时常见的反爬机制,此时可改用requests库、添加header信息等方法解决。

  1. 将爬虫伪装成服务器发出请求
    在第3小节中提到有的网站会设置爬虫机制,此时我们可以伪装成服务器来发出请求,模仿在浏览器中输入访问地址时一样。
# 访问反爬的网址
url = "http://www.douban.com"
headers = { 
   
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
}
req = urllib.request.Request(url=url, headers=headers, method="POST")  # req是请求对象而非响应对象
response = urllib.request.urlopen(req)
html = response.read().decode("utf-8")
print(html)

代码中的headers来自浏览器页面,在chrome中进入想访问的浏览页面,点击F12或右键检查-Network中,即可查到User-Agent信息,粘贴到代码中(需注意大小写及空格,代码中的格式要和浏览器信息一致)。

user-agent的作用是告诉所访问的服务器,我们是何种类型的机器(浏览器),若只用User-Agent会返回百度验证界面,可加入Cookie返回所要爬取的结果页面

以上是python爬虫时的部分小功能,除此之外爬虫得方式还有很多种。但是无论采用哪种方式一定要牢记:爬虫千万条,安全第一条。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/23870.html

(0)
上一篇 2023-09-03 21:00
下一篇 2023-09-04 12:33

相关推荐

发表回复

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

关注微信