专栏名称: Python中文社区
致力于成为国内最好的Python开发者学习交流平台,这里有关于Python的国内外最新消息,每日推送有趣有料的技术干货和社区动态。 官方网站:www.python-cn.com
目录
相关文章推荐
Python爱好者社区  ·  突发!ETH官宣制裁中国学生,国防七子、中科 ... ·  3 天前  
Python爱好者社区  ·  为什么感觉中国人月薪过万很普遍了? ·  昨天  
Python爱好者社区  ·  python学习手册 ·  昨天  
Python爱好者社区  ·  80w,我入局了! ·  6 天前  
Python爱好者社区  ·  离职后收到最逆天的消息是什么。。。 ·  6 天前  
51好读  ›  专栏  ›  Python中文社区

Python爬虫入门(一):爬虫基本结构&简单实例

Python中文社区  · 公众号  · Python  · 2017-02-08 21:49

正文

專 欄

iGuo,就读于厦门大学王亚南经济研究院,China's Prices Project leader擅长的领域主要是数据分析相关,包括爬虫、数据清洗、数据分析、数据可视化等,正在研究海量数据的计算和挖掘。
GitHub:https://github.com/Guo-Zhang
项目网站:http://www.xmucpp.com/   
项目地址:https://github.com/xmucpp

本爬虫系列教程会持续完善,有看不懂的地方或者有错误的地方欢迎大家在评论区指出。

系列专栏目录:

第一讲:Python爬虫入门(一):爬虫基本结构&简单实例

第二讲:Python爬虫入门(二):请求

第三讲:Python爬虫入门(三):解析

第四讲:Python爬虫入门(四):储存

爬虫能干什么呢?一句话概括,正常通过浏览器可以获取的数据,爬虫都可以获取。这句话可以说是包罗万象。一是说明了爬虫的本质是一个服务端,实现的功能类似于浏览器;二是说明了爬虫的界限,如果不能正常访问到的数据就不能通过爬虫获取;三是爬虫的最高境界,只要是浏览器能正常访问的都可以用爬虫获取。更多爬虫的神奇用处。

下面我们讲讲爬虫的基本结构和简单实现。这篇文章我不准备详细地讲具体怎么写爬虫,只是先用一个非常简单的实现,给大家看看爬虫是个什么样子。详细的内容我们后面一个一个慢慢说。

一、爬虫的基本结构

让我们忽略掉来自各种各样的资料对于爬虫结构的描述,把问题尽可能地描述简单一点。前面说到,爬虫是一个获取正常浏览器可以获取的数据的自动化获取程序。那么,从这个功能出发,我们需要干的事情其实就两件事情:找到我们需要的网页,然后把他们一个一个处理一遍。(这句话很重要,我们在后面的后面讲到海量数据爬取策略的时候还要回到这句话。)那么问题就来了:一,怎么找到我们需要的网页的那个入口?二,怎么处理我们需要处理的网页?

对于单个页面来说,入口的来源有两种,一种是已知地址,比如我们院的网站的教学研究人员:教学研究人员;

另外一种是你可以通过前面爬下来的网页中获取入口,比如这个页面上所有老师的个人主页。这一点很重要,后面我们在把小爬虫逐步变大的时候还要反复回到这里。

好的,后面的部分,让我们通过解决第二个问题(处理网页)的过程,顺便看看怎么解决第一个问题(获取更多入口)。我们一起开看看一个单页爬虫是怎么实现的。

二、爬虫实例:简单的单页爬虫

好了,现在我们要处理网页了。可是网页要怎么处理呢?让我们回忆一下我们使用浏览器的过程:你先把一个地址复制进浏览器的框框里面,或者点开一个链接;然后浏览器的进度条跑一下(有可能快也有可能慢),然后我们就在浏览器里面看到了数据。首先,进度条跑的过程完成了一个对网页的请求,然后浏览器把请求下来的数据进行处理,然后就输出出来。这是一个极其简化但是不太准确的对于浏览器工作原理的描述。那么爬虫和浏览器有什么不同呢?一般来说,我们是只需要解析网页,而不需要渲染浏览器环境的;另外,我们需要特定网页的特点数据,因此要用一定的方式把数据组织并储存起来。所以,爬虫的核心模块有三个:请求、解析、储存。

首先我们给一个入口:教学研究人员。

这就是我们今天要处理的目标网页。我们今天要实现的目的就是把这个页面上所有老师的姓名和个人主页的链接(也就是可能的下一次爬虫的入口)提取出来。下面开始写爬虫吧~

1、请求

这里我们使用的package是requests。这是一个第三方模块(具体怎么下载以后再说),对HTTP协议进行了高度封装,非常好用。所谓HTTP协议,简单地说就是一个请求过程。我们先不管这玩意是啥,以后再讨论。这个部分,我们要实现的目的是把网页请求(或者说下载)下来。

首先我们导入requests

import requests 
下面调用
requests的get函数,把网页请求下来:

  1. r = requests.get('http://www.wise.xmu.edu.cn/people/faculty')

返回的“r”的是一个包含了整个HTTP协议需要的各种各样的东西的对象。我们先不管都有啥,先把我们需要的网页提取出来:

html = r.content 
好了,到这一步我们已经获取了网页的源代码。具体源代码是什么样的呢?右键,点击“查看源文件”或者“查看源”就可以看到:

view-source:http://www.wise.xmu.edu.cn/people/faculty

2、解析

当然从这一大坨代码里面找信息太麻烦了。我们可以用浏览器提供的另外一个工具:审查元素。这里我们先不讲怎么使用审查元素,先从源代码里面找。找到的我们需要的信息如下:

这里我们使用bs4来解析。bs4是一个非常好的解析网页的库,后面我们会详细介绍。这次的解析先给大家看bs4里面最常用的几个BeautifulSoup对象的方法(method)。我们使用的这几个方法,主要是通过HTML的标签和标签里面的参数来定位,然后用特定方法(method)提取数据。

首先还是导入package:

from bs4 import BeautifulSoup 
然后创建一个BeautifulSoup对象:

soup = BeautifulSoup(html,'html.parser') #html.parser是解析器 
下面我们根据我们看到的网页提取。首先提取我复制的这部分的代码的第一行,先定位到这部分代码:

div_people_list = soup.find('div', attrs={'class': 'people_list'}) 
这里我们使用了BeautifulSoup对象的find方法。这个方法的意思是找到带有‘div’这个标签并且参数包含" 
class = 'people_list' "的HTML代码。如果有多个的话,find方法就取第一个。那么如果有多个呢?正好我们后面就遇到了,现在我们要取出所有的“a”标签里面的内容:

a_s = div_people_list.find_all('a', attrs={'target': '_blank'}) 
这里我们使用
find_all方法取出所有标签为“a”并且参数包含“ target = ‘_blank‘ ”的代码,返回一个列表。“a”标签里面的“href”参数是我们需要的老师个人主页的信息,而标签里面的文字是老师的姓名。我们继续:

  1. for a in a_s:

  2.    url = a['href']

  3.    name = a.get_text()

这里我们使用BeautifulSoup支持的方法,使用类似于Python字典索引的方式把“a”标签里面“href”参数的值提取出来,赋值给url(Python实际上是对对象的引用),用get_text()方法把标签里面的文字提起出来。

事实上,使用这四个方法就可以正常地解析大部分HTML了。不过如果只用这四个方法,很多程序会写的异常原始。所以我们后面再继续介绍更多解析方法。

  1. 储存

这里我们先弱化一下具体的储存方法,先输出到控制台上面。我们在刚才的代码的基础上加一行代码:

  1. for a in a_s:

  2.    url = a['href']

  3.    name = a.get_text()

  4.    print name,url

使用print关键词把得到的数据print出来。让我们看看结果:

好的,到这里一个原型就完成了。这就是一个非常简单的爬虫,总代码不过十几行。复杂到几百几千行的爬虫,都是在这样的一个原型的基础上不断深化、不断完善得到的。

后面的爬虫系列,我们会详细讲解三个部分,然后把每个模块拼起来成一个爬虫。之后我们还会见到更多爬虫方法和爬虫实例。我们下次见~

§§


Python中文社区
www.python-cn.com

致力于成为

国内最好的Python社区


推荐文章
Python爱好者社区  ·  为什么感觉中国人月薪过万很普遍了?
昨天
Python爱好者社区  ·  python学习手册
昨天
Python爱好者社区  ·  80w,我入局了!
6 天前
Python爱好者社区  ·  离职后收到最逆天的消息是什么。。。
6 天前
卢泓言  ·  少说创新,多说实事求是
7 年前