前言
你是不是在为想收集数据而不知道如何收集而着急?
你是不是在为想学习爬虫而找不到一个专门为小白写的教程而烦恼?
Bingo! 你没有看错,这就是专门面向小白学习爬虫而写的!我会采用实例的方式,把每个部分都跟实际的例子结合起来帮助小伙伴儿们理解。最后再写几个实战的例子。
我们使用Python来写爬虫,一方面因为Python是一个特别适合变成入门的语言,另一方面,Python也有很多爬虫相关的工具包,能够简单快速的开发出我们的小爬虫。
本系列采用Python3.5版本,毕竟2.7会慢慢退出历史舞台~
那么,接下来,你得知道什么是爬虫、爬虫从哪里爬取数据的,以及,学习爬虫都要学习哪些东西。
什么是爬虫
来看看百度百科是如何定义的
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
什么?没看懂?没关系,我来给你解释一下
打开一个网页,里面有网页内容吧,想象一下,有个工具,可以把网页上的内容获取下来,存到你想要的地方,这个工具就是我们今天的主角:爬虫。
这样是不是更清晰了呢?
既然了解了爬虫是什么,那么爬虫是如何爬取数据的呢?
爬虫是哪里爬取数据的
打开浏览器(强烈建议谷歌浏览器),找到浏览器地址栏,然后在里输入store.steampowered.com/stats/并回车,你会看到网页内容。
摁下键盘上的F12打开开发调试工具,,然后点击元素。看到这些文字了吗?这才是网页最赤果果的样子。
其实所有的网页都是HTML代码,只不过浏览器将这些代码解析成了上面的网页,我们的爬虫抓取的其实就是HTML代码中的文本。
随后点击开发调试工具左上角的小鼠标图标,点击你想要爬取的数据,你就会在元素这一栏看到下面红框的地方,是你要爬取数据的本来模样。
没错,我们的爬虫抓取的正是网页中的数据,你要知道你想要抓取什么数据,你的目标网站是什么,才可以把想法变成现实的。
学习爬虫的必备知识
大家要先对以下内容有一定的了解再来学习爬虫哦,磨刀不误砍柴工
- HTML
这个能够帮助你了解网页的结构,内容等。可以参考W3School的教程。 - Python
如果有编程基础的小伙伴儿,推荐看一个廖雪峰的Python教程就够了
没有编程基础的小伙伴,推荐看看视频教程(网易云课堂搜Python),然后再结合廖雪峰的教程,双管齐下。
其实知乎上总结的已经非常好了,我就不多唠叨了。知乎-如何系统的自学Python - TCP/IP协议,HTTP协议
这些知识能够让你了解在网络请求和网络传输上的基本原理,了解就行,能够帮助今后写爬虫的时候理解爬虫的逻辑。
廖雪峰Python教程里也有简单介绍,可以参考:TCP/IP简介,HTTP协议
想更深入学习的小伙伴儿可以去网上多搜搜相关的书籍哦
OK, 下一步就开始我们的实战啦
requests 库的安装
为什么要先说Requests库呢,因为这是个功能很强大的网络请求库,可以实现跟浏览器一样发送各种HTTP请求来获取网站的数据。网络上的模块、库、包指的都是同一种东西,所以后文中可能会在不同地方使用不同称谓,不要迷惑。
直接使用Python3.5的小伙伴儿输入这个命令:pip install requests
如果你机器上存在多个Python版本,要给Python3.5的版本安装requests库,需要输入以下命令:py -3 -m pip install requests
好啦,requests库安装完毕,接下来我们会在实际例子中演示它的使用。想要深入了解requests模块的小伙伴也可以仔细阅读英文官方文档,和中文官方文档,如果用到该文没有提到的功能,则查看文档即可。
开工
新建一个文件,只要他的后缀为.py即可,名字选择你喜欢的就好。
输入第一行代码来导入requests库:import requests #导入requests库
然后用它来获取咱们的目标网页:
1 | r = requests.get('https://store.steampowered.com/stats/') #像目标url地址发送get请求,返回一个response对象 |
之后再文件目录打开cmd页面,指令运行
python xxxxx.py
执行完之后,底部会出现输出结果:
可以看到底部是获取到的网页内容。这就完成了爬虫的第一步,获取到了网页的HTML内容。
这用到了requests库的get请求。其他请求使用也与之类似,但本文不进行阐述。
我们刚才用requests库发送http请求获得了网页的HTML内容,那么应该如何从HTML中获得图片?
BeautifulSoup库就此登场啦,赶快去来了解它的用法。
刚才演示了如何使用requests模块向网站发送http请求,获取到网页的HTML数据。这篇来演示如何使用BeautifulSoup模块来从HTML文本中提取我们想要的数据。
模块安装
BeautifulSoup 有多个版本,我们使用BeautifulSoup4。详细使用看BeautifuSoup4官方文档。
使用管理员权限打开cmd命令窗口,在窗口中输入下面的命令即可安装:pip install beautifulsoup4
然后我们安装lxml,这是一个解析器,BeautifulSoup可以使用它来解析HTML,然后提取内容。
pip install lxml
如果不安装lxml,则BeautifulSoup会使用Python内置的解析器对文档进行解析。之所以使用lxml,是因为它速度快。
BeautifulSoup 库的使用
网上找到的几个官方文档:BeautifulSoup4.4.0中文官方文档,BeautifulSoup4.2.0中文官方文档。不同版本的用法差不多,几个常用的语法都一样。
首先来看BeautifulSoup的对象种类,在使用的过程中就会了解你获取到的东西接下来应该如何操作。
BeautifulSoup对象的类型
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象。所有对象可以归纳为4种类型: Tag , NavigableString , BeautifulSoup , Comment 。下面我们分别看看这四种类型都是什么东西。
Tag
这个就跟HTML或者XML(还能解析XML?是的,能!)中的标签是一样一样的。我们使用find()方法返回的类型就是这个(插一句:使用find-all()返回的是多个该对象的集合,是可以用for循环遍历的。)。返回标签之后,还可以对提取标签中的信息。
提取标签的名字:
1 | tag.name |
提取标签的属性:
1 | tag['attribute'] |
NavigableString就是标签中的文本内容(不包含标签)。获取方式如下:tag.string
还是以上面那个例子,加上下面这行,然后执行:print('NavigableString is:', find.string)
BeautifulSoup
BeautifulSoup对象表示一个文档的全部内容。支持遍历文档树和搜索文档树。
Comment
这个对象其实就是HTML和XML中的注释。
搜索文档树
最常用的当然是find()和find_all()啦,当然还有其他的。比如find_parent() 和 find_parents()、 find_next_sibling() 和 find_next_siblings() 、find_all_next() 和 find_next()、find_all_previous() 和 find_previous() 等等。
我们就看几个常用的,其余的如果用到就去看官方文档哦。
- find_all()
搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件。返回值类型是bs4.element.ResultSet。
完整的语法:find_all( name , attrs , recursive , string , **kwargs )
继续之前的爬取
我们选中想要爬取的地方,查看html代码。发现游戏的在线人数都在span标签里,并且class都是currentServers,如下图。
通过观察,发现在线人数都在span元素中的文本内容。下面,我们先获取到所有的含有数据的span标签,然后在循环获取span标签中的文本内容。
1 | import requests #导入requests 模块 |
这里的find_all(‘span’, class_=’currentServers’)是找到所有class为currentServers的span标签,返回的是一个list,所以可以用for循环获取每个span标签。
Excalibur!!!