那些年,我爬过的北科(一)——爬虫基础之环境搭建与入门
2018-12-08 23:13:13

环境搭建

关于语言

对于网络爬虫来说,其本质就是发送http请求,然后提取网页的内容信息进行入库分析等操作,所以对于任何语言都可以构建爬虫应用。我曾经就用过C#、C++、Java、Swift、Golang、Python这些语言来编写爬虫应用。

总结来说,这里还是最推荐python,其优点就是学习简单,并且库十分全面,编写起代码来十分轻巧,另外python拥有丰富的机器学习库、数据处理库,如scikit-learn、numpy、pandas等等,可以用来处理我们爬取的数据。

本系列文章假设读者已经掌握了python语言的最基本语法,并有一定的编程基础。

关于代码编辑器

作为一门脚本语言,python代码不需要编译、链接等步骤,只需要使用python的解释器解释执行就好了,所以使用一个记事本就可以完成python的编码工作。不过为了更加高效的编写代码,程序员都会选择一款代码编辑器。

如果对于python很熟悉,不需要代码拼写提示等功能,其实使用常见的代码编辑器如AtomSublime Text 即可(当然如果配置插件,这些编辑器也可以有强大的代码提示功能,不过新手配置起来可能会遇到困难)。

如果需要代码提示,我感觉用的最舒服的还是JetBrains系列的Pycharm更好用一些。我本身也主要在用Pycharm。

关于浏览器

浏览器除了浏览网页以外,对爬虫开发者来说还可以对网页的Html元素、发送的HTTP请求进行分析。市面上基本上所有的浏览器都支持这两种功能,但是普遍来说用的最多的还是Chrome浏览器。

下面,我们首先通过Chrome浏览器下载一个weibo上的小视频,来学习如何用Chrome浏览器抓取网络请求。

用Chrome抓取网络请求

视频的链接:http://weibo.com/tv/v/FaOp9o8Ct

打开Chrome浏览器后,我们可以首先打开一共空白页面,然后右键,选择检查。
chrome1

点击检查后,可以看到弹出一个Dock窗口,为了方便查看页面内容,我习惯把这个Dock窗口放在右边。
chrome2

在这个Dock窗口中,有很多个选项卡,在本系列教程中,主要使用到Elements和NetWork这两个,一个负责审查Html元素,一个负责记录网络请求。目前需要使用网络抓取功能,所以先跳到Network这个选项卡中。
chrome3

下面,在浏览器中输入视频的链接并回车,就可以看到网页加载出来了,其中的网络请求也记录在了右边。
chrome4

可以看到这些网络请求有html、css、js、图片等等,点击一个条目后都可以看到请求的详情,在这里面其中有一个请求大小很大,并且在一直增长,可以想象这就是我们正在观看的视频文件。
chrome5

我们点击这个请求可以看到请求的真实链接地址,这个地址中还带了个mp4,显然就是我们正在观看的视频文件。
chrome6

我们把链接复制下来,在一个新的Tab中输入链接后回车,可以看到已经把视频下载到了本地。
chrome7

用本地的影音播放器打开,和线上的一模一样。
local_mp4

爬虫入门

学习了上面的小技巧,如果碰到你想下载的音乐、想下载的视频,通过这种方法就可以下载下来(当然优酷、爱奇艺这样的专门做视频的网站已经规避了这种方法)。

下面,将正式开始学习网络爬虫,本章将以http://nladuo.cn/scce_site/为例, 爬取它的通知公告的文本信息。
goal

使用requests下载网页

网页主要由HTML、CSS、JavaScript代码以及图片等资源组成,其中HTML控制页面的结构,CSS控制页面的样式,JavaScript控制页面的逻辑。对于目前大部分的网站,我们要爬取的文本信息一般情况下都保存在HTML中。(也有些网站使用JavaScript来控制页面的结构和信息,HTML中不存在需要爬取的信息,我们将在反反爬虫篇再详细介绍这种情况。)

在python中,我们可以通过requests库来下载一个网页的html。比如说上面的这个链接,我们可以通过以下一行代码把网页信息下载下来,然后通过print打印它。

1
2
3
4
import requests

resp = requests.get("http://nladuo.cn/scce_site/")
print resp.content

在运行代码前,请先使用pip安装requests库,使用以下命令即可完成对库的安装:

1
pip install requests

运行代码后,可以看到显示出一堆html的标签。
download_html

在浏览器中,也是先下载这样的html页面,然后根据html代码的结构展示到显示屏中的。

网页结构

下面,我们来看看HTML如何对应到网页的结构中的,我们先打开这个网址然后使用chrome浏览器查看一下这个网页的结构,像上面的抓取网络请求一样,我们按下右键然后选择检查,并在右边弹出的选项卡中选择Elements项。
structure

在Elements的左侧有个箭头,点击这个箭头后,箭头变为选中状态。箭头处于选中状态时,用鼠标滑动到左侧的网页中,可以看到右侧对应的html信息。

在上图中,可以看到新闻信息处在class为every_list的div标签中。展开div的class为every_list标签后,可以看到在class为list_title标签下面的a标签中,存放着新闻的链接(a.href),新闻的标题(a中间的文本);在class为list_time的标签中,存放了新闻发布的日期。
structure_detail

使用BeautifulSoup解析Html

那么,我们如何从HTML中提取这些文本呢?这里可以使用HTML解析库解析HTML的内容,常见的有BeautifulSoup,HtmlParser、PyQuery等等。

这里,我们选用BeautifulSoup,还是先用pip安装一下依赖。

1
pip install bs4

在使用requests下载html后,我们把html传给一个BeautifulSoup对象后,即可对html进行解析,使用find查找指定元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
from bs4 import BeautifulSoup

if __name__ == '__main__':
resp = requests.get("http://nladuo.cn/scce_site/")
# print(resp.content)
soup = BeautifulSoup(resp.content)
items = soup.find_all("div", {"class": "every_list"})

for item in items:
title_div = item.find("div", {"class": "list_title"})
title = title_div.a.get_text()
url = title_div.a["href"]
time = item.find("div", {"class": "list_time"}).get_text()
print(time, title, url)

在上面代码中,使用find_all方法首先找到所有的class为every_list的div标签,然后对div进行遍历,逐个打印每个标签下面的list_title和list_time。(更详细的API,读者可以查阅BeautifulSoup的文档。)

运行上述代码后,成功打印出了新闻的基本信息。
out

至此,我们的第一个爬虫也就完成了。

Prev
2018-12-08 23:13:13
Next