1,网络爬虫的定义
网络爬虫就是根据网页的地址来寻找网页的,也就是URL。
URL就是同意资源定位符(Uniform Resource Locator),它的一般格式如下(带方括号[]的为可选项):
protocol:// hostname[:port] / path / [;parameters][?query]#fragment
URL的格式由三部分组成:
(1)protocol:第一部分就是协议,例如百度使用的就是https协议;
(2)hostname[:port]:第二部分就是主机名(还有端口号为可选参数),一般网站默认的端口号为80,例如百度使用www.baidu.com,这个就是服务器的地址;
(3)path:第三部分就是主机资源的具体地址,如目录和文件名等。
2,Urllib库介绍
Urllib 库,它是 Python 内置的 HTTP 请求库。它包含四个模块:
<1>request,它是最基本的 HTTP 请求模块,我们可以用它来模拟发送请求,就像在浏览器里输入网址然后敲击回车一样,只需要给库方法传入 URL 还有额外的参数,就可以模拟实现这个过程了。
<2>error 模块即异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作保证程序不会意外终止。
<3>parse 模块是一个工具模块,提供了许多 URL 处理方法,比如拆分、解析、合并等等的方法。
<4>robotparser模块用来解析robots.txt文本文件.它提供了一个单独的RobotFileParser类,通过该类提供的can_fetch()方法测试爬虫是否可以下载一个页面。
3,实例
实例1:使用request.urlopen()接口函数
from urllib import request
if __name__ == "__main__":
response = request.urlopen("http://fanyi.baidu.com")
html = response.read()
print(html)
#urllib使用urlopen()函数打开和读取urls信息,返回的对象response如同一个文本对象,
#我们可以调用read()进行读取,再通过print打印出来
打印出来的信息其实就是浏览器接收到的信息,只不过我们在使用浏览器的时候,浏览器已经将这些信息转化成了界面信息供我们浏览。
问题:虽然我们已经成功获取了信息,但是显然他们都是二进制的乱码,看起来很不方便
我们可以通过简单的decode()命令将网页的信息进行解码,并显示出来。
from urllib import request
if __name__ == "__main__":
response = request.urlopen("http://fanyi.baidu.com")
html = response.read()
html=html.decode("utf-8")
print(html)
当然这个前提是我们已经知道了这个网页是使用utf-8编码的。可以使用使用浏览器审查元素,只需要找到head标签开始位置的chareset,就知道网页是采用何种编码的,但是这需要我们每次都打开浏览器,并找下编码方式,显然有些费事
实例二:自动获取网页编码方式
可以安装第三方库chardet,它是用来判断编码的模块
pip install chardet
安装好后,我们就可以使用chardet.detect()方法,判断网页的编码方式了
from urllib import request
import chardet
if __name__ == "__main__":
response = request.urlopen("http://fanyi.baidu.com")
html = response.read()
charset = chardet.detect(html)
print(charset)
#获取到一个字典{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
print(charset['encoding'])
#utf-8