本博客内容来自韦玮老师网络爬虫课堂笔记,仅用于个人学习和复习,请勿转载用于其他商业用途。
Urllib库(二)
1、自动模拟HTTP请求
客户端如果要与服务器端进行通信,需要通过http请求进行,http请求有很多种,这里只讲post和get两种请求方式。登陆、搜索某些信息的时候会用到。
import urllib.request
keyword = "Python"
url = "http://www.baidu.com/s?wd=" + keyword
req = urllib.request.Request(url) #封装成一个请求
data = urllib.request.urlopen(req).read()
fh = open("D:/PROGRAMMING/数据分析/Python数据分析与挖掘实战视频教程/实验/2.html", "wb")
fh.write(data)
fh.close()
运行后我们可以看到,百度网页被爬下来了,打开后显示的是搜索“Python”后的结果。这里面要注意的是,编写代码输入网址时,不要写成https://而要写成http://,不然会由于证书的问题爬取失败。
此外,还有编码的问题:如果上面keyword出现的是中文,也运行的时候就会报错。此时我们需要进行编码上的操作。
keyword = "编程"
keyword = urllib.request.quote(keyword) #对中文进行编码
url = "http://www.baidu.com/s?wd=" + keyword
req = urllib.request.Request(url)
data = urllib.request.urlopen(req).read()
fh = open("D:/PROGRAMMING/数据分析/Python数据分析与挖掘实战视频教程/实验/2.html", "wb")
fh.write(data)
fh.close()
上面的例子中增加了一行代码,keyword = urllib.request.quote(keyword)
2、处理POST请求
我们在登陆网站输入用户名和密码的时候,会使用到POST请求。使用韦玮老师的网站可以进行验证:www.iqianyue.com/mupost/
首先我们需要分析一下这个网站:
<html>
<head>
<title>Post Test Page</title>
</head>
<body>
<form action="" method="post">
name:<input name="name" type="text" /><br>
passwd:<input name="pass" type="text" /><br>
<input name="" type="submit" value="submit" />
<br />
</body>
</html>
可以看到姓名的name的属性对应的是"name",密码的name属性对应的是"pass"。我们要关注的就是name属性所对应的值。
我们也可以用新浪的登陆页面来试一下:网址为www.login.sina.com.cn,然后我们查看页面源代码,通过搜索<form表单找到登陆相关代码如下:
我们只要关注name所对应的值,因为涉及到我们自己写代码时需要赋值的对象。可以看到,图片中为"username"。同理,密码的值可以找到为password。
import urllib.request
import urllib.parse
url = "http://www.iqianyue.com/mypost/"
my_data = urllib.parse.urlencode({
"name": "hello123",
"pass": "hello123"
}).encode("utf-8")
req = urllib.request.Request(url, my_data) #封装为请求后发过去
data = urllib.request.urlopen(req).read()
fh = open("D:/PROGRAMMING/数据分析/Python数据分析与挖掘实战视频教程/实验/3.html", "wb")
fh.write(data)
fh.close()
奇怪的是,视频里面老师的操作成功了,但是我在实际操作过程中并没有成功……很奇怪
3、爬虫的异常处理
爬虫在运行的过程中,很多时候都会遇到异常。如果没有异常处理,爬虫遇到异常时就会直接崩溃,停止运行,下次再次运行时,又会从头开始。所以,要开发一个具有顽强生命力的爬虫,必须有要进行异常处理。
301 Moved Permanently | 重定向到新的URL,永久性 |
302 Found | 重定向到临时的URL,非永久性 |
304 Not Modified | 请求的资源未更新 |
400 Bad Request | 非法请求 |
401 Unauthorized | 请求未经授权 |
403 Forbidden | 禁止访问 |
404 Not Found | 没有找到对应页面 |
500 Internal Server Error | 服务器内部出现错误 |
501 Not Implemented | 服务器不支持实现请求所需要的功能 |
4、URLError与HTTPError类
两者都是异常处理的类,HTTPError是URLError的子类,HTTPError有异常状态码与异常原因,URLError没有异常状态码。所以,在处理的时候,不能使用URLError直接代替HTTPError。如果需要代替,必须判断是否有状态码属性。
URLError的主要原因包括:
1、连不上服务器
2、url不存在
3、本地没有网络
4、触发了HTTPError中的异常
import urllib.request
import urllib.error
try:
urllib.request.urlopen("http://blog.csdn.net")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
#
403
Forbidden
上面的例子我们故意去爬取CSDN的博客,肯定会被禁止访问。通过使用hasattr()方法,可以检查是否有错误代码和原因。通过使用if语句,我们可以用URLError来代替HTTPError,如果不使用if语句是肯定不行的。
奇怪的是,我输入上面的代码并没有出现异常,难道因为我是vip么……