本次学习的环境是基于Python 3.3.5,实验的工具是Pycharm 5.0.1
基础的知识我就不再介绍,比如HTTP的基础知识、爬虫的相关背景
直接开始爬虫的学习吧!
一、用Python抓取指定页面
常见的urllib2库在Python3.X的版本中改名啦!叫urllib.request了!
urlopen()可以接收三个参数即urlopen(url, data, timeout)
url即你要请求的url地址,data是访问这个url需要传送的数据,timeout是超时时间
url是必填参数,其余两个是可选参数
urllib.request.urlopen(url)会返回一个http.client.HTTPResponse对象
这个返回的对象可以使用read()方法,来返回数据
# encoding: utf-8
import urllib.request
response = urllib.request.urlopen("http://www.baidu.com")
print(response.read())
这样一个脚本就可以让我们得到所填入的www.baidu.com
这个网址的网页源码,你可以开启浏览器,然后按下F12来对照看是不是一样
如果我们不调用read这个方法,会打印出什么呢?会打印出下面这样一行
<http.client.HTTPResponse object at 0x0314B690>
这样就直接把这个对象的描述打印出来了,而不是具体内容了
二、构造Request
根据我们的习惯,我们应该当传入一个request的实例,我们可以改写上面的代码为
# encoding: utf-8
import urllib.request
request = urllib.request.Request("http://www.baidu.com")
response = urllib.request.urlopen(request)
print(response.read())
这样也是完全相同的效果,我们必须注意的是库是区分大小写的,Request写成request是不能被识别的,会报错
这样我们就完成了构建一个request,然后得到服务器对请求的应答,这样更符合直观的逻辑
需要说明的是,urllib.request.Request()是统一处理所有URL头的方法,你可以直接使用ftp://baidu.com
也是可以的
三、传递表单数据
Web传递表单数据的常见方式有POST和GET两种方式,我们可以构造一个表单作为data,然后编码成标准形式,作为参数传递给Request对象
值得注意的是,编码所使用的库为urllib的函数而不是像之前的程序可以只引用一个urllib2库就可以了,Python 3.X的版本和和之前的2.X的版本差距还是真大
遇到这个错误TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str
时,是需要在url编码后再使用utf-8进行编码,否则会出现这个类型错误。修改方法是)urllib.parse.urlencode(valu