爬虫入门级别教程(小白水平)

提示:本文适用于刚刚入门学习爬虫的童鞋

爬虫入门级别教程

  • 前言
  • 一、爬虫的合法性及其探究
    • 1、爬虫合法吗?
    • 2、爬虫要注意什么?
  • 二、爬虫的几个步骤
    • 1、指定url
    • 2、发送请求
    • 3、接受请求得到的数据
    • 4、进行持久化存储
  • 三、几个案例
    • 1、百度一下,你就知道
    • 2、豆瓣Top250
    • 3、抓取QQ音乐的评论
    • 4、猪八戒网
    • 5、糗事百科图片下载
  • 总结


前言

提示:随着数据相关专业的普及,爬虫已经变得越来越重要,当我们想在网上批量获取公开数据的时候,手动复制难免费时费力,而这个时候,爬虫就起到了至关重要的作用


可能会使用到的库有:requests、lxml、re、bs4 如果没有这些库的话可以在命令行使用pip install… 进行安装!!! 本博客的文章都很简单,遇到每个实例都建议自己动手去敲,而不是直接赋值黏贴,因为我也没写代码哈哈哈哈。图片若看不清的话可以点击放大来看。


提示:以下是本篇文章正文内容

一、爬虫的合法性及其探究

1、爬虫合法吗?

爬虫是属于灰色地带的产物,也就是说,如果你往好的地方用,是没有关系的,但如果你无视法律的存在,去干坏事,那就是属于违法了。

2、爬虫要注意什么?

  • 尽量优化自己的程序,不要给别人的服务器造成很大的麻烦,并且不要疯狂的点击别人的网站,通常那样会让别人承担不住。
  • 不要写恶意的爬虫
  • 不要爬取网上的隐私数据,商业机密,敏感数据等…
  • 不要拼命破解一些别人加密了的数据,通常这些数据别人并不想全给你抓取下来
  • robots.txt协议

二、爬虫的几个步骤

1、指定url

url通常是你要爬取的网站,通常我们会在网址中直接获取,或者在抓包工具中(按F12或者鼠标右键检查),找到你想要的数据的网址,下面展示一下获取url的地方,直接获取就可以。
爬虫入门级别教程(小白水平)_第1张图片

2、发送请求

我们使用requests模块发送请求,首先如果你没有这个库的话需要先安装一下: 在命令行中输入: “pip install requests”。我们发送的请求通常有post和get,通常情况下,在网址中的url是使用get方式,而在抓包工具中的url则需要看一看Request Method这个参数是什么。

  • post请求: requests.post()
  • get请求: requests.get()
  • 区别:
    • post请求参数没限制,安全但不高效。
    • get请求参数有限制,不安全但高效。

3、接受请求得到的数据

  • 我们要对网页所返回的数据进行一些处理,才能得到我们想要的数据。首先我们要接受它。

  • 在我们使用post或者get之后,我们需要一些手段来得到我们的数据,通常有:

    • text : 获得网页源代码
    • json : 获得json数据(json是一种数据交互方式),通常我们可以直接得到json数据或者使用json.load或json.loads方法将其转换为Python中的字典
    • content : 获得二进制数据
  • 我们需要使用一些匹配规则来匹配我们所需要的数据,通常有:

    • re正则表达式
    • BeautifulSoup
    • Xpath

4、进行持久化存储

  • 持久化存储这块读者可大胆发挥自己的想象力,我们可以存储在excel表中,以csv或者xlsx的形式、或者存储在数据库中,亦或是存储在txt文本当中,在后面的实例我们再仔细讲解。

三、几个案例

在所有案例开始之前,再次申明,请不要对别人的服务器制造很大的麻烦!!!!!!

1、百度一下,你就知道

爬虫入门级别教程(小白水平)_第2张图片

  • 我们写好了我们的程序,然后运行它,发现打印出的源码只有如此一点点,我们现在打开百度的首页,鼠标右键点击查看网页源代码。显然我们没有拿到全部的网页源代码,而且这里的字符好像也出了点问题。

  • 我们先来看一看字符的问题,是不是编码错误? 我们加上res.encoding=“utf-8”

爬虫入门级别教程(小白水平)_第3张图片

  • 这样就正常了,但是我们怎么解决得不到全部源代码的问题呢?我们怀疑可能是被发现了。

  • 我们需要进行一些伪装,headers意味发送的请求头,我们在headers这个字典中加入了User-Agent这个参数,表明我们是一个浏览器而不是一个Python程序。User-Agent参数通常在自己的网页中进行复制。同样的打开抓包工具,刷新出一些网页来,在Requests Headers(请求头)中我们找到User-Agent这个参数(蓝笔标注),并直接进行复制,我们首先用双引号将其隔开,然后在写成字典形式即可。
    爬虫入门级别教程(小白水平)_第4张图片

爬虫入门级别教程(小白水平)_第5张图片


  • 这样看来,我们的数据就变得正常了。

  • 现在我们相对刚得到的数据进行持久化存储,打开一个baidu.html文件,以写的方式进行存储,encoding表示指定编码方式。
    爬虫入门级别教程(小白水平)_第6张图片
  • 这样在我们得到的源码中,我们可以直接点开我们的显示在浏览器上的按钮(蓝笔标注),看看是不是真正获取了全部的源代码。
    爬虫入门级别教程(小白水平)_第7张图片
  • 补充一个东西,我们百度搜索的东西,假设我要搜索Python
    爬虫入门级别教程(小白水平)_第8张图片
  • 好像有一堆参数,但大多数其实是我们不需要的。我们只留下一个wd。
    爬虫入门级别教程(小白水平)_第9张图片
  • 搜索出来的东西其实是一样的。那我们再给这个wd改成Java。
    爬虫入门级别教程(小白水平)_第10张图片
  • 可以发现搜索的东西变成了Java。

  • 我们打开抓包工具,刷新网页,发现一个请求,带着一个参数,这个参数就是我们搜索的关键字。

爬虫入门级别教程(小白水平)_第11张图片

  • 你明白了点什么吗?我们可以发送请求给这个网址,顺便带上参数。

  • get请求的参数是params,而post请求是data。
    爬虫入门级别教程(小白水平)_第12张图片
  • 当你将得到的这个源码打开,你就会发现进入了Java的搜索页面。

  • 这个案例到这就结束了,这仅仅是一个简单的开始,它让你明白在原有的基础上,你可能需要一些伪装手段,查看/掌握编码的技巧。

2、豆瓣Top250

  • 先进入页面看看
    爬虫入门级别教程(小白水平)_第13张图片
  • 我们以电影的名字来举例:我们想获得一部分电影名字的数据,我们先右键选择查看网页源代码,按ctrl+f进行搜索。我们想在源码中找一下是否有肖申克的救赎这几个关键字。我们确保在源码中是有这些东西的,但是看这么多源码,一下子想取出来难免有点费劲。

爬虫入门级别教程(小白水平)_第14张图片

  • 在取出这些数据之前,我们需要先学习一个名叫正则表达式(re)的东西

  • 正则表达式是一种匹配规则,你首先需要知道这些。
    • . :   匹配除换行符外的任意字符串
    • \w : 匹配字母或数字或下划线
    • \s : 匹配任意的空白符
    • \d : 匹配任意数字
    • ? : 匹配0次或1次
    • * : 匹配0次或多次
    • + : 匹配1次或多次
    • ^ : 从头开始匹配
    • $ : 从尾部开始匹配
    • {n} : 重复n次
    • {n,[m]} : 重复n次或更多次(或到m次)
    • [^] : 不匹配字符组里的字符
    • .* : 表示贪婪匹配
    • .*? : 表示非贪婪匹配
    • \W : 表示匹配非字母或数字或下划线
    • \D : 表示匹配非数字
    • \S : 表示匹配除空白符外的任意
    • \n : 表示匹配一个换行符
    • \t : 表示匹配一个制表符
    • a|b : 匹配字符a或b
    • () : 匹配括号内的表达式,也表示一个值

*别急还有亿点点~~~~*

  • 然后知道这些函数的话就比较足够了
    • re.findall(匹配规则,字符串) : 在字符串中找到所有满足匹配规则的字符串,并以列表的形式返回。
    • re.finditer(匹配规则,字符串) : 在字符串中找到所有满足匹配规则的字符串,并以迭代器的形式返回。
    • re.search(匹配规则,字符串) : 在字符串中找到一个满足匹配规则的字符串就返回。
    • re.match(匹配规则,字符串) : 在字符串中从头匹配,找不到就报错。

  • 预加载匹配规则
    • re.compile("",[可加入其它,前面也可,比如re.S,表示让.可以匹配换行符]) : 在里面填入你的匹配规则
    • com = re.compile("")
    • com.findall(字符串)
    • 括号的拓展使用 : (?P<这里可取名字>然后写正则)
    • 例 : (?P< name >.*?) (注意这里面不需要打引号)

  • 下面动手试试吧~~~ ,对人家服务器友好一点!!!
    -爬虫入门级别教程(小白水平)_第15张图片
  • 我们看到我们已经获取到了我们需要的数据。
  • 其实正则也有偷懒的写法,即复制网页源代码,将某些部位改成.? 或 (.?) ,后者里面是需要匹配的数据,前者是不需要的,但是会帮助你匹配,过滤一些代码。
  • 正则就到这里吧嘻嘻嘻嘻嘻。

  • 但我们会发现了个有趣的东西,我们换页的时候有些参数在改变,我们删去filter这个参数,留下这个start,当前显示start是等于25,而我们的页面中的电影序号是26,这会不会有某些规律。
    爬虫入门级别教程(小白水平)_第16张图片
  • 我们将start改成30,神奇的一幕发生了!!!
    爬虫入门级别教程(小白水平)_第17张图片
  • 现在这个页面电影的序号是从31开始的了!!!还挺有趣的吧嘻嘻嘻。
  • 斜眼笑.jpg。

3、抓取QQ音乐的评论

  • 废话不多说,我们直接找到我们要的一点点评论

  • 点到这个蓝笔标注的包,看Preview这一栏是不是有那些评论。
    爬虫入门级别教程(小白水平)_第18张图片

  • 现在我们一层层剥开它的心
    爬虫入门级别教程(小白水平)_第19张图片

  • 这儿!(蓝笔标注)应该就是我们想要的东西,好!开始码代码,我们事先查看一下请求方式及编码格式还有返回的数据。这次的数据居然是json的格式。我们只要在我们请求之后加上 .json() 就好。返回的格式是Python中的字典。字典的嵌套形式,即要一层层取出你要的东西。


  • 例子:
    爬虫入门级别教程(小白水平)_第20张图片

  • 下面是代码

  • json格式的文件只要 .json() 就会返回一个字典啦,至于怎么快速地找到字典中的键,那就要将这个字典格式的数据放到json在线解析工具中去,然后就可以清晰地找到了。
    爬虫入门级别教程(小白水平)_第21张图片

  • 这就持久化存储好了
    爬虫入门级别教程(小白水平)_第22张图片

  • 完结!!!!

4、猪八戒网

  • 先看一看这个网站,还挺有意思的。
  • 我在搜索栏中输入了软件二字,现在我们想把这些价格信息抓取下来
  • 我们查看页面源代码,发现里面有我们想要的数据。
    爬虫入门级别教程(小白水平)_第23张图片
  • 在这之前,我们需要学习一个很方便的匹配规则-Xpath,Xpath嘛用过的人都说好~~~
  • Xapth的学习:类似树的一种查找,从根节点,一层层地查找,返回列表。
    • / : 表示从根节点开始,表示的是一个层级
    • // : 表示从任意节点开始查找, 表是多个层级
    • /div : 查找该节点下的div标签
    • /div[1] : 查找该节点下的第一个div标签,Xpath中索引从1开始
    • /div[@class=“abc”] : 查找该节点下的一个div标签,他有一个class属性,属性值为abc
    • /text() : 取该节点下的文本内容
    • //text() : 获取该节点以及它的子节点下的文本内容
    • /@attr : 取该节点的attr属性
    • 实例化一个etree对象 from lxml import etree
    • 加载本地html的源码文件 : etree.parse(filepath) filepath是文件路径
    • 加载从互联网中刚得到的html源码 : etree.HTML(‘page_text’)
  • 没啦!是不是很少!!!

  • 下面开始撸代码吧!
  • 等等,我们先看看这个箭头。
    爬虫入门级别教程(小白水平)_第24张图片
  • 点一下他,在点一下你要找的东西,就会跳转到你想要找的代码了。

爬虫入门级别教程(小白水平)_第25张图片

  • 然后就是你自由发挥的时候啦,我们顺着这个源代码,一层层地找下来。
  • 直接看代码吧!
    爬虫入门级别教程(小白水平)_第26张图片
  • 再看看我们的文件
    爬虫入门级别教程(小白水平)_第27张图片
  • 数据已经存储进来了!!!
  • 完结!!!

5、糗事百科图片下载

  • 学到这里,你应该知道怎么做了吧?当然是先去找对应的图片链接啊!!!之前讲过的怎么分析源码在这里依然用得上,而且这里还多了一点东西——那就是你得先找到图片链接,再对链接进行访问,将图片进行下载。

  • 用之前说过的方法,我们可以很轻松地找到图片链接

爬虫入门级别教程(小白水平)_第28张图片

  • 然后我们可以根据自己的爱好,选择自己喜欢的匹配规则。
  • 然后呢,找到对应图片的链接,将其存放在一个列表中。
  • 之后再对列表中的图片链接进行处理并进行访问,使用**.content**方法将其下载。

爬虫入门级别教程(小白水平)_第29张图片
爬虫入门级别教程(小白水平)_第30张图片

  • 现在让我们来看看我们的文件有没有图片
    爬虫入门级别教程(小白水平)_第31张图片
  • 当然是有的啦,只不过没有展示那么多。
  • 有没有发现一个问题??我的图片是.jpg.jpg!!!这是因为在给图片命名的时候我手动添加上了.jpg,好吧是我画蛇添足了。糗事百科就到这里吧!

总结

提示:本文章中涉及了爬虫的基本知识,包括发送请求,处理请求,持久化存储等等。这只是一个小开头,爬虫的冰山一角。本文没有涉及js等更高级的爬虫,作为初学者不需要了解太多,待对前端有更深入的学习之后再去了解更多就不会感到迷糊了。本文也介绍了爬虫的一些基本分析方法,当然只是一个思路罢了,如果想学会更多的东西,还是要不断的联系以及不断的摸索。

写在最后 :

加油!!!!软件人

你可能感兴趣的:(Python爬虫学习)