07爬虫之-urllib总结

# # 导入需要的爬虫库。
import urllib.request
# # 请求百度的连接。
# file = urllib.request.urlopen('http://www.baidu.com')
# # 读取返回的数据。
# data = file.read()
# # 将百度返回的数据写入到文件中去。
# with open('baidu.html','wb') as fhandle:
# print(fhandle.write(data))
# # 调用urlretrieve函数直接爬取网页,然后将网页内容写入到文件中。
# filename = urllib.request.urlretrieve('http://edu.51cto.com','51.html')
# # 清除缓存。
# urllib.request.urlcleanup()
# # 打印网页的基本信息。
# print(file.info())
# # 打印返回的状态码。200代表成功返回
# print(file.getcode())

# 一般来说,URL的标准中只会允许一部分的ASCII字符,比如数字,字母,部分符号等等。
# 而其他的一些字符,例如汉字是不符合URL标准的,所以如果我们在URL中使用一些其他不符合标准的字符就会出现问题,
# 此时需要进行URL编码进行解决。
# 如果要进行编码,我们可以使用urllib.request.quote()
# print(urllib.request.quote('http://www.sina.com.cn'))
# # 如果要进行解码,我们可以这样。
# print(urllib.request.unquote('http%3A//www.sina.com.cn'))

# header属性,有时候我们无法爬取一些网站的页面,会出现403的错误。这是网页为了防止别人恶意采集他们的信息
# 所以进行了一些反爬虫的设置。
url = 'http://blog.csdn.net/weiwei_pig/article/details/51178226'
# file = urllib.request.urlopen(url)
# print(file.getcode())
# print(file.read())

# 这时我们就需要进行伪装了,将我们的爬虫伪装成浏览器,然后在进行爬取页面,这样就不会被拦截掉了。

# 1,使用build_opener()修改报头。
# 定义一个变量来存储头部信息。
headers = ("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36")
# 创建opener对象,
# opener = urllib.request.build_opener()
# # 设置opener的头信息,
# opener.addheaders = [headers]
# data = opener.open(url).read()
# print(data)
# with open('weiwei_pig.html','wb') as fhandle:
# print(fhandle.write(data))
# 2,使用add_header()添加报头。
# 创建一个Request对象赋值给req
# req = urllib.request.Request(url)
# req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36")
# data = urllib.request.urlopen(req).read()
# print(data)

# 超时设置。
# 有时候我们访问一个网页,长时间服务器没有反应的话,就判断为超时了,我们就不能打开这个网页了。
# 所以我们需要自己设置一个超时时间。
# for i in range(1,100):
# try:
# file = urllib.request.urlopen('http://yum.iqianyue.com',timeout = 1)
# data = file.read()
# print(data)
# except Exception as e :
# print("出现异常:",str(e))
# 这段代码执行的过程中,出现异常: <urlopen error timed out>,都是这样的出现异常,
# 那是因为我们设置的超时时间太短了,我们请求服务器的操作还没有完成,就被判定为超时了。
# 我们可以设置的时间稍微长一点,例如30秒,这样就不会超时了。

# HTTP协议请求。
# 1,get:get请求通过url网址传递信息,
# 2,post:可以向服务器提交数据,是一种比较流行的,同时也比较安全的数据传递方式,我们登录的时候就是这样的。
# 3,put,请求服务器存储的一个资源的时候,通常要指定存储的位置。
# 4,delete,请求服务器删除一个资源。
# 5,head:请求获取对应的HTTP报头信息。
# 6,options,可以获得当前url所支持的请求类型。

# 1,get,我们平时请求网页的时候基本上都是get请求,例如我们想在百度上边搜索
# https://www.baidu.com/s?ie=UTF-8&wd=LPL这个就是网址,ie代表编码,wd后边的是我们的关键字。
# 我们想要搜索的信息是通过url连接的方式传递过去的。
# keywd = "LPL"
# url = 'https://www.baidu.com/s?&wd=' + keywd
# req = urllib.request.Request(url)
# data = urllib.request.urlopen(req).read()
# with open('LPL.html','wb') as fhandle:
# print(fhandle.write(data))

# z这样我们就能够通过在url中传递消息然后查到我们想要查询的数据。
# 但是我发现只能够查询英文而不能查询中文,这是因为编码的原因。
# 需要借助于前面学过的编码知识来进行解决。
# keywd = "英雄联盟"
# # 注意这里如果有时候写成https可能会出现错误的。
# url = 'http://www.baidu.com/s?ie=UTF-8&wd='
# key_code = urllib.request.quote(keywd)
# url_all = url + key_code
# print(url_all)
# req = urllib.request.Request(url_all)
# data = urllib.request.urlopen(req).read()
#
# with open('英雄联盟.html','wb') as fhandle:
# print(fhandle.write(data))

# 2,post
# import urllib.parse
# url = 'https://www.iqianyue.com/mypost'
# # 将需要提交的表单进行编码,然后在设置成utf-8编码
# postdata = urllib.parse.urlencode({
# 'name':'ceo@1234435.com',
# 'pass':'aA123456'
# }).encode('utf-8')
# req = urllib.request.Request(url,postdata)
# req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36")
# data = urllib.request.urlopen(req).read()
# print(data.decode('utf-8'))

# 我们在用爬虫请求网站的时候,别人是能够看到我们的IP地址的,如果我们的请求过多,就可能有IP被封的风险。
# 那么有什么解决办法呢,那就是通过代理的方式, 让网站看不到我们真是的IP地址。
# def use_proxy(proxy_addr,url):
# # 设置代理服务器信息
# proxy = urllib.request.ProxyHandler({'http':proxy_addr})
# # 创建全局默认的opener对象。
# opener = urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
# urllib.request.install_opener(opener)
# data = urllib.request.urlopen(url).read().decode('utf-8')
# return data
# proxy_addr = '202.75.210.45:7777'
# data = use_proxy(proxy_addr,'http://www.baidu.com')
# print(len(data))

# 异常处理
import urllib.error
try:
# 爬取csdn博客
file = urllib.request.urlopen('http://blog.csdn.net')
print(file.read().decode('utf-8'))
except urllib.error.URLError as e:
print(e.code)
print(e.reason)
原文地址:https://www.cnblogs.com/cong12586/p/14063239.html