1
爬虫概述
当初第一次接触python,听的最多的就是爬虫爬虫,搞得我一脸蒙蔽,因为我从来都没听过这么新颖的词,而且我还天真的以为是不是python长得像一条小虫子,所以才叫爬虫。
直到后来经过不断的百度之后,我才发现自己是有多么的无知。
原来爬虫全名为“网络爬虫”,又名“网络蜘蛛”。
如果把互联网比作一张大网,那么大网中有着数以万计个,由网交叉而成的节点。这时,我们化身的网络蜘蛛就可以随着网爬到各个节点,爬取节点的资源,这就叫做网络爬虫。
众所周知,网页是由html,js,css等文件所构成,再经浏览器解析呈现在我们面前的。而网络爬虫就是爬取网页的程序,所以我们要获取网页的资源,就是对网页进行解析,也就是对html,js,css等进行解析,从而将想要的东西爬取下来。
作为一个实干家,既然要了解爬虫,那我就从实战开始学,下面就用一个最基础的例子让大家认识一下爬虫吧。
1
爬取
豆瓣是我挺喜欢的一个网站,因为有时候书荒了,或者想看电影了,我都会去豆瓣瞅一瞅,有哪些评分高的书籍和电影。
当然喜欢它还有另外一个原因,那就是豆瓣可是新手练习爬虫的必爬网站啊!
所以我们今天的目标也是豆瓣,要爬取的则就是豆瓣电影的top250。
之前说过,互联网就是一张大网,我们则是大网中一只小爬虫,我们虽然小但是只要有通往各个节点的通道,我们就可以在大网中畅游。
同理,我们要进入豆瓣的top250网页,也需要一个通道,也就是url。
既然找到了通道,那俺们就可以进去瞅一瞅,顺便把网页的源码给爬下来了。
要爬网页的话,那就要用到我们python里的requests库了,不了解这个库的同学可以google学习一下。
我们先写上第一个函数,作用就是获取首页源码
在此之前还要导入requests库(import requests)
我们这个函数的作用是通过url获取网页源码,所以我们要先写形参url,用来接收我们之后传进来的实参。
将函数的框架搭好之后,我们就要开始填充内容了。
为了获取网页源码,我们就要用这一句:
response = requests.get(url)
这一句爬取了网页源码之后,我们就可以将爬取到的内容返回了
return response.text
至于这个函数里的其他内容就显得不是那么重要了,if是用来判断爬取成功还是失败,try except 则是用来显示异常的。
这个函数结束之后让我们来测试一下
if __name__ == '__main__':
在这里我给了url一个网址当作它的值,这个网址就是我们要爬取的网址
然后将get_page()函数的返回值赋值给html,根据函数中写的,我们可以知道,html最终就存储了爬取的网页源码。
我们试着print输出看看
吼吼结果还真的成功输出了网页的源码。
2
分析
现在我们已经爬到了网页的源码,接下来的一部就是要对源码进行分析了。
在分析之前,我们首先要明确,我们要获取网页中的哪一部分。
比如我们想要获取250个电影的名字。
分析源码,顾名思义,就是要去分析网页的源代码,让我们回到浏览器,F12查看源代码(推荐大家用谷歌浏览器)
这种时候就要考验我们的html功底了,
根据进一步的顺藤摸源码,让我在源码中找到了ol标签,这时候通过点击ol可以选择右边的所有电影,这就让我知道了,这一页的电影中都藏在ol标签中,并且li标签与每一个电影都相互对应着。
知道了这些之后,我们就点开li标签继续探索。
嘿嘿还真被我逮住了,我们发现电影的标题就藏在li标签内。
我们接着去找其他的li标签,发现每一个电影的标题都放在对应的li标签中,而且格式都是一样的。
有了这些信息我们就可以写第二个函数了
第二个函数用到了正则表达式,正则表达式一时半会儿也说不清,所以你们还是直接去这了解一下吧。
当初俺也是去这里学的,20分钟让你快速入门正则。
parse变量我给它传递了一串正则表达式,内容是定位电影标题的位置。
然后通过re.findall在网页源码中找到标题
parse_over = re.findall(parse, html)
紧接着通过for 循环和yield进行迭代,因为函数中有了yield后,整个函数就成为了迭代器。
然后我们整个程序再进一步完善
items = get_parse(html)
这一句作用是将函数get_parse传给item,使item变成迭代器,既然变成了迭代器,那么它便是可迭代对象了,所以就可以用for循环进行输出。
看一下结果
成功了,我们成功爬取了第一页电影的标题,但是我们的目的是爬取250个电影的标题欸!可不是爬取那么点哦。
这时让我们回到豆瓣top首页观察一下。
当我们处于第一页的时候url是这样的
那切换到第二页会怎能样呢?
我们发现url
变为了
继续点击第三页第四页
显然url的变化是有规律的,都是在原有的基础上加了
?start=25&filter=
然后start后面的数字都是以每一页,25的步数增加的。
由此我们可以猜想,既然其他页的url都是这个形式
那么第一页会不会形式也跟其他页一样呢,这时我们来验证一下,既然是以25为步数,那么当start=0的时候,会显示哪一页呢?
吼吼原来是第一页啊!
这下规律就被我们找到了,由此我们可以想到,既然url是有规律的,而且有规律的地方是数字,那我们是否可以用for循环来控制呢?
答案是,当然可以!
所以我们进一步修改一下我们的代码
这样子就可以爬取250个电影的电影名了。
2
存储
现在我们既然能爬取数据了,那接下来一步就是存储数据了。
我们再加一个函数,用于存储
然后再看看完整后的代码
这时候我们运行之后,就可以爬取数据,然后在当前页面下生成一个txt文件,将电影名称放入文件当中。
这样子,爬虫三步,爬取,分析,存储就完成了,这个例子是最基础的,但也是爬虫初学者必练的。
有兴趣的还可以在此基础上,将电影的导演和图片爬下来,反正我是爬下来了。
如果想要源码的话,可以后台回复“豆瓣源码”
或者去Github看我的源码