提示:本文适用于刚刚入门学习爬虫的童鞋
前言
提示:随着数据相关专业的普及,爬虫已经变得越来越重要,当我们想在网上批量获取公开数据的时候,手动复制难免费时费力,而这个时候,爬虫就起到了至关重要的作用
可能会使用到的库有:requests、lxml、re、bs4 如果没有这些库的话可以在命令行使用pip install… 进行安装!!! 本博客的文章都很简单,遇到每个实例都建议自己动手去敲,而不是直接赋值黏贴,因为我也没写代码哈哈哈哈。图片若看不清的话可以点击放大来看。
提示:以下是本篇文章正文内容
一、爬虫的合法性及其探究
1、爬虫合法吗?
爬虫是属于灰色地带的产物,也就是说,如果你往好的地方用,是没有关系的,但如果你无视法律的存在,去干坏事,那就是属于违法了。
2、爬虫要注意什么?
- 尽量优化自己的程序,不要给别人的服务器造成很大的麻烦,并且不要疯狂的点击别人的网站,通常那样会让别人承担不住。
- 不要写恶意的爬虫
- 不要爬取网上的隐私数据,商业机密,敏感数据等…
- 不要拼命破解一些别人加密了的数据,通常这些数据别人并不想全给你抓取下来
- robots.txt协议
二、爬虫的几个步骤
1、指定url
url通常是你要爬取的网站,通常我们会在网址中直接获取,或者在抓包工具中(按F12或者鼠标右键检查),找到你想要的数据的网址,下面展示一下获取url的地方,直接获取就可以。
2、发送请求
我们使用requests模块发送请求,首先如果你没有这个库的话需要先安装一下: 在命令行中输入: “pip install requests”。我们发送的请求通常有post和get,通常情况下,在网址中的url是使用get方式,而在抓包工具中的url则需要看一看Request Method这个参数是什么。
- post请求: requests.post()
- get请求: requests.get()
3、接受请求得到的数据
-
我们要对网页所返回的数据进行一些处理,才能得到我们想要的数据。首先我们要接受它。
-
在我们使用post或者get之后,我们需要一些手段来得到我们的数据,通常有:
- text : 获得网页源代码
- json : 获得json数据(json是一种数据交互方式),通常我们可以直接得到json数据或者使用json.load或json.loads方法将其转换为Python中的字典
- content : 获得二进制数据
-
我们需要使用一些匹配规则来匹配我们所需要的数据,通常有:
- re正则表达式
- BeautifulSoup
- Xpath
4、进行持久化存储
- 持久化存储这块读者可大胆发挥自己的想象力,我们可以存储在excel表中,以csv或者xlsx的形式、或者存储在数据库中,亦或是存储在txt文本当中,在后面的实例我们再仔细讲解。
三、几个案例
在所有案例开始之前,再次申明,请不要对别人的服务器制造很大的麻烦!!!!!!
1、百度一下,你就知道
- 我们写好了我们的程序,然后运行它,发现打印出的源码只有如此一点点,我们现在打开百度的首页,鼠标右键点击查看网页源代码。显然我们没有拿到全部的网页源代码,而且这里的字符好像也出了点问题。
- 我们先来看一看字符的问题,是不是编码错误? 我们加上res.encoding=“utf-8”。
- 这样就正常了,但是我们怎么解决得不到全部源代码的问题呢?我们怀疑可能是被发现了。
- 我们需要进行一些伪装,headers意味发送的请求头,我们在headers这个字典中加入了User-Agent这个参数,表明我们是一个浏览器而不是一个Python程序。User-Agent参数通常在自己的网页中进行复制。同样的打开抓包工具,刷新出一些网页来,在Requests Headers(请求头)中我们找到User-Agent这个参数(蓝笔标注),并直接进行复制,我们首先用双引号将其隔开,然后在写成字典形式即可。
- 这样看来,我们的数据就变得正常了。
- 现在我们相对刚得到的数据进行持久化存储,打开一个baidu.html文件,以写的方式进行存储,encoding表示指定编码方式。
- 这样在我们得到的源码中,我们可以直接点开我们的显示在浏览器上的按钮(蓝笔标注),看看是不是真正获取了全部的源代码。
- 补充一个东西,我们百度搜索的东西,假设我要搜索Python
- 好像有一堆参数,但大多数其实是我们不需要的。我们只留下一个wd。
- 搜索出来的东西其实是一样的。那我们再给这个wd改成Java。
- 可以发现搜索的东西变成了Java。
- 我们打开抓包工具,刷新网页,发现一个请求,带着一个参数,这个参数就是我们搜索的关键字。
- 你明白了点什么吗?我们可以发送请求给这个网址,顺便带上参数。
- get请求的参数是params,而post请求是data。
- 当你将得到的这个源码打开,你就会发现进入了Java的搜索页面。
- 这个案例到这就结束了,这仅仅是一个简单的开始,它让你明白在原有的基础上,你可能需要一些伪装手段,查看/掌握编码的技巧。
2、豆瓣Top250
- 先进入页面看看
- 我们以电影的名字来举例:我们想获得一部分电影名字的数据,我们先右键选择查看网页源代码,按ctrl+f进行搜索。我们想在源码中找一下是否有肖申克的救赎这几个关键字。我们确保在源码中是有这些东西的,但是看这么多源码,一下子想取出来难免有点费劲。
- 在取出这些数据之前,我们需要先学习一个名叫正则表达式(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 >.*?) (注意这里面不需要打引号)
- 下面动手试试吧~~~ ,对人家服务器友好一点!!!
- - 我们看到我们已经获取到了我们需要的数据。
- 其实正则也有偷懒的写法,即复制网页源代码,将某些部位改成.? 或 (.?) ,后者里面是需要匹配的数据,前者是不需要的,但是会帮助你匹配,过滤一些代码。
- 正则就到这里吧嘻嘻嘻嘻嘻。
- 但我们会发现了个有趣的东西,我们换页的时候有些参数在改变,我们删去filter这个参数,留下这个start,当前显示start是等于25,而我们的页面中的电影序号是26,这会不会有某些规律。
- 我们将start改成30,神奇的一幕发生了!!!
- 现在这个页面电影的序号是从31开始的了!!!还挺有趣的吧嘻嘻嘻。
- 斜眼笑.jpg。
3、抓取QQ音乐的评论
- 废话不多说,我们直接找到我们要的一点点评论
- 那个包是在绿色字标注的那个包的上面的那个包,这里标识错了。
- 现在我们一层层剥开它的心
- 这儿!(蓝笔标注)应该就是我们想要的东西,好!开始码代码,我们事先查看一下请求方式及编码格式还有返回的数据。这次的数据居然是json的格式。我们只要在我们请求之后加上 .json() 就好。返回的格式是Python中的字典。字典的嵌套形式,即要一层层取出你要的东西。
- 例子:
-
下面是代码
-
json格式的文件只要 .json() 就会返回一个字典啦,至于怎么快速地找到字典中的键,那就要将这个字典格式的数据放到json在线解析工具中去,然后就可以清晰地找到了。
-
这就持久化存储好了
-
完结!!!!
4、猪八戒网
- 先看一看这个网站,还挺有意思的。
- 我在搜索栏中输入了软件二字,现在我们想把这些价格信息抓取下来
- 我们查看页面源代码,发现里面有我们想要的数据。
- 在这之前,我们需要学习一个很方便的匹配规则-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’)
- 没啦!是不是很少!!!
- 下面开始撸代码吧!
- 等等,我们先看看这个箭头。
- 点一下他,在点一下你要找的东西,就会跳转到你想要找的代码了。
- 然后就是你自由发挥的时候啦,我们顺着这个源代码,一层层地找下来。
- 直接看代码吧!
- 再看看我们的文件
- 数据已经存储进来了!!!
- 完结!!!
5、糗事百科图片下载
- 学到这里,你应该知道怎么做了吧?当然是先去找对应的图片链接啊!!!之前讲过的怎么分析源码在这里依然用得上,而且这里还多了一点东西——那就是你得先找到图片链接,再对链接进行访问,将图片进行下载。
- 用之前说过的方法,我们可以很轻松地找到图片链接
- 然后我们可以根据自己的爱好,选择自己喜欢的匹配规则。
- 然后呢,找到对应图片的链接,将其存放在一个列表中。
- 之后再对列表中的图片链接进行处理并进行访问,使用**.content**方法将其下载。
- 现在让我们来看看我们的文件有没有图片
- 当然是有的啦,只不过没有展示那么多。
- 有没有发现一个问题??我的图片是.jpg.jpg!!!这是因为在给图片命名的时候我手动添加上了.jpg,好吧是我画蛇添足了。糗事百科就到这里吧!
总结
提示:本文章中涉及了爬虫的基本知识,包括发送请求,处理请求,持久化存储等等。这只是一个小开头,爬虫的冰山一角。本文没有涉及js等更高级的爬虫,作为初学者不需要了解太多,待对前端有更深入的学习之后再去了解更多就不会感到迷糊了。本文也介绍了爬虫的一些基本分析方法,当然只是一个思路罢了,如果想学会更多的东西,还是要不断的联系以及不断的摸索。
写在最后 :
加油!!!!软件人
转载:https://blog.csdn.net/qq_45911278/article/details/115653853