Python中有一个功能强大,用于操作URL,并且在爬虫中经常使用的库、就是Urllib库。
(在python2的时候,有Urllib库,也有Urllib2库。Python3以后把Urllib2合并到了Urllib中)
合并后,模块中有很多的位置变动。我在这里先介绍一些常用的改动。
Python2: import urllib2
>>>>>Python3:import urllib.request,urllib.error
Python2:import urllib
>>>>>Python3:import urllib.request,urllib.error,urllib.parse
Python2:import urlparse
>>>>>Python3:import urllib.parse
Python2:urllib2.urlopen
>>>>>Python3:urllib.request.urlopen
Python2:urllib.urlencode
>>>>>Python3:urllib.request.urlencode
Python2:urllib.quote
>>>>>Python3:urllib.request.quote
Python2:cookielib.CookieJar
>>>>>Python3:http.CookieJar
Python2:urllib.Request
>>>>>Python3:urllib.request.Request
以上是Urllib中常用命令的一些变动。如果之前没有Urllib的基础也没关系,本文后面会详细介绍这些代码的具体应用,以及其实现的各种功能。
我们使用Urliib爬取一个网页的时候。首先要导入Urllib模块。
import urllib.request
导入了模块以后,我们需要使用urllib.request.urlopen打开并爬取一个网页。然后将爬取到的网页赋值给变量neirong
这里需要将得到的内容读出来 read()
输入结果后可以查看到网页的html代码。
要注意的是:
f.read()和f.readlines()都是读取全部内容。
read()会把读取的内容赋给一个字符串变量。
readlines()把读取的内容赋给一个列表变量
我们得到了网页的html代码后,可以以.html的形式保存到本地的1.html
代码很简单,完整代码如下。
这就是一次简单爬取网页信息并简单处理了。
接下来我会对Urllib做更深入的讲解。
首先我想说并不是每一次的获取都是有效的,很多时候我们无法爬取一些网页,会提示403错误。因为这些网页为了防止别人恶意采集信息所以进行了一些反爬虫的设置。
那我们该如何爬取这些网页的信息。那就是自行设置一些Headers信息,模拟成浏览器去访问这些网站。这样就能正常的爬取我们想要的信息了。
当使用之前的爬取方法出现403的时候,我们需要去设置User-Agent信息。
比如任意打开一个网页,(www.baidu.com)按下F12进入开发者模式。点击Network标签。
然后往下拖动,找到User-Agent。并复制出来
得到Headers中的User-Agent信息:
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
下面则是两种让爬虫模拟成浏览器访问网页的设置方法。
1:使用build_opener()修改报头
urlopen()并不支持一些HTTP高级功能。所以我们修改报头的时候,可以使用urllib.request.build_opener()
进行。
代码如下:
我们先定义了一个变量url存储要爬取的网址,然后再定义了一个变量headers存储对应的User-Agent信息。定义的格式为(“User-Agent”,具体信息)
然后我们需要使用urllib.request.build_opener()
创建自定义的opener对象并赋给变量opener,然后设置opener对象的addheaders,(头信息)
设置格式为“opener对象名.addheaders=[头信息]”
设置完头信息之后,我们就可以使用opener对象的open()方法打开对应的网址。
此时打开的操作已经是具有头信息的打开操作行为了。(也就是模仿浏览器打开)使用格式是“opener对象名.open(url地址)”。
打开后再用read方法读取对应数据,并保存。
方法2:使用add_header()添加报头
我们使用urllib.request.Request()
下的add_header()
实现浏览器的模拟。
基本格式如方法1。
有的时候我们访问一个网页,如果该网页长时间未响应,那么系统会判断该网页超时了,则无法打开该网页。
有的时候我们需要根据自己的需求来设置超时的时间值。比如我们可以将timeout的值设置为1.
import urllib.request
for i in range(1,100):
try:
file = urllib.request.urlopen("http://www.huaidianzi.cn/",timeout=0.5)
data = file.read()
print(len(data))
except Exception as e:
print("出现异常-->"+str(e))
上述代码中,我们进行了99次循环,每一次都会循环着爬取网址“http://www.huaidianzi.cn/”,
设置超时时间为0.5。即1秒钟未响应判定为超时,并读取网站信息。输出获取到的内容的长度。
打印结果如下:
我们可以看到,将timeout的值设置为0.5以后。响应时间是非常短的,我们在短时间发送了大量访问请求,有的时候则无法响应,大部分时间还是没有异常的。
但是为了防止这种异常,我们需要将timeout的值设置的高一点。
ps:爬取的时候设置超时异常的值,可以在urlopen()打开网址的时候,通过timeout字段设置。
client和server消息传递的时候,我们可以使用HTTP协议请求进行。HTTP协议请求主要分为6种类型。主要如下:
1、GET请求(通过url网址传递信息,也可以通过表单传递)
2、POST请求(可以向服务器提交数据,主流传递方式)
3、PUT请求(请求服务器一个资源,通常要指定储存的位置)
4、DELETE请求(请求服务器删除一个资源)
5、HEAD请求(获取对应的HTTP报头信息)
6、OPTIONS请求(获取URL支持的请求类型)
7、TRACE请求(用与测试和诊断)
8、CONNECT请求
我们下面主要讲解GET请求和POST请求。
GET请求
我们在百度上的搜索框输入hello。然后F12、点击Network查看信息。
可以看出来是get请求,那我们猜想GET的关键词为wd,
网址的格式是https://www.baidu.com/s?wd=
所以可以把wd=后面的都去掉。
根据分析出来的这个规律。我们可以构造GET请求,用爬虫实现在百度上自动查找某个关键词。
import urllib.request
keywd="hello"
url = "http://www.baidu.com/s?wd="
key = "哈哈哈"
key_code=urllib.request.quotoe(key)
url_all=url+key_code
req=urllib.request.Request(url_all)
data = urllib.request.urlopen(req).read()
fhandle=open("1.html","wb")
fhandle.write(data)
fhandle.close()
我们给keywd赋值,构造url,然后构建一个Request对象赋给变量req。通过rullib.request.urlopen()打开对应的Request对象。
总结:我们要使用GET请求
1、构建对应的URL地址,该URL地址包含GET请求字段名和字段内容等信息,并且URL地址满足GET请求的格式。
2、以对应的URL为参数,构建Request对象。
3、通过urlopen()打开构建的Request对象
4、按需求进行后续的处理操作。读取写入。
POST请求
我们在登录注册的操作时,基本上都会遇到POST请求。
表单的传递方法是POST方法,所以想使用爬虫自动实现,我们要构造一个POST请求。思路如下:
1、设置好URL网址
2、构建表单数据,并用urllib.parse.urlencode对数据进行编码处理
3、创建Request对象。参数包括URL地址和要船体的数据
4、使用add_header()添加头信息,模拟浏览器进行爬取
5、使用urllib.request.urlopen()打开对应的Request对象。完成信息传递
6、后续处理,读取数据,下载保存数据
假设登录表单中有名字和密码两个input框。
我们先构建表单数据,在网页上右击 查看页面源代码。找到对应的form表单部分。然后进行分析。
表单的输入框中,name的属性值是"name",密码对应的name值是"pass".所以我们构造的数据中要包含两个字段。字段值设置为对应的我们要传递的值。格式为字典形式:
{字典名1:字段值1,字段名2:字段值2,}
构造好数据之后,用urlencode对数据进行编码。
然后继续之前的步骤。
有时候用同一个IP区爬取同一个网页,久了之后会被网站屏蔽。
所以我们需要使用代理服务器来爬取,当我们使用代理服务器爬取的时候显示的不是我们的真是IP。而是代理服务器上的IP地址。并且在python中设置代理服务器也很简单。
(可以在互联网上搜索代理服务器地址)
使用时的格式为:“IP地址:端口号”
我们如果需要在运行的同时调试日志。则需要开始DebugLog
开启方式如下
1、分别使用urllib.request.HTTPHhandler()和urllib.request.HTTPSHandler()将debuglevel设置为1。
2、使用urllib.request.build_opener()创建自定义的opener对象。并使用1中的值作为参数
3、用urllib.request.install_opener()创建全局默认的opener对象,这样在使用的时候,也会安装我们opener对象。
4、进行后续操作,不如urlopen()等
一般我们会遇到的error有:
1、链接不上服务器
2、远程URL不存在
3、无网络
4、触发了HTTPError
下面链接有常见的状态码:(重要!)
本篇文章分析了Urllib库里面的常用方法。
Urllib库是我们爬虫很重要,需要熟练使用的库。
所以希望大家认真看完。
后续内容请等待博客发布。
下一篇:正则表达式解析及练习