天天看点

python学习之urllib使用小结

urllib库是python做爬虫中的基础库,也是许多初学者最先入手的地方,下面是我在学习和使用过程中的一些小结

import urllib.request as ur 用于打开网址

import urllib.error as ue 用于处理异常

import urllib.parse as up 用于构造请求

import http.cookiejar as hc 用于cookies的设置

一般网页的爬取

1.data=ur.urlopen(url,timeout)

url为你想要打开时网址,timeout可以设置超时时间

data有下列几种方法:

data.info():可以查看远程服务器回复的头信息

data.getcode():查看http状态码(200成功,300重定向,400请求被拒绝或者没有资源等,500服务器内部出现了问题)

data.geturl():查看请求的地址

下面的处理方式有两种(注意此时的data是二进制的)

第一种:解码并将其显示或赋值

str1=data.read().decode("utf-8","ignore")    #使用ignore参数来忽视少量的编码错误,方便下面的操作进行
           

第二种:直接用二进制模式写入文件中 (.txt,.html均可)

with open(./1.txt) as fh:
    fh.write(data)
           

**

网页资源的下载

**

对于网络上的一些资源(图片,文本,音频,网页本身等),可以通过urllib库下载下来

这里我们使用

:ur.urlretrieve(url,filename=filename)

url即为资源的地址,filename为保存的路径,在保存的时候,需要注意:

1.对于Windows系统,文件路径中会含有“\”,所以需要进行转义,可以在每个斜杠前再加上一个“\”,也可以直接在路径前加上“r”,如

filename=r"C:\User\TIAN\Desktop\文件名"

2.有时候对保存的路径,python会没有写入的权限,需要自己在创建时修改文件属性

添加浏览器标识

对于拥有一些反扒机制的网站,其会检查请求的User-Agent字段,如果不添加浏览器标识,就不能得到正确的网站数据

对于添加浏览器标识,我所知的方式有两种

1.使用ur.Request

url = 'http://www.baidu.com'
header = {
   'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36'
}
req = ur.Request(url, headers=header)
ur.urlopen(req)
           

2构造opener

new_opener=ur.build_opener()
header=('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96Safari/537.36')
new_opener.addheaders=[header]
           

下面可以使用new_opener.open(url)来获取数据了

如果想要使用ur.urlopen(url),还需要加上一行:

ur.install_opener(new_opener)

异常的处理

在爬取网站时,常常有很多url需要进行批量操作,如果不进行异常处理,若在某个地方发生了错误,爬虫将会崩溃,后面的全部操作将无法完成

异常主要有两种:URLError 和 HTTPError ,以及其他的一些小的错误,由于HTTPError是URLError的子类,我们只用URLError即可,同时对于其他错误,统一用Exception来代替

代码段:

try:
    data=ur.urlopen(url).read()
except (URLError,Exception) as e:
    if hasattr(e,"code") and hasattr(e,"reason"):    #针对URLError,输出状态码以及错误原因
        print(e.code,e.reason)
    else:
        print(e)   #针对Exception,由于不知道错误类型,将直接输出(当然如果不想这么细化,可以直接输出e也可以)
           

其他操作中的错误同理(大不了统一用Exception)

代理服务器的设置

爬虫都是存在风险的,在不知道对方反扒机制的情况下,直接访问可能会被封禁IP,这时我们就要用到代理服务器为我们去爬

代码段:

proxy=ur.ProxyHandler({'http':proxy_addr}) #proxy——addr即为代理服务器的IP(带端口)
new_opener=ur.build_opener(proxy,ur.HTTPHandler)  #ur.HTTPHandler为固定值
ur.install_opener(opener)  #使得urlopen自动带有proxy
data=ur.urlopen(url).read().decode('utf8')
#大家可以注意到,这里使用代理的方式与添加浏览器标识的代码如出一辙,所以在实际操作中可以一并加上
           

数据的提交与cookie的使用

如果我们想要爬取某网站登陆后界面的信息,就要把登陆的信息和cookie一并提交

url='http://accounts.douban.com/login'
#设置提交的数据,注意数据的字段名要到网页源代码中找
data={
    'form_email':'***********',
    'form_password':'***********',
    'redir':'http://www.douban.com/people/********/'     #设置提交后要登陆的页面
}
#将数据编码(因为纯字符的形式不能被服务器识别)
postdata=up.urlencode(data).encode('utf8')
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'
}
#使用ur.Request方法构造请求并加上url,postdata,headers
req=ur.Request(url,postdata,headers=header)
#使用hc.CookieJar()创建CookieJar对象
cjar=hc.CookieJar()
#使用HTTPCookieProcessor创建cookie处理器
cookie=ur.HTTPCookieProcessor(cjar)
opener=ur.build_opener(cookie)
ur.install_opener(opener)
data=ur.urlopen(req)
           

打开HTTPS的网址

ur.urlopen()不能直接打开https://的网址,因为要验证一次证书从而导致URLError,可以在开头加上

import ssl

ssl._create_default_https_context = ssl._create_unverified_context
           

总结:在构造请求时要明确几个不同的概念及他们的构造方式

1.目标网址——————>直接由url指定

2.模拟浏览器——————>通过ur.request(url,postdata,headers)中headers添加

3.post提交表单数据——————>通过ur.request(url,postdata,headers)中postdata添加,注意要用ur.urlencode().encode(“utf-8”)进行处理

4.代理设置——————>使用ur.ProxyHandler({‘http’:proxy_addr})构造并添加到ur.build_opener()

5.cookie设置——————>cjar=hc.CookieJar()———>cookie=ur.HTTPCookieProcessor(cjar)——————>opener=ur.build_opener(cookie)

最后注意构造的opener要使用ur.install_opener(opener)才能在ur.urlopen(req)中发挥作用