python3网络爬虫——urllib库的使用
学习指引:视频教程《python3网络爬虫实战》
为了避免学习后短时间内遗忘,让自己随时可以查阅前方自己学过的知识,特意注册csdn博客,方便自己学习时做笔记,也方便随时回顾。也希望自己的学习过程能给同样初学python爬虫的你带来一点指引!由于自己是新手,只有一点点的python基础,所以笔记中难免会有很多纰漏,还望各路大神多多包涵,多多指教,如有不正确的地方,欢迎指出。
一眨眼我们就到了第三课了,这一次应该是正式开始python代码的编写了吧,废话不多说,Let’s go!
先放上一篇官方文档:
https://docs.python.org/3.6/library/urllib.html
无意中在github中找到一个很棒的页面,里面讲到了不同的工作目的所需要的不同的库:
https://github.com/vinta/awesome-python
urllib库是什么
这是一个Python内置的http请求库,里面包含了几个模块:
- urllib.request —— 请求模块
- urllib.error —— 异常处理模块
- urllib.parse —— url解析模块
- urllib.robotparser —— robot.txt解析模块
urllib库其实没有request库好用,不过作为初学者,我们有必要了解一下urllib库中的一些基本原理的。文章以实践为主,理论为辅,主要的理论我会上网搜索相关文档并把链接贴上来。
urlopen函数
格式:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
尝试一下
我先在cmd输入命令jupyter notebook
打开了一个web笔记本,第一篇我们安装过的一个软件,这个笔记本能够比较方便地保存我们的代码,并且界面美观。在笔记本里,我新建了一个文件夹(右上角的‘New’可以新建文件夹),用来存放我学习过程中的代码,在新的文件夹里面,我新建了一个python3文件,进入后我就可以敲代码了,注意shift+enter是运行代码哦!里面还支持markdown语法,具体用法网上有教程,可以直接百度到一些基本的markdown语法。找到了一篇讲markdown语法的,不知道对不对,大家可以试试:
https://guides.github.com/features/mastering-markdown/
如果没有安装jupyter的童鞋,可以用其他的编辑器,安装的时候自带额IDLE就非常不错,打开IDLE命令行后,点击Ctrl+N就可以新建一个.py文件,在里面输入代码还有高亮显示,想想就很棒。如果想要追求高效率的话,可以下载一些编辑器,比如notepad++等。
#请求百度页面并打印出来
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))
这里我尝试的时候发现utf-8反编码失败,错误是:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
我上网找了不少资料,没能完美解决,不过我尝试同一段代码多运行几次,结果成功了。
这节课没有太多实践的知识,主要是讲解了urllib库的一些基本用法,我就把练习用到的一些代码贴上来把。
#发送一个post请求,携带data数据
import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf-8')
response =urllib.request.urlopen('http://httpbin.org/post',data = data)
print(response.read())
Request
只单纯用urlopen,只能请求一个网址,没有办法携带更多的数据,那么我们要携带更多数据去请求服务器的话,可以将网址等数据包装成request对象,再将整个对象发送过去
#这是只携带网址的一个例子
import urllib.request
request = urllib.request.Request('https://www.python.org')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
#这个是携带一些其他header信息的例子
from urllib import request,parse
url = 'http://httpbin.org/post'
headers = {
'User-Agent':'Mozilla/4.0(compatible;MSIE 5.5;Windows NT',
'Host':'httpbin.org'
}
dict = {
'name':'Germey'
}
data = bytes(parse.urlencode(dict),encoding = 'utf-8')
req = request.Request(url = url, data=data, headers=headers, method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))
URL解析
urlparse
urllib.parse.urlparse(urlstring, scheme=”, allow_fragments=True)
这个命令能将url链接进行解析,解析成不同的部分,下面有例子。
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=123456#comment')
print(type(result), result)
urlunparse
用来拼接url链接
from urllib.parse import urlunparse
data = ['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data))
urlencode
这个可以将字典形式的文件拼接成链接,平时比较有用
from urllib.parse import urlencode
params = {
'name':'Benko',
'age':21
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)