您的位置:首页 > 理论基础 > 计算机网络

【笔记】3、初学python3网络爬虫——urllib库的使用

2017-10-02 09:32 513 查看

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 网络爬虫