<python3爬虫>scrapy爬取豆瓣电影Top250(第二节)

首先分析我们要爬取的网页:
https://movie.douban.com/top250


我们要爬取的信息是这些电影的名称,电影相关信息,评分,以及一句话的名言。
这些信息就在网页的主体部分,使用xpath结合chrome的元素定位能很容易的提取到我们想要的信息。
接下来就是使用scrapy框架来编写我们的爬虫了。
在pycharm中,打开setting.py文件,添加一下内容

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) ' \
             'Chrome/14.0.835.163 Safari/535.1'

FEED_URI = 'file:///E:/douban/result/douban.csv'
FEED_FORMAT = 'CSV'

user_agent是浏览器的标识,我们使用这个标识伪装我们的爬虫。然而豆瓣实际上并不会阻止爬虫爬取,并且它也是有自己的爬虫访问接口的。
下面的两个参数表示我们要把爬取的数据写入一个csv文件中,文件的地址是
file:///E:/douban/result/douban.csv
然后打开items.py文件,写入以下内容:

from scrapy import Item, Field


class DoubanItem(Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = Field()
    movieInfo = Field()
    star = Field()
    quote = Field()

这是定义我们爬取的内容列表,你可以理解为像数据库创建表一样,定义每一列的名称。
接下来就是爬虫的主题部分了。
在spiders文件夹下创建一个doubanSpider.py文件,写入以下内容

from scrapy.contrib.spiders import CrawlSpider
from scrapy.http import Request
from scrapy.selector import Selector
from douban.items import DoubanItem


class Douban(CrawlSpider):
    name = 'douban'
    redis_key = 'douban:start_urls'
    start_urls = ['https://movie.douban.com/top250']#起始链接,爬虫的入口链接

    url = 'https://movie.douban.com/top250' #基础链接,构造下一页的时候要用到

    def parse(self, response):
        item = DoubanItem() #实例化Item类,用于保存读取的数据
        selector = Selector(response)
        Movies = selector.xpath('//div[@class="info"]')#选择电影信息区域
        for eachMovie in Movies:
            fulltitle = ''
            title = eachMovie.xpath('div[@class="hd"]/a/span/text()').extract()#这里和lxml.xpath中不同的地方,需要在末尾加上extract()
            for each in title:
                fulltitle = fulltitle + each.strip()
            Info = eachMovie.xpath('div[@class="bd"]/p/text()').extract()
            movieInfo = ''
            for i in Info:
                movieInfo += i.strip()
            star = eachMovie.xpath('div[@class="bd"]/div[@class="star"]/span[2]/text()').extract()
            quote = eachMovie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()').extract()
            if quote:#quote可能是空的,所以要判断一下
                quote = quote[0]
            else:
                quote = ''
            item['title'] = fulltitle
            item['movieInfo'] = movieInfo
            item['star'] = star
            item['quote'] = quote
            yield item  #python生成器,请自行百度yield了解
        nextLink = selector.xpath('//span[@class="next"]/link/@href').extract()#构造下一页的链接
        if nextLink:#判断是否到了最后一页
            nextLink = nextLink[0]
            print(nextLink)
            yield Request(self.url + nextLink, callback=self.parse)#循环访问链接。

代码中给出了比较详细的注释了。就不再讲解了。
接下来我们要运行这个程序。
我们可以在命令行中使用scrapy相关命令运行这个爬虫,不够我选择在pycharm中运行。
在douban主目录下创建main.py文件,写入一下内容:

from scrapy import cmdline

cmdline.execute('scrapy crawl douban'.split())

然后右键main.py文件选择Run 'main'选项,就可以运行了。
这样我们就获得了写有电影信息的douban.csv文件了。
我们选择使用excel打开,跟我在bilibili爬虫那一节中讲的一样,我们需要转换一下编码,不然打开中文是乱码。
打开后,你可能会遇到每一列的顺序不一样。也就是电影名称可能并不是第一行。因为在我们用了一个字典保存信息。然而python的字典是无序的,我们也没有像bilibili那节中制定csv写入的顺序。所以就有可能遇到顺序是乱的情况。
我们需要在spiders目录下新建一个itemCsvExporter.py文件,写入以下内容:

from scrapy.conf import settings
from scrapy.contrib.exporter import CsvItemExporter


class itemCsvExporter(CsvItemExporter):

    def __init__(self, *args, **kwargs):
        delimiter = settings.get('CSV_DELIMITER', ',')
        kwargs['delimiter'] = delimiter

        fields_to_export = settings.get('FIELDS_TO_EXPORT', [])
        if fields_to_export:
            kwargs['fields_to_export'] = fields_to_export

            super(itemCsvExporter, self).__init__(*args, **kwargs)

在setting中添加以下内容:

FEED_EXPORTERS = {
    'csv': 'douban.spiders.itemCsvExporter.itemCsvExporter',
      #douban为你的scrapy项目的名字
}

FIELDS_TO_EXPORT = [
    'title',
    'movieInfo',
    'star',
    'quote'
]

这样就可以按照上面指定的顺序储存信息了。先删除douban.csv文件,再跑一遍程序,再转码后用excel打开。


13330446-4857969e6c65402d.png

可以看到我们的想要的信息已经按照顺序排好了。
不过还有一个问题,每行下都有一个空行。
我们并不需要这个空行。
打开itemCsvExporter.py文件,鼠标选中CsvItemExporter(单击,不要拖动选择),然后按下ctrl+b,打开exporters.py文件,在CsvItemExporter类中新加一行:


image.png

删除douban.csv,跑一遍程序,转码,用Excel打开:
image.png

中间可以看到有些问号,这是html中的空格的转码问题,可以使用字符串的截取功能,我就不实现了。
好了,到这里就完成了。
由于这个爬虫比较简单,前面代码也已经全部贴出来了,我就不放在github上了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容