利用Scrapy爬取1905电影网

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

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

Scrapy 爬虫介绍

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

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

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

从上图中可以看到,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是有规律的,

第一页 http://www.1905.com/mdb/film/list/country-China/o0d0p0.html

第二页 http://www.1905.com/mdb/film/list/country-China/o0d0p1.html

最后页 http://www.1905.com/mdb/film/list/country-China/o0d0p484.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 = "http://www.1905.com/mdb/film/list/country-China/o0d0p%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 = "http://www.1905.com" + url
            yield scrapy.http.Request(url,self.parse_movie)

注意到,提取url标签时我们采用xpath进行标签定位,关于xpath的介绍可以看这里

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

对于电影页的处理

根据前面所说,我们暂时不分析电影页中的内容,仅仅是将其存入本地

    def parse_movie(self, response):
        item = Movie1905Item()
        item[‘url‘] = response.url
        item[‘html‘] = response.body
        item[‘filename‘] = "movie_" + hashlib.sha1(response.url).hexdigest() + ".txt"

        print response.url
        return item

保存数据

爬虫处理完数据后,返回一个item,scrapy看到返回结果是个item就会根据配置文件将其交给相应的pipeline的process_item方法进行数据的保存工作,这里没有什么太多可说的,大家根据自己的定义写就可以了

class Movie1905Pipeline(object):
    db = "movie"                                    # 数据库名
    filePath = "E://crawlerFile//movie//"       # 爬去下来的文件保存目录地址

    def __init__(self):
        self.SQLconn = SqlConnector(db=self.db)     # 我自己封装的数据库类

    def process_item(self, item, spider):
        self.save_in_File(item)
        self.save_in_DB(item)
        return item

    # 存入文件
    def save_in_File(self,item):
        file_object = open(self.filePath + item[‘filename‘],‘w‘)
        file_object.write(item[‘html‘])
        file_object.close()

    # 存入数据库
    def save_in_DB(self,item):
        query = "insert into movie(url,filename) values(%s,%s)"
        query = self.SQLconn.generateQuery(query,[item[‘url‘],item["filename"]])
        self.SQLconn.insert(query)

配置文件

我们可以利用配置文件对我们的爬虫进行深层定制,现在这个spider只需要增加两个配置

DOWNLOAD_HANDLERS = {‘s3‘: None,}
ITEM_PIPELINES=[‘movie1905.pipelines.Movie1905Pipeline‘]

第一行我暂时也不知道是做什么用的,但没有这行爬虫不会运行

第二行是定义爬虫的Pipeline

爬虫运行

在cmd内进入同scrapy.cfg同一级目录中,运行

scrapy crawl chineseMovie

运行结果如下图所示

相关资料

【1】该爬虫源代码

【2】Scrapy手册

【3】xPath资料

时间: 2024-10-14 01:42:17

利用Scrapy爬取1905电影网的相关文章

scrapy爬取豆瓣电影top250

1 # -*- coding: utf-8 -*- 2 # scrapy爬取豆瓣电影top250 3 4 import scrapy 5 from douban.items import DoubanItem 6 7 8 class DoubanspiderSpider(scrapy.Spider): 9 name = "doubanspider" 10 # allowed_domains = ["movie.douban.com/top250"]注意这里的主页限制

【Python3 爬虫】U09_爬取hao6v电影网

目录 1.需求描述 2.实现代码 1.需求描述 爬取hao6v电影网的数据,先通过xpath解析第一个页面,获取到每部电影的url详情页地址,然后解析详情页地址,获取出所需的数据 页面如下: 2.实现代码 # Author:Logan import requests from lxml import etree HEADERS = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML

利用Python爬取豆瓣电影

目标:使用Python爬取豆瓣电影并保存MongoDB数据库中 我们先来看一下通过浏览器的方式来筛选某些特定的电影: 我们把URL来复制出来分析分析: https://movie.douban.com/tag/#/?sort=T&range=0,10&tags=%E7%94%B5%E5%BD%B1,%E7%88%B1%E6%83%85,%E7%BE%8E%E5%9B%BD,%E9%BB%91%E5%B8%AE 有3个字段是非常重要的: 1.sort=T 2.range=0,10 3.tag

运维学python之爬虫高级篇(五)scrapy爬取豆瓣电影TOP250

对于scrapy我们前面已经介绍了简单的应用,今天我们用一个完整的例子,爬取豆瓣电影TOP250来做一个小的练习,把scrapy阶段做一个总结. 1 环境配置 语言:Python 3.6.1 IDE: Pycharm 浏览器:firefox 爬虫框架:Scrapy 1.5.0 操作系统:Windows 10 家庭中文版 2 爬取前分析 2.1 需要保存的数据 首先确定我们要获取的内容,在items中定义字段,来将非结构化数据生成结构化数据,获取的内容主要包括:排名.电影名称.得分.评论人数.如下

scrapy爬取猫眼电影排行榜

做爬虫的人,一定离不开的一个框架就是scrapy框架,写小项目的时候可以用requests模块就能得到结果,但是当爬取的数据量大的时候,就一定要用到框架. 下面先练练手,用scrapy写一个爬取猫眼电影的程序,环境配置和scrapy安装略过 第一步肯定是终端运行创建爬虫项目和文件 1 # 创建爬虫项目 2 scrapy startproject Maoyan 3 cd Maoyan 4 # 创建爬虫文件 5 scrapy genspider maoyan maoyan.com 然后在产生的ite

使用 Scrapy 爬取去哪儿网景区信息

Scrapy 是一个使用 Python 语言开发,为了爬取网站数据,提取结构性数据而编写的应用框架,它用途广泛,比如:数据挖掘.监测和自动化测试.安装使用终端命令 pip install Scrapy 即可. Scrapy 比较吸引人的地方是:我们可以根据需求对其进行修改,它提供了多种类型的爬虫基类,如:BaseSpider.sitemap 爬虫等,新版本提供了对 web2.0 爬虫的支持. 1 Scrapy 介绍 1.1 组成 Scrapy Engine(引擎):负责 Spider.ItemP

利用Scrapy爬取所有知乎用户详细信息并存至MongoDB

欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者 :崔庆才 本节分享一下爬取知乎用户所有用户信息的 Scrapy 爬虫实战. 本节目标 本节要实现的内容有: 从一个大V用户开始,通过递归抓取粉丝列表和关注列表,实现知乎所有用户的详细信息的抓取. 将抓取到的结果存储到 MongoDB,并进行去重操作. 思路分析 我们都知道每个人都有关注列表和粉丝列表,尤其对于大V来说,粉丝和关注尤其更多. 如果我们从一个大V开始,首先可以获取他的个人信息,然后我们获取

Python 2.7_First_try_爬取阳光电影网_20161206

之前看过用Scrapy 框架建立项目爬取 网页解析时候用的Xpath进行解析的网页元素 这次尝试用select方法匹配元素 1.入口爬取页面 http://www.ygdy8.com/index.html 2.用到模块  requests(网页源码下载) BeautifulSoup4(网页解析) 3.思路:首先由入口爬取页面进行获取网页上方栏目及对应url 如下图 4.建立菜单url列表 for 循环再次进行解析 爬取每个一级菜单下的具体电影title 和url 5.问题:每个菜单下的url 进

Python 2.7_Second_try_爬取阳光电影网_获取电影下载地址并写入文件 20161207

1.昨天文章http://www.cnblogs.com/Mr-Cxy/p/6139705.html 是获取电影网站主菜单 然后获取每个菜单下的电影url  2.今天是对电影url 进行再次解析获取下载地址 并写入文件  调用函数和类多线程还没实现 一步步来吧 3.问题:我想实现的是先对菜单进行创建文件目录 然后每个目录下以获取的电影名称.txt 作为文件 文件内是下载连接,但是创建一级菜单文件夹没问题 用OS模块就可以创建 在写入电影名称.txt时候出问题 报错 我以为是编码问题 f.open