数据之路 - Python爬虫 - urllib库

Posted iceredtea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据之路 - Python爬虫 - urllib库相关的知识,希望对你有一定的参考价值。

参考学习:https://www.cnblogs.com/alex3714/articles/8359358.html

一、urllib库介绍

urllib库,它是Python内置的HTTP请求库。它包含4个模块:

  • request:    HTTP请求模块,    可以用来模拟发送请求。

  • error:      异常处理模块,      如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作以保证程序不会意外终止。

  • parse:      url解析模块,       一个工具模块,提供了许多URL处理方法,比如拆分、解析、合并等。

  • robotparser:robots解析模块,    主要是用来识别网站的robots.txt文件,然后判断哪些网站可以爬,哪些网站不可以爬,它其实用得比较少。

二、request模块

request模块主要功能:构造HTTP请求,利用它可以模拟浏览器的一个请求发起过程,

request模块同时还有:处理授权验证(authenticaton)、重定向(redirection)、浏览器Cookies以及其他内容。

1.urlopen方法

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

urlopen参数介绍:

  • url用于请求URL

  • data:GET请求不传,POST请求传

  • timeout设置超时时间,单位为秒,意思就是如果请求超出了设置的这个时间,还没有得到响应,就会抛出异常。如果不指定该参数,就会使用全局默认时间。它支持HTTP、HTTPS、FTP请求。

  • context必须是ssl.SSLContext类型,用来指定SSL设置。

  • cafile指定CA证书

  • capath指定CA证书的路径,这个在请求HTTPS链接时会有用。

import urllib.parse
import urllib.request

data = bytes(urllib.parse.urlencode(word: hello), encoding=utf8)
print(data)
response = urllib.request.urlopen(http://httpbin.org/post, data=data)
print(response.read())

2.Request方法

class urllib.request.Request(url, data=None, headers=, origin_req_host=None, unverifiable=False, method=None)

Request参数介绍

  • url用于请求URL,这是必传参数,其他都是可选参数。

  • data如果要传,必须传bytes(字节流)类型的。如果它是字典,可以先用urllib.parse模块里的urlencode()编码。

  • headers是一个字典,它就是请求头,我们可以在构造请求时通过headers参数直接构造,也可以通过调用请求实例的add_header()方法添加。添加请求头最常用的用法就是通过修改User-Agent来伪装浏览器

  • origin_req_host指的是请求方的host名称或者IP地址。

  • unverifiable表示这个请求是否是无法验证的,默认是False,意思就是说用户没有足够权限来选择接收这个请求的结果。例如,我们请求一个html文档中的图片,但是我们没有自动抓取图像的权限,这时unverifiable的值就是True`。

  • method是一个字符串,用来指示请求使用的方法,比如GET、POST和PUT等。


有很多网站为了防止程序爬虫爬网站造成网站瘫痪,会需要携带一些headers头部信息才能访问。

headers添加的两种方法如下:

方法1:

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: alex

data = bytes(parse.urlencode(dict), encoding=utf8)
req = request.Request(url=url, data=data, headers=headers, method=POST)
response = request.urlopen(req)
print(response.read().decode(utf-8))

方法2:

from urllib import request, parse

url = http://httpbin.org/post
dict = 
    name: Germey

data = bytes(parse.urlencode(dict), encoding=utf8)
req = request.Request(url=url, data=data, method=POST)
req.add_header(User-Agent, Mozilla/4.0 (compatible; MSIE 5.5; Windows NT))
response = request.urlopen(req)
print(response.read().decode(utf-8))

- Handler处理器

urllib.request模块里的BaseHandler类,它是所有其他Handler的父类。

常见Handler介绍:

  • HTTPDefaultErrorHandler:用于处理HTTP响应错误,错误都会抛出HTTPError类型的异常。

  • HTTPRedirectHandler:用于处理重定向。

  • HTTPCookieProcessor:用于处理Cookies。

  • ProxyHandler:用于设置代理,默认代理为空。

  • HTTPPasswordMgr:用于管理密码,它维护了用户名和密码的表。

  • HTTPBasicAuthHandler:用于管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题。

3.代理ProxyHandler

Proxyhandler参数是一个字典,键名是协议类型(比如HTTP或者HTTPS等),键值是代理链接,可以添加多个代理。

然后,利用这个Handler及build_opener()方法构造一个Opener,之后发送请求即可。

from urllib.error import URLError
from urllib.request import ProxyHandler, build_opener
 
proxy_handler = ProxyHandler(
    ‘http‘: ‘http://127.0.0.1:9743‘,
    ‘https‘: ‘https://127.0.0.1:9743‘
)
opener = build_opener(proxy_handler)
try:
    response = opener.open(‘https://www.baidu.com‘)
    print(response.read().decode(‘utf-8‘))
except URLError as e:
    print(e.reason)

3.cookies

cookie中保存中我们常见的登录信息,有时候爬取网站需要携带cookie信息访问,这里用到了http.cookijar,用于获取cookie以及存储cookie

# 从网页获取cookie,并逐行输出
import http.cookiejar, urllib.request
 
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open(‘http://www.baidu.com‘)
for item in cookie:
    print(item.name+"="+item.value)

# 从网页获取cookie,保存为文件格式
filename = ‘cookies.txt‘
cookie = http.cookiejar.MozillaCookieJar(filename)  # 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)

PS:MozillaCookieJar是CookieJar的子类,LWPCookieJar与MozillaCookieJar均可读取、保存cookie,但格式不同

调用load()方法来读取本地的Cookies文件,获取到了Cookies的内容

cookie = http.cookiejar.LWPCookieJar()
cookie.load(‘cookies.txt‘, ignore_discard=True, ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open(‘http://www.baidu.com‘)
print(response.read().decode(‘utf-8‘))

三、error模块

from urllib import request, error
try:
    response = request.urlopen(‘http://cuiqingcai.com/index.htm‘)
except error.URLError as e:
    print(e.reason)

四、parse模块

urlparse()
urlunparse()
urlsplit()
urlunsplit()
urljoin()
urlencode()
parse_qs()
parse_qsl()
quote()
unquote()

五、robotparser模块

Robots协议也称作爬虫协议、机器人协议,它的全名叫作网络爬虫排除标准(Robots Exclusion Protocol),用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取。它通常是一个叫作robots.txt的文本文件,

一般放在网站的根目录下。www.taobao.com/robots.txt

robotparser模块提供了一个类RobotFileParser,它可以根据某网站的robots.txt文件来判断一个爬取爬虫是否有权限来爬取这个网页。

urllib.robotparser.RobotFileParser(url=‘‘)

# set_url():用来设置robots.txt文件的链接。
# read():读取robots.txt文件并进行分析。
# parse():用来解析robots.txt文件。
# can_fetch():该方法传入两个参数,第一个是User-agent,第二个是要抓取的URL。
# mtime():返回的是上次抓取和分析robots.txt的时间。
# modified():将当前时间设置为上次抓取和分析robots.txt的时间。
from urllib.robotparser import RobotFileParser
 
rp = RobotFileParser()
rp.set_url(‘http://www.jianshu.com/robots.txt‘)
rp.read()
print(rp.can_fetch(‘*‘, ‘http://www.jianshu.com/p/b67554025d7d‘))
print(rp.can_fetch(‘*‘, "http://www.jianshu.com/search?q=python&page=1&type=collections"))

以上是关于数据之路 - Python爬虫 - urllib库的主要内容,如果未能解决你的问题,请参考以下文章

Python之路第十九篇:爬虫

Python之路第十九篇:爬虫

一个咸鱼的Python爬虫之路:requests库

Python爬虫--Urllib库

python爬虫目录

爬虫基础之urllib库