Python3网络爬虫(一):利用urllib进行简单的网页抓取

原做者及原文连接: Jack-Cui,blog.csdn.net/c406495762/…html

运行平台:Windows Python版本:Python3.x IDE:Sublime text3python

一直想学习Python爬虫的知识,在网上搜索了一下,大部分都是基于Python2.x的。所以打算写一个Python3.x的爬虫笔记,以便后续回顾,欢迎一块儿交流、共同进步。小程序

1、预备知识

1.Python3.x基础知识学习:

2.开发环境搭建:

2、网络爬虫的定义

网络爬虫,也叫网络蜘蛛(Web Spider),若是把互联网比喻成一个蜘蛛网,Spider就是一只在网上爬来爬去的蜘蛛。网络爬虫就是根据网页的地址来寻找网页的,也就是URL。举一个简单的例子,咱们在浏览器的地址栏中输入的字符串就是URL,例如:www.baidu.com/。浏览器

URL就是赞成资源定位符(Uniform Resource Locator),它的通常格式以下(带方括号[]的为可选项):bash

protocol :// hostname[:port] / path / [;parameters][?query]#fragment服务器

URL的格式由三部分组成:网络

(1)protocol:第一部分就是协议,例如百度使用的就是https协议;ide

(2)hostname[:port]:第二部分就是主机名(还有端口号为可选参数),通常网站默认的端口号为80,例如百度的主机名就是www.baidu.com,这个就是服务器的地址;函数

(3)path:第三部分就是主机资源的具体地址,如目录和文件名等。学习

网络爬虫就是根据这个URL来获取网页信息的。

3、简单爬虫实例

在Python3.x中,咱们可使用urlib这个组件抓取网页,urllib是一个URL处理包,这个包中集合了一些处理URL的模块,以下:

  1. urllib.request模块是用来打开和读取URLs的;

  2. urllib.error模块包含一些有urllib.request产生的错误,可使用try进行捕捉处理;

  3. urllib.parse模块包含了一些解析URLs的方法;

  4. urllib.robotparser模块用来解析robots.txt文本文件.它提供了一个单独的RobotFileParser类,经过该类提供的can_fetch()方法测试爬虫是否能够下载一个页面。

咱们使用urllib.request.urlopen()这个接口函数就能够很轻松的打开一个网站,读取并打印信息。

urlopen有一些可选参数,具体信息能够查阅Python自带的documentation。

了解到这些,咱们就能够写一个最简单的程序,文件名为urllib_test01.py,感觉一个urllib库的魅力:

# -*- coding: UTF-8 -*-
from urllib import request

if __name__ == "__main__":
    response = request.urlopen("http://fanyi.baidu.com")
    html = response.read()
    print(html)
复制代码

urllib使用使用request.urlopen()打开和读取URLs信息,返回的对象response如同一个文本对象,咱们能够调用read(),进行读取。再经过print(),将读到的信息打印出来。

运行程序ctrl+b,能够在Sublime中查看运行结果,以下:

也能够在cmd(控制台)中输入指令:

python urllib_test01.py
复制代码

运行py文件,输出信息是同样的,以下:

其实这就是浏览器接收到的信息,只不过咱们在使用浏览器的时候,浏览器已经将这些信息转化成了界面信息供咱们浏览。固然这些代码咱们也能够从浏览器中查看到。例如,使用谷歌浏览器,在任意界面单击右键选择检查,也就是审查元素(不是全部页面均可以审查元素的,例如起点中文网付费章节就不行.),以百度界面为例,截图以下:

能够看到,右边就是咱们的审查结果。咱们能够在本地,也就是浏览器(客户端)更改元素,可是这个不会上传到服务器端。例如我能够修改本身的支付宝余额装一装,好比这样:

我实际有这些钱吗?显然苦逼的我,是不会有这些钱的,我只不过是修改了下审查元素的信息而已。

有些跑偏,不过说的道理就是,浏览器就是做为客户端从服务器端获取信息,而后将信息解析,再展现给咱们的。

回归正题,虽然咱们已经成功获取了信息,可是显然他们都是二进制的乱码,看起来很不方便。咱们怎么办呢?

咱们能够经过简单的decode()命令将网页的信息进行解码,并显示出来,咱们新建立一个文件,命名为urllib_test02.py,编写以下代码(仍是以百度翻译网站fanyi.baidu.com为例):

# -*- coding: UTF-8 -*-
from urllib import request

if __name__ == "__main__":
    response = request.urlopen("http://www.fanyi.baidu.com/")
    html = response.read()
    html = html.decode("utf-8")
    print(html)
复制代码

这样咱们就能够获得这样的结果,显然解码后的信息看起来工整和舒服多了:

固然这个前提是咱们已经知道了这个网页是使用utf-8编码的,怎么查看网页的编码方式呢?须要人为操做,且很是简单的方法是使用使用浏览器审查元素,只须要找到head标签开始位置的chareset,就知道网页是采用何种编码的了。以下:

这样咱们就知道了这个网站的编码方式,可是这须要咱们每次都打开浏览器,并找下编码方式,显然有些费事,使用几行代码解决更加省事而且显得酷一些。

4、自动获取网页编码方式的方法

获取网页编码的方式有不少,我的更喜欢用第三方库的方式。

首先咱们须要安装第三方库chardet,它是用来判断编码的模块,安装方法以下图所示,只须要输入指令:

pip install chardet
复制代码

安装好后,咱们就可使用chardet.detect()方法,判断网页的编码方式了。至此,咱们就能够编写一个小程序判断网页的编码方式了,新建文件名为chardet_test01.py:

# -*- coding: UTF-8 -*-
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)
复制代码

运行程序,查看输出结果以下:

瞧,返回的是一个字典,这样咱们就知道网页的编码方式了,经过得到的信息,采用不一样的解码方式便可。

PS:关于编码方式的内容,能够自行百度


相关文章和视频推荐

圆方圆学院聚集 Python + AI 名师,打造精品的 Python + AI 技术课程。 在各大平台都长期有优质免费公开课,欢迎报名收看。 公开课地址: ke.qq.com/course/3627…

加入python学习讨论群 78486745 ,获取资料,和广大群友一块儿学习。

圆方圆python技术讨论群
圆方圆python技术讨论群
相关文章
相关标签/搜索