利用Scrapy爬取1905电影网

作者:上海建筑防水有限公司  来源:www.yxjzfs.com   发布时间:2017-09-03 12:43:45
利用Scrapy爬取1905电影网

本文将从以下几个方面讲解Scrapy爬虫的基本操作

Scrapy爬虫介绍 Scrapy安装 Scrapy实例——爬取1905电影网 相关资料 Scrapy 爬虫介绍

Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。

Scrapy 使用 Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。整体架构如下图所示:

Scrapy构架

从上图中可以看到,Scrapy已经帮我们处理好了Downloader以及Scheduler。作为轻量级用户,我们完全不用关心爬虫是如何调度及下载的,只需要关注爬虫的爬去规则(Spiders)以及如何存储(Item Pipeline)。

Scrapy的安装

网上有许多关于Scrapy安装的博客,大家自行搜索,我是采用pip的安装方式

pip install scrapy

如果使用pip安装时遇到 KeyError: u’\u6e29’ 的问题,可以参考我的博客

python2.7 pip install 报错KeyError: u’\u6e29’解决方案

Scrapy 实例 爬虫任务介绍

这次要爬去1905电影网的所有中国电影,共14499部电影
下图为目录页,每个目录页有30个电影,共有486个目录页

这里写图片描述

下图为需要保存的电影页面,我们将其保存到本地,以后再解析

这里写图片描述

我们观察到目录页url是有规律的,
第一页 0.html
第二页 1.html
最后页 484.html
因此我们每次替换上面url中黑体的部分即可。

整个爬虫的逻辑为
1. 构建所有目录页url
2. 爬取目录页,并分析出当前目录页中的电影页url
3. 爬取电影页,并保存

创建爬虫

在开始爬取之前,必须创建一个新的Scrapy项目。 利用cmd进入打算存储代码的目录中,然后输入命令scrapy startproject movie1905构建爬虫项目,其中 movie1905 项目名,可自定义。

该命令将会创建包含下列内容的movie1905目录:

movie1905/ scrapy.cfg movie1905/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py ...

其中settings.py是项目的配置文件,spiders目录是放置爬虫的目录,pipelines.py是用于存数据的文件,items.py是爬虫爬取数据的容器

定义Item

item 是保存爬取到的数据的容器,我们根据自己的需要定义Item

import scrapy class Movie1905Item(scrapy.Item): url = scrapy.Field() # url html = scrapy.Field() # 爬取下来的网页内容 filename = scrapy.Field() # 网页存储在本地的文件名 撰写爬虫

这个爬虫需要在spiders目录里新建一个.py文件

class Movie(scrapy.Spider): name = "chineseMovie" allowed_domains = ["1905.com"]

其中name 是用于在命令行调用爬虫时作为爬虫区分的标识,简单说就是爬虫的名字,该名字必须唯一!
allowed_domains 是爬虫允许爬去的域名,如果不在该域名中则不爬取。
应该来说还应有一个start_urls 作为Spider在启动时进行爬取的url列表,但考虑到我们需要爬取的url有一定的规则,因此用一个中间件代替,如下所示:

def start_requests(self): basic_url = "%s.html" start,end = 0,485 for i in range(start,end): url = basic_url.replace("%s",str(i)) yield scrapy.http.Request(url,self.parse)

分析网页时对于目录页与电影页需要区别对待。

对于目录页的处理

首先对于目录页我们需要分析出当前目录页中的电影页url,并将该url交给scrapy去进行接下来的处理

def parse(self, response): sel = Selector(response) urls = sel.xpath('//ul[@class="inqList pt18"]/li/a/@href').extract() for url in urls: url = "" + url yield scrapy.http.Request(url,self.parse_movie)

注意到,提取url标签时我们采用xpath进行标签定位,关于xpath的介绍可以看这里
这里还有一种更简单的xpath定位方法,我们使用chrome浏览器,右键审查元素找到我们想要的标签,在该标签上邮件copy,选择copy xpath,根据该结果进行适当调整即可,如下图所示:

这里写图片描述

对于电影页的处理

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:荆州SEO http://jingzhou.raoyu.net


上一篇:卡汀财经分享—摩根士丹利告诉你,他们都在读哪些金融
下一篇:最后一页