Python 采用Scrapy爬虫框架爬取豆瓣电影top250

来源:互联网 发布:网络规划师通过率 编辑:程序博客网 时间:2024/04/30 03:51

scrapy 简介

这里写图片描述

在此,默认已经安装好Scrapy,如果没有安装可以到scrapy 官网下载安装。

注意: 在安装Scrapy之前首先需要安装一下python第三方库:(安装方法并不在本文讲解范围,请自行了解)

这里写图片描述

scrapy 爬取网页

scrapy 不同于简单的单线程爬虫,采用scrapy
框架写python爬虫需要生成许多个文件,这一件类似于java里面的web框架,许多工作都可以通过一些配置文件来完成。

##1.通过命令行方式生成一个Scrapy project:

这里写图片描述

在安装有Python环境的window主机下,打开命令窗口,通过 scrapy startproject doubanTest
就是可以生成一个Scrapy project。project的文件结构如下:

这里写图片描述

2.scrapy 文件结构

Item.py 定义需要抓取并需要后期处理的数据
这里写图片描述

Pipeline.py 用于存放执行后期数据处理的功能,从而使得数据的爬取和处理分开。
这里写图片描述

setting.py 用于配置Scrapy,从而修改user-agent,设定爬取时间间隔,设置代理,配置各种中间件等等。
这里写图片描述

3.需要爬取的内容

首先我们打开豆瓣电影TOP250
这里写图片描述

我们需要爬取的是上图中用红色方框框出的几项网页信息,包括电影名、电影介绍、评分、评论人数、经典的话。通过查看源码我们可以找到对应的位置,这里不详述,详见code。

4.code分析
(1)Item.py
上面提到了Item的功能,就是定义要抓取的数据

from scrapy import Item, Fieldclass DoubanmovieItem(Item):    title = Field()#电影名    movieInfo = Field()#电影介绍    star = Field()#评分    critical = Field()#评分人数    quote = Field()#经典的话

(2)pipline.py
这里我们没有对Item中的数据做特殊处理,所以采用默认代码

class DoubanmoviePipeline(object):    def process_item(self, item, spider):        return item

(3)setting.py

BOT_NAME = 'doubanmovie'SPIDER_MODULES = ['doubanmovie.spiders']NEWSPIDER_MODULE = 'doubanmovie.spiders'#设置代理,有些网站是反爬虫,所以要将其伪装成浏览器USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5'# Crawl responsibly by identifying yourself (and your website) on the user-agent# USER_AGENT = 'doubanmovie (+http://www.yourdomain.com)'FEED_URI = u'file:///F:/douban.csv'#文件保存路径FEED_FORMAT = 'CSV'#保存为CSV文件

(4)爬虫主程序
在生成的项目文件下,有一个spiders目录,这里就是放置我们爬虫主程序的地方,在这个文件下生成一个python文件,也就是我们要实现的功能

# -*- coding: utf-8 -*-import scrapyfrom scrapy.spiders import CrawlSpiderfrom scrapy.http import Requestfrom scrapy.selector import Selectorfrom doubanmovie.items import DoubanmovieItemclass Douban(CrawlSpider):  # Douban是一个类,继承自CrawlSpider    name = "douban"  # 爬虫命名    start_urls = ['http://movie.douban.com/top250']  # 要爬取的页面地址    #url = 'http://movie.douban.com/top250'    def parse(self, response):        # print response.body        item = DoubanmovieItem()        selector = Selector(response)        Movies = selector.xpath('//div[@class="info"]')        for eachMoive in Movies:            title = eachMoive.xpath('div[@class="hd"]/a/span/text()').extract()            fullTitle = ''            for each in title:                fullTitle += each            movieInfo = eachMoive.xpath('div[@class="bd"]/p/text()').extract()            star = eachMoive.xpath('div[@class="bd"]/div[@class="star"]/span/text()').extract()[0]            critical = eachMoive.xpath('div[@class="bd"]/div[@class="star"]/span/text()').extract()[1]            quote = eachMoive.xpath('div[@class="bd"]/p[@class="quote"]/span/text()').extract()            # quote可能为空,因此需要先进行判断            if quote:                quote = quote[0]            else:                quote = ''            item['title'] = fullTitle            item['movieInfo'] = ';'.join(movieInfo)            item['star'] = star            item['critical'] = critical            item['quote'] = quote            yield item  # 提交生成csv文件        nextLink = selector.xpath('//span[@class="next"]/link/@href').extract()        # 第10页是最后一页,没有下一页的链接        if nextLink:            nextLink = nextLink[0]            print nextLink            yield Request(self.url + nextLink, callback=self.parse)            # 递归将下一页的地址传给这个函数自己,在进行爬取

(5)运行爬虫
不同于简单单线程爬虫程序直接运行,这里我们还需要通过一个main.py来运行,需要自己手动生成,main.py代码如下:

from scrapy import cmdlinecmdline.execute("scrapy crawl douban".split())

(6)最终结果
这里写图片描述

0 0
原创粉丝点击