爬虫基本原理

优采云 发布时间: 2020-05-14 08:08

  这篇文章的定位是,给有一些python基础,但是对爬虫一无所知的人写的。文中只会涉及到爬虫最核心的部份,完全避免莫名其妙的坑或概念,让读者认为爬虫是一件极其简单的事情,而事实上爬虫确实是一件极其简单的事情(如果你不是以爬虫为工作的话)。

  本文分为如下几个部份

  简单理解网路爬虫就是手动抓取网页信息的代码,可以简单理解成取代繁杂的复制粘贴操作的手段。

  首先必须申明,爬虫的对象必须是你早已听到的网页,比如你不能说你想找到知乎上那个用户的关注人数最多,就希望通过写一个爬虫来帮你爬到答案。你必须明晰地晓得这个人,找到他的主页,然后才会用爬虫来抓取他页面上的信息。

  下面我们用一个简单的事例来展示爬虫的工作流程。感觉多数教程第一篇都使用的是豆瓣top250,我们这儿换一个,抓取CSDN首页的文章标题,链接在这里,页面样子是这样的

  

  

  抓取标题完整代码如下

  import requests # 导入网页请求库

from bs4 import BeautifulSoup # 导入网页解析库

# 传入URL

r = requests.get('https://www.csdn.net/')

# 解析URL

soup = BeautifulSoup(r.text, 'html.parser')

content_list = soup.find_all('div', attrs = {'class': 'title'})

for content in content_list:

print(content.h2.a.text)

  这样才会复印出所有标题,展示一部分如下

  

  

  上述过程是一个最简单的完整爬虫流程,可以看出它的功能就是把这些标题复制粘贴到一起,免不仅自动操作的冗长。其实爬虫通常就是做这些事的,比如我们须要用链家的数据进行剖析,看到链家的页面是这样的

  

  

  我们想获取每位房屋的标题、几室几厅、多少平米、朝向、装修、价格等等数组(即指标),就可以通过爬虫进行定位,自动化抓取这100页所有房屋的那些数组信息。比如100页里有2000个房屋,总共抓取10个数组,爬虫运行结束就可以得到一个2000行10列的excel表格。

  注:如果还没有安装里面两个库的读者可以在命令行下分别运行下边两行命令完成安装

  pip install requests

pip install beautifulsoup4

  知道了爬虫是拿来干哪些的以后,我们来介绍一些最常见到的概念

  1.URL

  URL英文称为统一资源定位符,其实可以理解成网页的链接,比如前面的就是一个URL。

  但是更广义的URL不只是我们常听到的网页资源链接,而是资源在网页中的定位标示。我们一般说的网页是一个资源,网页中加载的每一张图片也是一个资源,它们在互联网中也有惟一的定位URL。比如我们从CSDN网页上随意找一张图片

  

  

  这个链接就是这个图片资源的定位符,将这个链接输入浏览器中都会显示出这张图片网页爬虫,所以说这张图片也对应一个URL。

  不过晓得如此回事就好,我们一般所说的传入URL指的就是把网页的链接传进去。上面代码中

  r = requests.get('https://www.csdn.net/')

  就是在将URL传入恳求函数。

  2.网页恳求

  说到网页恳求,就有必要讲一下我们平时浏览网页时,信息交互的模式大约是什么样的。我们平时用浏览器浏览网页的时侯,鼠标点了一个链接,比如你如今点击这儿,其实浏览器帮你向这个网页发送了恳求(request),维护网页的服务器(可以理解为CSDN公司里的一台笔记本,在维护这CSDN上的各个网页)收到了这个恳求,判定这个恳求是有效的,于是返回了一些响应信息(response)到浏览器,浏览器将这种信息进行渲染(可以理解成 处理*敏*感*词*能读懂的样子),就是你看见的网页的样子了。发送恳求与接收恳求的过程就和 发陌陌和收到回复的过程类似。

  而如今我们要用代码来模拟滑鼠点击的过程。上面的requests.get就是使代码帮你向这个网页发送了这个恳求,如果恳求被判断为有效,网页的服务器也会把信息传送给你,传送回去的这种信息就被形参到变量r之中。所以这个变量r里就包含有我们想要的信息了,也包括这些我们想要提取的标题。

  我们可以print(r.text)看一下上面有哪些东西

  

  

  我们再看一下网页的源代码(如何读懂这个源码,以及这个源码如何查看下一节HTML会详尽提到)

  

  

  源代码和r.text虽然是一模一样的东西。r.text虽然就是一个字符串,字符串中有我们刚才抓取到的所有标题,我们只要通过字符串匹配方式(比如正则表达式)将她们提取下来就可以了。这样说是不是觉得爬虫十分简单呢?只要这样傻蛋操作

  r = requests.get('https://www.csdn.net/')

  再直接从r.text字符串中提取信息即可。其实爬虫就是那么简单。

  但是解析是如何回事呢,为什么刚才不直接用正则而要用bs4呢?因为便捷,但是正则也是完全可以的,只是相对麻烦一些、需要写更多的代码而已。

  3.网页解析

  网页解析虽然就从网页服务器返回给我们的信息中提取我们想要数据的过程。其实使用正则表达式提取我们要的标题的过程也可以称为网页解析。

  因为当前绝大多数网页源代码都是用HTML语言写的,而HTML语言时特别有规律性的,比如我们要的所有文章标题都具有相同结构,也就是说它周围的字符串都是十分类似的,这样我们能够批量获取。所以就有大鳄专门封装了怎样从HTML代码中提取特定文本的库,也就是我们平常说的网页解析库,如bs4 lxml pyquery等,其实把她们当作处理字符串的就可以了。

  为了更清楚地了解怎样对网页进行解析,我们须要先简略把握HTML代码的结构。

  引用维基百科中的一段话来介绍HTML

  超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被诸多网站用于设计令人赏心悦目的网页、网页应用程序以及移动应用程序的用户界面[1]。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。

  为了使读者对HTML有更清楚的认识,我们来写一点简单的HTML代码。用文本编辑器(记事本也可以)创建一个名子为a.html的文件,在里面写下如下代码

  <!DOCTYPE html>

<html>

<head>

<title>爬虫基本原理</title>

</head>

<body>

<h1>HTML介绍</h1>

<p>第一段</p>

<p>第二段</p>

</body>

</html>

  保存,然后你双击这个文件,就会手动用浏览器打开,然后你还能见到下边这个样子的页面

  

  

  你若果根据我的操作来做的话,你已然创建了一个简单的网页,现在你看见的所有网页都是这样设计的,只是比你的复杂一点而已,不信你去瞧瞧刚刚截图出来的网页源代码图片。

  接下来,我们来看一下HTML语言的特性。最重要的一点是网页爬虫,文本都是被标签(h1标签 p标签)夹在中间的,而这种标签都是特定的,有专门用途的。比如<h1>就表示一级标题,包在上面的文本自然会被放大显示;而<p>标签则表示段落。

  再看里面的源代码截图,head meta script title div li每一个都是标签,层层嵌套。我们完全不需要晓得总共有什么种标签,也不需要晓得这种标签都是拿来干哪些的,我们只要找到我们要的信息包含在哪些标签里就行了。比如使用正则表达式就直接用<p>(.*?)</p>就可以把上面的内容提取下来了。

  但是事实似乎没有这么简单,看里面的截图标签如何是这样的<nav id="nav" class="clearfix">?其实这是一个<nav>标签,后面的id class是这个标签的属性。

  为什么要给标签设置属性呢?我们先考虑这样一个问题:我们看见的网页千差万别,文字的颜色字体等都不一样,这是如何设置的呢?答案是使用css样式。

  css句子类似这样

  h1 {

color: white;

text-align: center;

}

p {

font-family: verdana;

font-size: 20px;

}

  即设置对应标签的颜色、字体、大小、居中等。而当有的段落使用这个字体,有的段落使用哪个字体如何办呢?css这样设置

  p.test1 {

font-size: 20px;

}

p.test2 {

font-size: 15px;

}

  在HTML代码中则这样写

  <p class="test1">20px大小的字</p>

<p class="test2">15px大小的字</p>

  所以不同属性就是为了分辨相同标签用的,这相当于给标签进行了分类,在统一设计款式上更方便,同时对于我们依照属性定位我们想要内容的位置虽然也是更方便了。这里要说明一下,class id这两个属性比较特殊,用的也最多,所以各自弄了一个快捷键来表示,class用.,id用#。

  做爬虫不需要了解刚才编撰的css代码内容放到那里之类的问题,也不需要了解css代码设置了哪些,我们只会和HTML打交道,所以只要理解HTML中属性的作用就可以了。

  如果想要更进一步了解HTML和CSS,可以到w3school网站学习。

  现在你就早已具备了解析网页须要的全部HTML知识了。我们通常就是依据标签名配合属性值来定位我们想要资源的位置的,其他的都不用管。这时,我们再来看爬虫的解析代码

  把上面的代码再粘贴一遍如下

  import requests # 导入网页请求库

from bs4 import BeautifulSoup # 导入网页解析库

# 传入URL

r = requests.get('https://www.csdn.net/')

# 解析URL

soup = BeautifulSoup(r.text, 'html.parser')

content_list = soup.find_all('div', attrs = {'class': 'title'})

for content in content_list:

print(content.h2.a.text)

  解释一下里面代码的过程

  可以看见里面的代码十分简约,思路清晰,读者可以自己想一想假如要用正则表达式怎么匹配那些标签,会发觉代码冗长好多,虽然它也有更快的优势。

  那么我们是如何晓得要找寻什么样属性的div标签,为什么要找h2 a标签而不是其他的呢?这就要去剖析网页的源代码了。而这个过程也十分简单。

  我们如今用谷歌浏览器打开CSDN这个网站,找一个空白的位置右键-查看网页源代码,这时才会打开一个新的页面这个页面就是这个网站的HTML源代码了,我们可以通过这个页面来看我们要的信息在那里,但是觉得十分不便捷,因为有太多无用的信息做干扰,我们难以快速掌控网页的结构。所以我们可以用另一种形式查看源代码。

  用谷歌浏览器打开CSDN这个网站,找一个空白的位置右键-检查,就会弹出一个框,如下图所示

  

  

  (如果没有听到这个界面,注意要切换到Element中)

  这个页面最大的用处是通过折叠来使人更快探求出网页的结构。

  其中的这些代码就是HTML代码,该页面的一个个标题就存在这一个个li上面。点击li后面的三角就可以展开具体的代码内容,如下图所示

  

  

  可以看见文章的标题(打造一个高性能、易落地的公链开发平台)就在这个源代码之中,也就是说在我们刚才获得的r.text字符串之中。而我们代码定位路径也一目了然了,因为每位li上面还会有一个<div class="title">而每一个div上面还会有一个h2 里面有一个a,a中包含我们要的标题名称。所以我们就用find_all找到所有这样的div标签,存储为一个list,再对list进行循环,对每一个元素提取h2 a 再提取标签中的内容。

  当然我们也可以find_all最外边的li标签,再一层层往里找,都是一样的。只要找到定位信息的惟一标示(标签或则属性)就可以了。

  虽然在这里看源代码可以折叠一些没用的代码,但是虽然还有一些更好用的工具来辅助我们找到我们要的信息在网页源码中的位置。比如下边这个键盘符号。

  

  

  在所有代码都折叠上去的情况下,点击这个键盘,之后再去点击网页中的元素,浏览器都会手动帮你把你点击的元素选中下来,其实你键盘悬在一个元素前面的时侯,就早已帮你定位了,如下图所示

  

  

  当我们要爬一个网页的时侯,只须要如下流程

  现在,对于一些没有丝毫反爬举措的网站我们都可以游刃有余了。至于抓取多个数组的数据怎么组织在一起、抓取多页(URL有规律的情况下)的代码怎样设计,就不是爬虫知识范畴了,这是用python基础知识就可以解决的。下一系列文章就主要讲这一部分。接下来给几个当前可以练手的网站

  如果使用BeautifulSoup的定位的过程中遇见困难,可以直接到网上搜教程,也可以等我们这个专题前面更新的BeautifulSoup详尽介绍。

  如果你去抓取其他网站,最好先看一下r.text是不是和网站源代码一模一样,如果不是,说明你对方服务器没有把真正的信息给你,说明他可能看出你是爬虫了(进行网页恳求的时侯,浏览器和requests.get都相当于带着一堆*敏*感*词*去敲门,对方会检测你这种*敏*感*词*,浏览器的*敏*感*词*通常是可以通过的,而代码的*敏*感*词*就可能不合格,因为代码的*敏*感*词*可能有一些比较固定的特征,对方服务器预先设定好,*敏*感*词*是这样的恳求一律拒绝,因为她们一定是爬虫,这就是反爬虫机制),这时就须要懂一些反反爬举措就能获得真正的信息,反反爬方式的学习是一个积累的过程,我们前面再讲。读者假如遇见一些反爬机制,可以到网上查这个网站的爬虫,估计都能查到一些博客讲怎么破解,甚至直接贴出代码。

  在这篇的基础上抓取多页以及代码设计的改进看下边这三篇续集

  爬虫代码改进(一)

  爬虫代码改进(二)

  爬虫代码改进(三)

  专栏主页:python编程

  专栏目录:目录

  爬虫目录:爬虫系列目录

  版本说明:软件及包版本说明

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线