运行平台:Winodows 10
Python版本:Python 3.4.2
IDE:Sublime text3
网络爬虫
网络爬虫,也叫网络蜘蛛(Web Spider),如果把互联网比喻成一个蜘蛛网,Spider就是一只在网上爬来爬去的蜘蛛。网络爬虫就是根据网页的地址来寻找网页的,也就是URL。举一个简单的例子,我们在浏览器的地址栏中输入的字符串就是URL,例如:https://www.baidu.com/
URL就是统一资源定位符(Uniform Resource Locator),遵守以下语法规则:
scheme://host.domain:port/path/filename
解释:
scheme - 定义因特网服务的类型。最常见的类型是 http
host - 定义域主机(http 的默认主机是 www)
domain - 定义因特网域名,比如 baidu.com
:port - 定义主机上的端口号(http 的默认端口号是 80)
path - 定义服务器上的路径(如果省略,则文档必须位于网站的根目录中)。
filename - 定义文档/资源的名称
第一个爬虫
爬虫例子
#-*- coding:utf-8 -*-
"""
Author :OLIVER
Date :2018-03-22
Describe:简单爬虫
"""
from urllib import request
if __name__=="__main__":
response = request.urlopen("http://www.163.com/")
html = response.read()
print(html)
urllib使用使用request.urlopen()打开和读取URLs信息,返回的对象response如同一个文本对象,我们可以调用read(),进行读取。再通过print(),将读到的信息打印出来。
运行程序ctrl+B,可以在Sublime中查看运行结果,如下:
这些信息就是浏览器接受到的信息,只不过我们在看浏览器内容的时候,浏览器对这些内容进行了转换,让我们看着更舒服
或许你从上面可以看出,虽然我们已经成功获取了信息,但是这些信息都是二进制的,看起来很不方便,那么我们如何处理呢?
我们可以通过decode()命令将网页的信息进行解码,并显示出来
首先,我们查看网页的源码,查看原本网页编码格式
我们看到是GBK,那接下来我们开始转码
转码后,我们看到得到的结果跟我们查看源码的结果是一致的
自动获取编码格式
获取有人觉得上述获取编码格式的方法太麻烦了,那么如何自动获取编码格式呢?
使用chardet类库即可
也可以直接在DOS窗口输入命令在线安装
自动获取编码格式代码示例
from urllib import request
import chardet
if __name__=="__main__":
response = request.urlopen("http://www.163.com/")
html = response.read()
charset = chardet.detect(html)
print(charset)
运行程序,输结果:
同时呢,加入我们现在有很多网页,那么我们不可能一一去看,我们在这就可以想到把这个第三方库封装为一个函数,然后遍历多个网页即可
下面是我封装遍历的一个例子:
#-*- coding:UTF-8 -*-
from urllib importrequestimportchardetdefauto_GetCharset(url):
response=request.urlopen(url)
html=response.read()
charset=chardet.detect(html)
value= charset['encoding']returnvalue"""定义一个列表,然后依次查看列表元素的编码格式"""Web_list= ["http://www.baidu.com/","http://www.163.com/","https://www.jd.com/","https://www.youku.com/"]for url inWeb_list:
charset=auto_GetCharset(url)print(url,charset)
运行结果
盲点
程序中我新增了__name__=="__main__"这段代码
解释:
__name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行
例如:
我们现在有文件const.py
另外还存在一个计算和sm.py的文件
现在他导入模块const,并且也运行了const中的print语句了,我们在const中添加__name__=="__main__"
再次运行sm.py
已经不打印了