1 Urllib库
Urllib是Python提供的是一个用于操作URL的模块,包括如下模块:
urllib.request | 请求模块 |
---|---|
urllib.error | 异常处理模块 |
urllib.parse url | 解析模块 |
urllib.robotparser robots.txt | 解析模块 |
2 浏览器的模拟
2.1 header设置
有时候爬虫爬取网页时,会出现403错误,因为网页为了防止别人恶意采集信心有一些反爬虫设置。这里就通过设置Header信息来模拟浏览器访问这里网站。
下面是两种方法修改报头:
(1)使用build_opener()修改报头
第一步:创建opener对象
opener = urllib.request.build_opener()
第二步:设置对应的头信息
opener对象名.addheaders=[头信息]
第三步:模拟浏览器打开
opener对象名.open(url地址)
例如下面:
import urllib.request
url = "https://blog.csdn.net/qq_42711815"
# 创建opener对象
opener = urllib.request.build_opener()
# 设置对应的头信息,格式:opener.addheaders = [头信息]
opener.addheaders = [headers]
# 此时打开
data = opener.open(url).read()
(2)使用add_header添加报头
第一步:创建一个Request对象,并赋给变脸req
req = urllib.request.Request(url)
第二步:使用add_header()方法添加对应的报头文件信息
req.add_header(字段名,字段值)
第三步:使用urlopen()打开该Request对象即可打开对应网址
data = urllib.request.urlopen(req).read()
如下图:
import urllib.request
url = "https://blog.csdn.net/qq_42711815"
req = urllib.request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36')
data = urllib.request.urlopen(req).read()
2.2 超时处理
有时访问一个网页长时间没有响应,那么系统就会判断网页超时,也就是说无法打开网页。有些网站就可以根据你访问一个网站所用时间来判断你是不是一个爬虫。
这里是在urlopen打开网址的时候,通过timeout字段设置。格式为:
urllib.request.urlopen(打开的网址,timeout=时间值)
2.3 两种常见的HTTP协议请求
(1)GET请求:通过URL网址传递信息
(2)POST请求:向服务器提交数据
一般来说,如果涉及到登录时,都会是POST请求
2.4 URL编码
URL标准中只会允许部分的ASCII字符,比如数字,部分符号等,而一些其他的字符,比如汉子,就是URL标准,此时需要URL编码解决。
编码:urllib.request.quote()
解码:urllib.request.unquote()
如下图:
在这里插入代码片
import urllib.request
url = “http://www.baidu.com”
req = urllib.request.quote(url)
print(req)
req = urllib.request.unquote(req)
print(req)
http%3A//www.baidu.com
http://www.baidu.com
2.5代理服务器设置
有时使用一个IP去爬取同一个网站上的网页,可能有时就会被网站服务器屏蔽,所有这里就有了代理服务器,也就是爬取网站时,使用别人的IP地址。
使用步骤:
第一步:使用urllib.request.ProxyHander({‘http’:代理服务器地址})来设置对应的代理服务器信息
第二步:使用urllib.request.build_opener()创建一个opener对象,第一个参数为代理信息,第二个参数为urllib.request.HTTPHandler类
第三步:使用urllib.request.install_opener()创建全局默认的opener对象
例如:
def use_proxy(proxy_addr,url):
import urllib.request
proxy = urllib.request.ProxyHandler({"http":proxy_addr})
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 = "123.133.41.104:53281"
data = use_proxy(proxy_addr,"http://www.baidu.com")
print(len(data))
输出结果:
D:\Python\python.exe C:/Users/19248/Desktop/pro/python/11/1/5.py
153017
Process finished with exit code 0
可以在运行的过程会出现10060错误,这里多试几个ip代理
2.6 异常处理
程序在执行的过程中,难免发生异常,在python爬虫中,有关URL相关的异常-URLError类,使用这个类需要先导入urllib.error模块,经常与try…except配合使用,这里主要说两个类,一个是URLError类,一个是URLError类的一个子类-HTTPError类
产生URLError类的原因可能原因如下:
1)连接不上服务器
2)远程URL不存在
3)无网络
4)触发HTTPError
在用HTTPError时,可以输出状态码,下面是常见的状态码及含义:
HTTPError子类无法处理刚才所提到的产生URLError的前3中原因的异常,即连接不上服务器、远程URL不存在、无网络引起的异常。
有时为了显示状态码,使用子类HTTPError,但是如果遇到连接不上服务器、远程URL不存在、无网络引起的异常,这三种情况,子类HTTPError,就出现错误了,这里可以这样做通过两个except,先使用子类,如果子类没有就使用父类,如下所示:
import urllib.request
import urllib.error
try:
urllib.request.urlopen("http://blog.csdn.net/")
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)