python系列:一、Urllib库的基本使用
开篇介绍:
因为我本人也是初学者,爬虫的例子大部分都是学习资料上面来的,只是自己手敲了一遍,同时加上自己的理解。
写得不好请多谅解,如果有错误之处请多赐教。
我本人的开发环境是vscode,pythong为3.6版本。
准备好了吗?我们从例子开始吧。
1、扒一个网页下来
是的,你没有看错,上面的代码就能爬百度首页,核心代码就一句:urllib.request.urlopen('http://www.baidu.com')
2.分析扒网页的方法
我们重点来看看这行代码:urllib.request.urlopen("http://www.baidu.com").
调用的是urllib库里面的urlopen方法,传入一个url,这个网址是百度首页,协议是http协议,当然你也可以把http换做ftp,file,https 等等,只是代表了一种访问控制协议,urlopen一般接受三个参数,它的参数如下:urlopen(url, data, timeout)
第一个参数url即为url,第二个参数data是访问url时要传送的数据,第三个timeout是设置超时时间。
第二三个参数是可以不传送的,data默认为空none,timeout默认为 socket._global_default_timeout
第一个参数url是必须要传送的,在这个例子里面我们传送了百度的url,执行urlopen方法之后,返回一个response对象,返回信息便保存在这里面。
第二行代码:f.read()。response对象有一个read方法,可以返回获取到的网页内容。
3、post和get数据传送
上面的程序演示了最基本的网页抓取,不过,现在大多数网站都是动态网页,需要你动态地传递参数给它,它做出对应的响应。所以,在访问时,我们需要传递数据给它。
数据传送分为post和get两种方式,两种方式有什么区别呢?
最重要的区别是get方式是直接以链接形式访问,链接中包含了所有的参数,当然如果包含了密码的话是一种不安全的选择,不过你可以直观地看到自己提交了什么内容。post则不会在网址上显示所有的参数,不过如果你想直接查看提交了什么就不太方便了,大家可以酌情选择。
post方式:
友情提示:如果报错urllib.error.httperror: http error 405: 原因:请求协议问题 解决:将http 改成https试试。
里面的json也可以写成:
values = {}
get方式:
本章讲解了一些基本使用,可以抓取到一些基本的网页信息。
源码如下:
1 # _*_ coding:utf-8 _*_ 2 import urllib.request 3 4 5 def run_demo(): 6 f=urllib.request.urlopen('http://www.baidu.com') 7 print(f.read()) 8 9 if __name__=='__main__': 10 run_demo() 11 12 ''' 13 # _*_ coding:utf-8 _*_ 14 from urllib import request 15 from urllib import parse 16 from urllib.request import urlopen 17 18 values = {'username': 'biao1603@qq.com', 'password': 'biao1603@qq.com'} 19 data = parse.urlencode(values).encode('utf-8') # 提交类型不能为str,需要为byte类型 20 url = 'http://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn' 21 request = request.request(url, data) 22 response = urlopen(request) 23 print(response.read().decode()) 24 25 # _*_ coding:utf-8 _*_ 26 from urllib import request 27 from urllib import parse 28 from urllib.request import urlopen 29 30 values={} 31 values['username'] = "biao1603@qq.com" 32 values['password']="biao1603@qq.com" 33 data = parse.urlencode(values) 34 url = "http://passport.csdn.net/account/login" 35 geturl = url + "?"+data 36 request = request.request(geturl) 37 response = urlopen(request) 38 print(response.read().decode()) 39 '''