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

时间:2022-09-18 18:38:03

scrapy 简介

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

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

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

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

scrapy 爬取网页

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

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

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

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

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

2.scrapy 文件结构

Item.py 定义需要抓取并需要后期处理的数据
Python 采用Scrapy爬虫框架爬取豆瓣电影top250

Pipeline.py 用于存放执行后期数据处理的功能,从而使得数据的爬取和处理分开。
Python 采用Scrapy爬虫框架爬取豆瓣电影top250

setting.py 用于配置Scrapy,从而修改user-agent,设定爬取时间间隔,设置代理,配置各种中间件等等。
Python 采用Scrapy爬虫框架爬取豆瓣电影top250

3.需要爬取的内容

首先我们打开豆瓣电影TOP250
Python 采用Scrapy爬虫框架爬取豆瓣电影top250

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

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

from scrapy import Item, Field

class 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 scrapy
from scrapy.spiders import CrawlSpider
from scrapy.http import Request
from scrapy.selector import Selector
from doubanmovie.items import DoubanmovieItem


class 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 cmdline
cmdline.execute("scrapy crawl douban".split())

(6)最终结果
Python 采用Scrapy爬虫框架爬取豆瓣电影top250