How to 抓取网页数据,使用urllib库

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、什么是urllib
  • 二、快速使用urllib爬取网页
  • 三、使用urllib实现数据传输
  • 四、添加特定Headers-请求伪装
  • 五、代理服务器
  • 六、超时设置和常见的网络异常


前言

这是一次简单的爬虫--urllib抓取网页数据总结,如有错误与不足还望指出!


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是urllib

1.含义:

urllib库是python内置的HTTP请求库,它可以看做是处理URL的组件集合。

2.模块名称:

        1.urllib.request——请求模块

        2.urllib.error——异常处理模块

        3.urllib.parse——url解析模块

        4.urllib.robotparser——robots.txt解析模块


二、快速使用urllib爬取网页

1,导入库  ——import urllib.request

2,调用urllib.resquest库的urlopen方法,并传入一个url 

response=urllib.request.urlopen('xxxxx网址xxxx')

#使用read方法读取获取到的网页内容

html = response.read().decode('UTF-8')

#打印网页内容

print(html)

3.Python2中使用的是urllib2库来下载网页,该库的用法如下所示:

import urllib2response = urllib2.urlopen('xxxx网址xxx")

4,快速使用urllib爬取网页

Python3出现后,之前Python2中的urllib2库被移到了 urllib.request模块中,之前urllib2中很多函数的路径也发生了变化,希望大家在使用的时候多加注意。

5.urlopen方法

在爬取网页时,有一句核心的爬虫代码,(以百度为例)

response = urllib.request.urlopen('http://www.baidu.com')

上述代码调用的是urllib.request模块中的urlopen方法,它传入了一个百度首页的URL,使用的协议是HTTP,这是 urlopen方法最简单的用法。

6.urlopen方法可以接收多个参数

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

参数如下:

url——表示目标资源在网站中的位置。

data——用来指明向服务器发送请求的额外信息。

timeout ——该参数用于设置超时时间,单位是秒。

context——实现SSL加密传输,该参数很少使用。

7,使用HTTPResponse对象

使用urlopen方法发送HTTP请求后,服务器返回的响应内容封装在一个HTTPResponse类型的对象中。

#导入库
import urllib.request

#发送请求
response = urllib.request.urlopen('http://www.baidu.cn')

#打印
print(type(response))#<class 'http.client.HTTPResponse'

8.使用HTTPResponse对象

HTTPResponse类属于http.client模块,该类提供了获取URL、状态码、响应内容等一系列方法。

        geturl()--用于获取响应内容的URL,该方法可以验证发送的HTTP请求是否被重新调配。

        info()--返回页面的元信息。

        getcode()--返回HTTP请求的响应状态码。

代码实例如下:

#1.导入库
import urllib.request
#2.请求网址(以python官网为例)
response = urllib.request.urlopen('http://python.org')

#3.获取响应信息对应的URL

print(response.geturl())

#4.获取响应码
print(response.getcode())

#5.获取页面的元信息
print(response.info())

结果如下:

9.构造Request 对象(建议首选)

如果希望对请求执行复杂操作,则需要创建一个Request 对象来作为urlopen方法的参数。

#将url作为Request方法的参数,构造并返回一个Request对象(百度为例)

request = urllib.request.Request('http://www.baidu.com')

#将Request对象作为urlopen方法的参数,发送给服务器并接收响应

response = urllib.request.urlopen(request)

构建请求时,除了必须设置的url参数外,

还可以加入很多内容,例如下面的参数参数如下:

data——默认为空,该参数表示提交表单数据,同时HTTP请求方法将从默认的GET方式改为POST方式。

headers——默认为空,该参数是一个字典类型,包含了需要发送的HTTP报头的键值对。


三、使用urllib实现数据传输

1.URL编码转换

当传递的URL中包含中文或者其它特殊字符(如空格等)时,需要

使用urlib.parse 库中的urlencode方法将URL进行编码

解码使用的是url.parse库的 unquote 方法。

2.处理GET请求

GET请求一般用于向服务器获取数据。

例如:用百度搜索“百度官网”

此时,如果使用Fiddler查看HTTP请求,发现有个GET请求的格式如下:

在这个请求中,“?”后面的字符串就包含了我们要查询的关键字“百度官网”。

3.处理POST请求

   


四、添加特定Headers-请求伪装

1.添加特定Headers—请求伪装

如果不是从浏览器发出的请求,我们是不能获得响应内容的。针对这种情况,我们需要将爬虫程序发出的请求伪装成一个从浏览器发出的请求。

2.伪装浏览器需要自定义请求报头,也就是在发送Request请求时,加入特定的请求


五、代理服务器

1.简单的自定义opener

很多网站会检测某一段时间某个IP的访问次数,如果同一IP访问过于频繁,那么该网站会禁止来自该IP的访问。

我们可以使用代理服务器,每隔一段时间换一个代理。

如果某个IP被禁止,那么就可以换成其他IP继续爬取数据,从而可以有效解决被网站禁止访问的情况。

2.opener 是 urllib.request.OpenerDirector类的对象,我们之前一直都在使用的urlopen,就是模块帮我们构建好的一个Opener

但是——urlopen 不支持代理、Cookie等其他的HTTP/HTTPS高级功能,所以如果要想设置代理,不能使用自带的urlopen,而是要自定义opener。

3.注意:

如果程序里所有的请求都使用自定义的opener,可以使用 urllib2.install_opener()将自定义的opener对象定义为全局opener,表示之后凡是调用urlopen,都将使用自定义的opener。

4.设置代理服务器

我们可以使用urllib.request中的ProxyHandler 方法来设置代理服务器。

5.免费开放代理

免费开放处理的获取基本没有成本,可以在一些代理网站上收集这些免费代理,测试后如果可以用,就把它收集起来用在爬虫上面。

免费代理网站主要有以下几个:

1.西刺免费代理IP

2.Proxy360代理

3.全网代理IP

4.快代理免费代理

tips:免费开放代理一般会有很多人都在使用,而且代理有寿命短,速度慢,匿名度不高等缺点。所以,专业爬虫工程师或爬虫公司会使用高品质的私密代理,这些代理通常需要找专门的代理供应商购买,再通过用户名/密码授权使用。

如果代理IP足够多,就可以像随机获取User-Agent样,随机选择一个代理去访问网站。


六、超时设置和常见的网络异常

1.超时设置

我们可以为HTTP请求设置超时时间,一旦超过这个时间,服务器还没有返回响应内容,那么就会抛出一个超时异常,这个异常需要使用try语句来捕获。

2.处理异常

用try-except语句捕获

为保证程序能够正常终止,我们可以使用try-except 语句捕获相应的异常,并对异常进行相应的处理。由于谷歌网站服务器的原因,访问该网站必定会出现连接超时的问题。下面以访问谷歌网站为例,为大家演示如何使用try-except语句捕获RequestException异常。

import time,requests
print(time.strftime('开始时间:%Y-%m-%d%H:%M:%S'))#记录请求的发起时间
try:#捕获RequestException异常
html_str =requests.get('http://www.google.com').text
print('访问成功)
except requests.exceptions.RequestException as error:
print(error)
#记录请求的终止时间
print(time.strftime('结束时间:%Y-%m-%d%H:%M:%S))

为了减少无意义的等待,我们在发送HTTP请求时可以设置超时时长,即调用getO函数时传入timeout参数,并给该参数指定代表超时时长的值,如果超过该时长,服务器仍然没有返回任何响应内容,就让程序立即引发一个超时异常。在以上示例中,为请求设置超时时长为5秒。

html_str=requests.get('http://www.google.com',timeout=5).text 
#发送GET请求,设置超时时长


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值