Python之网络爬虫(2)

本博客内容来自韦玮老师网络爬虫课堂笔记,仅用于个人学习和复习,请勿转载用于其他商业用途。

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么……

发布了27 篇原创文章 · 获赞 9 · 访问量 989

猜你喜欢

转载自blog.csdn.net/sinat_42574069/article/details/103104814