爬虫学习笔记(十)scrapy入门,使用scrapy爬取猫眼电影top100

2018-07-26 分类:Python, 爬虫 阅读(751) 评论(2)

上面篇博客说了scrapy的流程,这次先做个小项目,爬取到猫眼电影排行榜前100的电影名称、评分、上映时间、主演,存储到mongodb里面。再做这个项目的过程中,来学习scrapy各个组件的用法。

需要把mongodb装好,启动,linux下不会装的可以在我的博客里面搜一下mongodb,有教程,Windows的就不用搜了,傻瓜式直接安装即可。

一、创建项目

在开始爬取之前,必须创建一个新的Scrapy项目。在命令行里面进入到咱们要写代码的目录下,运行下面的命令即可,但是要装好scrapy

命令执行之后的结果

下面是项目的目录结构,可以看到nnSpider是程序的主目录,下面还创建了一个nnSpider的文件夹,里面有一些python文件

下面来简单介绍一下各个主要文件的作用:

 

scrapy.cfg :项目的配置文件,做集群分布式的时候会用到他

mySpider/ :项目的Python模块,将会从这里引用代码

mySpider/items.py :项目的目标文件,和django里面item类似,就是定义好一些字段,然后存数据的时候哪个数据存到哪个字段里面

mySpider/pipelines.py :项目的管道文件,就是做一些数据的清洗、处理,存到什么数据库里的操作。

mySpider/settings.py :项目的设置文件,配置文件,启动多少个线程、每个爬虫之间的间隔等等

mySpider/spiders/ :存储爬虫代码目录,这个就是存写爬虫的目录,建python文件在里面写

 

二、明确目标

明确目标就是确定要爬哪些数据,前面已经说了要获取电影名称、评分、上映时间、主演、海报图片,也就是要编写items文件了,item用来定义结构化的数据字段,爬到的数据都要按照一个固定的格式给存储起来,这样每获取到一条数据都按照这个格式来存储。

比如说上面咱们的数据怎么存储呢,就是下面这样子的,item就是类似字典一样的东西。

下面是items里面的内容:

三、创建爬虫

在创建项目的时候,可以看上面那个图,它提示咱们了,可以创建一个爬虫,先进入到项目目录下,然后使用scrapy genspider命令生成一个爬虫

执行完这个命令就会在spiders目录下产生一个maoyan.py,这个就是写爬取数据代码的地方,它会自动生成一些代码,如下代码

 

接下来就先分析一下网页,然后再开始写代码。

页面概览

每页的url

每部电影的html代码

1、先打开top100的页面,看下页面,分析一下页面上需要关注的内容,有多页,每页有10部电影,url是 http://maoyan.com/board/4

2、点下一页发现,每页的数据都是是在后面加了一个offset参数,第一页是offset=0,第二页是offset=10,以此类推最后一页的offset值就是offset=90了,分析出来每页的url是http://maoyan.com/board/4?offset=n

3、每部电影信息都是在每页里面的class为board-wrapper的dl标签下面的dd标签内,那用xpath或者css选择器来获取数据就ok了。

 

那流程就是这样,先打开第一页的url,然后获取到这个页面的10部电影,存起来,打开第二页,获取到第二页的10部电影,再存起来,以此类推。

接下来开始写spider里面的代码,也就是在maoyan.py里面接着来写代码

运行一下看看数据,是否都被获取到了,使用 scrapy crawl maoyan命令运行爬虫,结果如下,可以看到把所有的电影信息的信息都已经抓到了。

 

四、存储内容

 

数据已经获取到了,下面把数据存到mongodb中;在爬虫的parse函数里面如果yield一个item的话,scrapy引擎就会自动把item交给管道来处理,也就是pipeline,编写好pipleline之后,需要在setting配置中启用pipeline,代码如下

这个是在配置文件中开启pipeline的设置,打开注释即可,后面的数字代表优先级,数字越小,优先级越高,可以写多个

下面是运行完之后,存到mongo里面的数据~

六、scrapy命令行

 

在运行爬虫的时候可以指定参数直接把数据存到文件里面,不用pipeline的话,指定 -o参数即可。

七、css、xpath选择器例子

 

上面用到了xpath和css选择器,写几个常用的

八、配置文件中常用的设置

 

您可能也喜欢:

协程、gevent实现异步io、进程、线程、协程对比

异步io的说白了就是遇到io操作的时候,就停下来去做别的事情。io分网络io和磁盘io,网络io比如说打开一个网站获取数据,下载一首歌等等,磁盘io就是把数据存到一个文件里面,写到磁盘上。 从网站上获取数据或者把数据写到磁盘上都是需要时间的,那就得等待了,这样的话,很多任务的时候就比较慢了,而异步i...

more

迭代器、生成器

迭代器只有在调用next的时候才会取数据(所以省内存),或者循环的时候,一个对象里面实现了__iter__方法,iter方法里面返回了一个迭代器,那就是一个可迭代对象了。 下面的代码,首先实现了iter方法,这个对象就是一个可迭代对象了,然后又返回了self就是自己,就是一个迭代器了。 使用for ...

more

socket、tcp/ip协议、udp协议

socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,...

more

评论&留言
欢迎新朋友你的到来!
已经有2 条评论抢在你前面了~
昵称

  1. Xq

    厉害厉害?

    #1
    回复
  2. 匿名

    前排沙发

    #2
    回复

登录

忘记密码 ?

切换登录

注册