Urllib库是Python中的一个功能强大、用于操作URL,并在做爬虫的时候经常要用到的库。在Python2.x中,分为Urllib库和Urllib2库,Python3.x之后都合并到Urllib库中,使用方法稍有不同。本文介绍的是Python3中的urllib库。
什么是Urllib库
Urllib是Python提供的一个用于操作URL的模块,我们爬取网页的时候,经常需要用到这个库。
升级合并后,模块中的包的位置变化的地方较多。在此,列举一些常见的位置变动,方便之前用Python2.x的朋友在使用Python3.x的时候可以快速掌握。
常见的变化有:
- 在Pytho2.x中使用import urllib2——-对应的,在Python3.x中会使用import urllib.request,urllib.error。
- 在Pytho2.x中使用import urllib——-对应的,在Python3.x中会使用import urllib.request,urllib.error,urllib.parse。
- 在Pytho2.x中使用import urlparse——-对应的,在Python3.x中会使用import urllib.parse。
- 在Pytho2.x中使用import urlopen——-对应的,在Python3.x中会使用import urllib.request.urlopen。
- 在Pytho2.x中使用import urlencode——-对应的,在Python3.x中会使用import urllib.parse.urlencode。
- 在Pytho2.x中使用import urllib.quote——-对应的,在Python3.x中会使用import urllib.request.quote。
- 在Pytho2.x中使用cookielib.CookieJar——-对应的,在Python3.x中会使用http.CookieJar。
- 在Pytho2.x中使用urllib2.Request——-对应的,在Python3.x中会使用urllib.request.Request。
快速使用Urllib爬取网页
import urllib.request
在导入了模块之后,我们需要使用urllib.request.urlopen打开并爬取一个网页,此时,可以输入如下代码爬取百度首页(www.baidu.com),爬取后,将爬取的网页赋给了变量file:
>>>file=urllib.request.urlopen('www.baidu.com')
此时,我们还需要将对应的网页内容读取出来,可以使用file.read()读取全部内容,或者也可以使用file.readline()读取一行内容。
>>>data=file.read() #读取全部 >>>dataline=file.readline() #读取一行内容
读取内容常见的有3种方式,其用法是:
- read()读取文件的全部内容,与readlines()不同的是,read()会把读取到的内容赋给一个字符串变量。
- readlines()读取文件的全部内容,readlines()会把读取到的内容赋值给一个列表变量。
- readline()读取文件的一行内容。
- 爬取一个网页并将爬取到的内容读取出来赋给一个变量。
- 以写入的方式打开一个本地文件,命名为*.html等网页格式。
- 将步骤1中的变量写入该文件中。
- 关闭该文件
我们刚才已经成功获取到了百度首页的内容并读取赋给了变量data,接下来,可以通过以下代码实现将爬取到的网页保存在本地。
>>>fhandle=open("./1.html","wb")
>>>fhandle.write(data)
>>>fhandle.close()
此时,1.html已窜在我们指定的目录下,用浏览器打开该文件,就可以看到我们爬取的网页界面。
>>>file.info()
>>>file.getcode() 200
如果想要获取当前所爬取的URL地址,我们可以使用geturl()来实现。
>>>file.geturl() 'http://www.baidu.com'
>>>urllib.request.quote('http://www.baidu.com') 'http%3A//www.baidu.com'
那么相应的,有时候需要对编码的网址进行解码
>>>urllib.request.unquote('http%3A//www.baidu.com') 'http://www.baidu.com'
浏览器的模拟—Headers属性

我们可以得到该信息:
User-Agent:Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 X-Requested-With:XMLHttpRequest
接下来,我们讲解如何让爬虫模拟成浏览器访问页面的设置方法。
import urllib.request
import urllib.parse
url='http://www.baidu.com'
hearder={
'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
request=urllib.request.Request(url,headers=header)
reponse=urllib.request.urlopen(request).read()
fhandle=open("./1.html","wb")
fhandle.write(reponse)
fhandle.close()
超时设置
HTTP协议请求实战
- GET请求:GET请求会通过URL网址传递信息,可以直接在URL中写上要传递的信息,也可以由表单进行传递。如果使用表单进行传递,这表单中的信息会自动转为URL地址中的数据,通过URL地址传递。
- POST请求:可以向服务器提交数据,是一种比较主流也比较安全的数据传递方式,比如在登录时,经常使用POST请求发送数据。
- PUT请求:请求服务器存储一个资源,通常要指定存储的位置。
- DELETE请求:请求服务器删除一个资源。
- HEAD请求:请求获取对应的HTTP报头信息。
- OPTIONS请求:可以获取当前URL所支持的请求类型。
GET请求示例分析
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=hello
可以发现,对应的查询信息是通过URL传递的,这里采用的就是HTTP请求中的GET请求方法,我们将该网址提取出来进行分析,字段ie的值为utf8,代表的是编码信息,而字段wd为hello,刚好是我们要查询的信息,所以字段wd应该存储的就是用户检索的关键词。根据我们的猜测,化简一下该网址,可以化简为https://www.baidu.com/s?wd=hello,将该网址复制到浏览器中,刷新一下,会发现该网址也能够出现关键词为‘hello’的搜索结果。
由此可见,我们在百度上查询一个关键字时,会使用GET请求,其中关键性字段是wd,网址格式为:https://www.baidu.com/s?wd=关键词。
分析到这里,你应该大概知道我们该怎么用爬虫实现自动地在百度上查询关键词结果了。直接上代码~
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import urllib.request
import urllib.parse
url='http://www.baidu.com/s?wd='
key='fengxin的博客'
key_code=urllib.request.quote(key) #因为URL里含中文,需要进行编码
url_all=url+key_code
header={
'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
} #头部信息
request=urllib.request.Request(url_all,headers=header)
reponse=urllib.request.urlopen(request).read()
fh=open("./baidu.html","wb") #写入文件中
fh.write(reponse)
fh.close()
通过以上实例我们可以知道,如果要使用GET请求,思路如下:
- 构建对应的URL地址,该URL地址包含GET请求的字段名和字段内容等信息,并且URL地址满足GET请求的格式,即“http://网址?字段名1=字段内容1&字段名2=字段内容2”
- 以对应的URL为参数,构建Request对象。
- 通过urlopen()打开构建的Request对象。
- 按需求进行后续的处理操作,比如读取网页的内容、将内容写入文件等。
POST请求实例分析
- 设置好URL网址。
- 构建表单数据,并使用urllib.parse.urlencode对数据进行编码处理。
- 构建Request对象,参数包括URL地址和要传递的数据。
- 添加头部信息,模拟浏览器进行爬取。
- 使用urllib.requesr.urlopen()打开对应的Request对象。完成信息的传递。
- 后续处理,比如读取网页内容,将内容写入文件等。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import urllib.request
import urllib.parse
url='http://www.iqianyue.com/mypost'
header={
'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
data={'name':'fengxin','pass':'123'}
postdata=urllib.parse.urlencode(data).encode('utf8') #进行编码
request=urllib.request.Request(url,postdata)
reponse=urllib.request.urlopen(request).read()
fhandle=open("./1.html","wb")
fhandle.write(reponse)
fhandle.close()
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216137.html原文链接:https://javaforall.net
