运行环境Python3.6.4

一、代理服务器的设置

有时使用同一个IP去爬取同一个网站的内容,久了之后会被该网站服务器屏蔽,这时就要用到代理服务器
推荐一个代理服务器的网址:http://yum.iqianyue.com/proxy

# 代理服务器的设置,使用代理服务器来爬取网站的内容
#好像并不是爬取的百度首页,还需要进一步探究
import urllib.request
#定义一个名为use_proxy的函数,这个函数主要功能是使用代理服务器来爬取某个网页,第一个形参为代理服务器地址,第二个形参为要爬取网页的地址
def use_proxy(proxy_addr,url):
    import urllib.request
    #设置代理服务器信息,格式:urllib.request.ProxyHandler({'http':代理服务器地址})
    proxy = urllib.request.ProxyHandler({'http':proxy_addr})
    #创建一个自定义的opener对象,第一个参数为代理信息,第二个参数为urllib.request.HTTPHandler类
    opener = urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
    #为了方便,使用urllib.request.install_opener()创建全局默认的opener对象,所以下面使用urllib.request.urlopen()也会使用安装好的opener对象
    urllib.request.install_opener(opener)
    data = urllib.request.urlopen(url).read().decode('utf-8')#打开、爬取、读取和编码网页后赋值给data变量
    return data #返回data值给函数
proxy_addr = "61.135.217.7:80"#格式为:网址:端口号
data = use_proxy(proxy_addr,"http://www.baidu.com")
print(len(data))

二、DebugLog实战

解决问题:边运行程序,边打印调试日志

# DebugLog实战,开启DebugLog,边执行程序,边打印调试的Log日志
import urllib.request
#分别将http和https的debuglevel设置为1
httphd = urllib.request.HTTPHandler(debuglevel = 1)
httpshd = urllib.request.HTTPSHandler(debuglevel = 1)
#创建自定义对象opener,并使用httphd,httpshd作为参数
opener = urllib.request.build_opener(httphd,httpshd)
#创建全局默认的opener对象
urllib.request.install_opener(opener)
url = "" #将要爬取的网址赋值给变量url
req = urllib.request.Request(url)#创建一个Request对象并赋值给req变量,格式为:urllib.request.Request(url地址)
req.add_header("User-Agent","Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36")#使用add_header()函数添加对应的User-Agent信息,格式为:Request对象名.add_header(字段名,字段值)
data = urllib.request.urlopen(req).read()#模仿为浏览器去打开、爬取网址并读取赋值给变量data.此时是具有头信息的打开操作
fhandle = open("D:/Python35/myweb/part4/9.html","wb") #用 "wb"二进制的方式用open()函数打开该文件,并赋值给fhandle变量
fhandle.write(data) #用write()函数将data的数据写入变量fhandle
fhandle.close() #用close()函数关闭该文件

三、异常处理器——URLError实战

合理处理异常
我们经常使用try…except进行异常处理,在try中执行主要代码,在except中捕获异常信息,并进行相应的异常处理

import urllib.request
import urllib.error
try:
    urllib.request.urlopen("http://www.epA.com")
except urllib.error.URLError as e:
    if hasattr(e,"code"): #引入hasattr()函数来判断是否有e.code或者e.reason
        print(e.code)
    if hasattr(e,"reason"):
        print(e.reason)