【python爬虫专题】解析方法 <1> Urllib库方法总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hiha_hero2333/article/details/79150848

什么是Urllib: 一个python内置的HTTP请求库

主要包含四个模块:

urllib.request    请求模块: 用这个模块模拟发送页面请求
urllib.error    异常处理模块: 保证程序不会由于运行出错而意外终止
urllib.parse    url解析模块: 作为页面处理的工具模块使用
urllib.robotparser robots.txt解析模块,用于解析网站的robots文件


urlopen

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

主要运用前三个参数,url,data(设置post请求的一些数据),timeout

Request

  在发送一些较为复杂的request请求的时候,比方说在request里面加上设置了的headers的时候,可以使用Request方法。
  #注意:我们用这个方法设置的是Request请求,应配合urlopen方法使用Request方法设置好的request,返回的即response
  例如:
 

# request 的设置
from urllib import request, parse

url = 'http://httpbin.org/post'
headers = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
    "Host":"httpbin.org"
}
dict = {'name':"自定义"}
data = bytes(parse.urlencode(dict),encoding='utf-8')
req = request.Request(url=url,headers=headers,method='POST',data=data)
response = request.urlopen(req)
print(response.read().decode("utf-8"))

Handler

  在python的官方文档中,关于Handler的介绍有很多种,这里作为我入门的第一个学习的handler,主要是代理Handler(proxy-handler)
  使用代理,可以更换我们请求资源使用的IP,这样在违规操作的时候万一被ban了,也可以通过更换IP继续运行,不过最好不要这样干,将心比心,经营网站的人也不容易(→_→)
  使用代理的方法比较简单,记下这个套路:
  

import urllib.request

url = "http://www.baidu.com"
proxy_handler = urllib.request.ProxyHandler({
        "http":'http://127.45.97.1:9743',
        "https":'http://127.45.97.1:9743'}) #注意这个方法传入的是字典格式
opener = urllib.request.build_opener(proxy_handler)
response = opener.open(url)
print(response.read())

cookie(存储在用户本地终端上的数据)

  Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息
  在页面中,最常见的cookies就是登录信息,我们在制作爬虫的时候可以利用cookies来保持登录信息,以避免某些网站要求的登录验证等。同理,如果自行删除掉cookies,我们的登录状态就会自动被退出。
  
下面用一段小代码做个示范

# about cookies
import http.cookiejar, urllib.request

cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie) #this is also a handler
opener = urllib.request.build_opener(handler)
response = opener.open("http://www.baidu.com")
for item in cookie:
    print(item.name + " = " + item.value)

我们也可以把cookies保存为txt文件,不过使用的方法不同:
上述代码中,cookies应该这样声明:
cookie = http.cookiejar.MozillaCookieJar(filename)
在最后应该调用cookie.save方法保存此文件。

同样的,cookie也存在其他的格式,比方说最常见的LWP format,示例代码如下:

# cookie can also save in a 'LWP' format
import http.cookiejar,urllib.request

#保存cookies到本地
filename = 'cookies.txt'
cookie = http.cookiejar.LWPCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open("http://www.baidu.com")
cookie.save(ignore_discard=True,ignore_expires=True)

#加载cookies
cookie.load("cookies.txt",ignore_discard=True,ignore_expires=True)
print(response.read().decode('utf-8'))

这样,在访问某些只能登录才能访问的页面时,就没有问题了

异常处理

打开python3 的官方文档,我们查询urllib.error的相关文档,可以发现由urllib.request产生的error一共有三类:
URLError 、 HTTPError 和 ContentTooShortError,使用异常的方法属于python基础内容,不过多介绍。

from urllib import request,error

url = '######'
try:
    response = request.urlopen(url)
except error.HTTPError as e:
    print(e.reason,e.code,e.headers,sep='\n')
except error.URLError as e:
    print(e.reason)
else:
    print("request successfully!")

url解析

urlparse

urllib.parse.urlparse(urlstring, scheme=”, allow_fragments=True)
  url解析,顾名思义就是把url分解,分析为不同的几个片段。输入的urlstring没有协议类型的时候,我们可以在函数中指定默认的协议scheme。
  allow_fragments=True 这个参数如果改为False,那么urlstring中属于fragment的部分就不会单独分出来,会I懂得拼接给path,query等前面的部分。
  

urlunparse

相当于urlparse的反函数,输入一个包含url各组成部分为内容的list,可以把他们组成一个完整的urlstring

urlencode

把一个字典对象转换成一个get请求参数。get请求参数都是 “url?” + “参数1” & “参数2”……,我们可以用一个url 和一个包含参数的字典做拼接,最后得到一个完整的get请求
示例:

from urllib.parse import urlencode

params = {
        'name' : 'vincent',
        'age' : '19',
        'occupation' : 'student'
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)

运行结果:

http://www.baidu.com?name=vincent&age=19&occupation=student

以上的方法用得比较多,注意常常复习!

猜你喜欢

转载自blog.csdn.net/hiha_hero2333/article/details/79150848
今日推荐