3年前,我在 csdn 写过 Python3 网络爬虫系列教程,经过三年的积累,累计阅读量近 90W。
同时,我也在 Github 开源了所有 Python3 网络爬虫代码,累积获得 10.3k+ 的 star,4.1k+ 的 fork。
可以说,这个系列教程算是比较成功的,在全国的开源网络爬虫教程项目中,也是排在前几名的。
但是,由于时间太长了,陆陆续续,很多实战示例也早已失效。
网络爬虫,是一门比较通用的基础技术,各个领域都会有所涉及,比如我做视觉算法的,也需要用到网络爬虫,例如调用 API 接口清洗数据等,这本质也都是一个小的爬虫程序。
为了提供各位更好的学习示例,我决定重写这一系列教程,对一些失效的示例,重新找例子,并查缺补漏,完善这一些列教程。
2020年,最新版的 Python3 网络爬虫实战系列教程,我会首发在CSDN、公众号和个人网站上。
公众号:
个人网站:https://cuijiahua.com/
下面进入正题,回到3年前最初的起点,开启 Python3 网路爬虫实战的第一篇:初识网络爬虫。
网络爬虫,也叫网络蜘蛛(Web Spider)。它根据网页地址(URL)爬取网页内容,而网页地址(URL)就是我们在浏览器中输入的网站链接。
例如:https://www.baidu.com
URL 专业一些的叫法是统一资源定位符(Uniform Resource Locator),它的一般格式如下(带方括号[]的为可选项):
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
URL 的格式主要由前个三部分组成:
网络爬虫就是根据这个 URL 来获取网页信息的。
还是,以百度为例,举个简单的例子:
http://www.baidu.com:80
https://www.baidu.com:443
这两个 URL 都可以打开网页,区别在于一个是 http 协议,一个是 https 协议。
http 协议默认使用的端口是 80,https 协议默认使用的端口是 443。
每一个 URL 的背后,其实都是对应着一台服务器的,甚至成千上万台。
通俗一点讲,URL 就是每个服务器的地址。例如,老王家住在北京市朝阳区,老李家住在北京市海淀区。
你想串门溜达去,就得通过这个 URL 家庭地址,找到他们。
如果有一天,你想去老王家,跟他老婆聊聊天,你仅仅知道老王家住在北京市朝阳区是不够的。
因为,你还得知道他家在哪个楼,几单元,几零几。
对应 ULR 上,也就是你光知道 hostname 不够,你还得有个更详细的地址,那就得补充 path:
https://cuijiahua.com/blog/spider/
比如,cuijiahua.com 是我的 hostname,想找到爬虫系列的文章,还得去 blog 目录下的 spider 目录下找,这个就是具体的地址 path。
老王家的详细家庭住址知道了,如果你还想夜晚去,并且趁着老王不在,与老王的老婆聊聊天。
那这个情况就有点复杂了。不仅需要知道 protocol 、hostname 和 path,你还得满足一些条件,这个条件就是 [;parameters][?query]#fragment,这些东西。
比如,为了完成此次夜探老王家的目标,你可能大概需要这样的 URL:
https://chaoyanglaowang.com/2haolou/3danyuan/702/s?laowangzaiji=0&baitian=0
这个 URL 的意思就是,baitian=0表明是晚上,laowangzaiji=0表示老王不在家,在满足这个条件的时候,你进了2号楼3单元702的朝阳区老王家,就可以夜探老王家了。
?laowangzaiji=0&baitian=0,这是一种询问,在这个条件下访问。
够通俗易懂了吧!
在讲解爬虫内容之前,我们需要先学习一项写爬虫的必备技能:审查元素。
在浏览器的地址栏输入 URL 地址,在网页处右键单击,找到检查。(不同浏览器的叫法不同,Chrome 浏览器叫做检查,Firefox 浏览器叫做查看元素,但是功能都是相同的)
我们可以看到,右侧出现了一大推代码,这些代码就叫做 HTML 。什么是 HTML ?举个容易理解的例子:我们的基因决定了我们的原始容貌,服务器返回的 HTML 决定了网站的原始容貌。
为啥说是原始容貌呢?因为人可以整容啊!扎心了,有木有?那网站也可以"整容"吗?可以!请看下图:
我能有这么多钱吗?显然不可能。我是怎么给网站"整容"的呢?就是通过修改服务器返回的 HTML 信息。我们每个人都是"整容大师",可以修改页面信息。我们在页面的哪个位置点击审查元素,浏览器就会为我们定位到相应的 HTML 位置,进而就可以在本地更改 HTML 信息。
再举个小例子:我们都知道,使用浏览器"记住密码"的功能,密码会变成一堆小黑点,是不可见的。可以让密码显示出来吗?可以,只需给页面"动个小手术"!以淘宝为例,在输入密码框处右键,点击检查。
可以看到,浏览器为我们自动定位到了相应的 HTML 位置。将下图中的 password 属性值改为 text属性值(直接在右侧代码处修改):
我们让浏览器记住的密码就这样显现出来了:
说这么多,什么意思呢?浏览器就是作为客户端从服务器端获取信息,然后将信息解析,并展示给我们的。我们可以在本地修改 HTML 信息,为网页"整容",但是我们修改的信息不会回传到服务器,服务器存储的 HTML 信息不会改变。刷新一下界面,页面还会回到原本的样子。这就跟人整容一样,我们能改变一些表面的东西,但是不能改变我们的基因。
网络爬虫的第一步就是根据 URL ,获取网页的 HTML 信息。在 Python3 中,可以使用 urllib.request 和 requests 进行网页爬取。
requests 库强大好用,后续文章的实例,也都是以此为基础进行讲解。requests 库的 github 地址:
https://github.com/requests/requests
在 cmd 中,使用如下指令安装 requests :
pip install requests
或者:
easy_install requests
requests 库的基础方法如下:
官方中文教程地址:点击查看
requests 库的开发者为我们提供了详细的中文教程,查询起来很方便。
首先,让我们看下 requests.get() 方法,它用于向服务器发起 GET 请求,不了解 GET 请求没有关系。
我们可以这样理解:get 的中文意思是得到、抓住,那这个 requests.get() 方法就是从服务器得到、抓住数据,也就是获取数据。让我们看一个例子(以fanyi.baidu.com为例)来加深理解:
# -*- coding:UTF-8 -*-
import requests
if __name__ == '__main__':
target = "http://fanyi.baidu.com/"
req = requests.get(url = target)
req.encoding = 'utf-8'
print(req.text)
requests.get() 方法必须设置的一个参数就是 url ,因为我们得告诉 GET 请求,我们的目标是谁,我们要获取谁的信息。运行程序看下结果:
这,就是最简单的,网络爬虫。
本文对网络爬虫的基础进行了讲解,此系列文章为该系列的开篇之作。
后续的文章,会以生动有趣的实例,带大家一起玩转 Python3 网络爬虫。
参考链接(我参考我自己):
原创不易,您的点赞是对我最大的支持~