简介
网站为:https://movie.douban.com/top250
假设,我们抓取top250电影的序列号,电影名,介绍,星级,评价数,电影描述选项
实例
新建项目
在开始爬取之前,您必须创建一个新的Scrapy
项目。 进入您打算存储代码的目录中,运行下列命令:
scrapy startproject douban
scrapy.cfg: 项目的配置文件;(用于发布到服务器)
tutorial/: 该项目文件夹。之后将在此编写Python代码。
tutorial/items.py: 项目中的item文件;(定义结构化数据字段field).
tutorial/pipelines.py: 项目中的pipelines文件;(用于存放执行后期数据处理的功能,定义如何存储结构化数据)
tutorial/settings.py: 项目的设置文件;(如何修改User-Agent,设置爬取时间间隔,设置代理,配置中间件等等)
tutorial/spiders/: 放置spider代码的目录;(编写爬取网站规则)
定义Item
Item 定义结构化数据字段,用来保存爬取到的数据;其使用方法和python字典类似。可以通过创建一个 scrapy.Item
类, 并且定义类型为 scrapy.Field
的类属性来定义一个Item。
import scrapy
class DoubanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 序列号
number = scrapy.Field()
# 电影名
movie_name = scrapy.Field()
# 介绍
introduce = scrapy.Field()
# 星级
star = scrapy.Field()
# 评价数
evaluate = scrapy.Field()
# 描述
describe = scrapy.Field()
pass
爬虫(Spider)
Spider是开发者编写用于从单个网站(或者一些网站)爬取数据的类。创建一个Spider,必须继承 'scrapy.Spider' 类, 需要定义以下三个属性:
- name:spider名字,必须是唯一的
- start_urls:初始的URL列表
- parse(self, response):每个初始URL完成下载后被调用。
这个函数要完成的功能:
1.负责解析返回的网页数据(response.body),提取结构化数据(生成item)
2.生成需要下一页的请求URL。
以下为我们的第一个Spider代码,保存在 douban/spiders 目录下的 douban.py 文件中:
代码语言:javascript复制from douban.items import DoubanItem
import scrapy
class DoubanSpider(scrapy.Spider):
name = 'douban' # spider名字,必须是唯一的
# 允许的域名
allowed_domains = ['movie.douban.com']
# 入口URL
start_urls = ['https://movie.douban.com/top250'] # 初始的URL列表
# 这个函数要完成的功能:
# 1.负责解析返回的网页数据(response.body),提取结构化数据(生成item)
# 2.生成需要下一页的请求URL。
def parse(self, response): # 每个初始URL完成下载后被调用
movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']/li")
# 循环电影的条目
for i_item in movie_list:
# 导入item,进行数据解析
douban_item = DoubanItem()
douban_item['number'] = i_item.xpath(".//div[@class='item']//div[@class='pic']//em/text()").extract_first()
douban_item['movie_name'] = i_item.xpath(".//div[@class='item']//div[@class='info']//div[@class='hd']/a/span[1]/text()").extract_first()
# 如果文件有多行进行解析
content = i_item.xpath(".//div[@class='item']//div[@class='info']//div[@class='bd']/p[1]/text()").extract()
for i_content in content:
content_s = "".join(i_content.split())
douban_item['introduce'] = content_s
douban_item['star'] = i_item.xpath(".//span[@class='rating_num']/text()").extract_first()
douban_item['evaluate'] = i_item.xpath(".//div[@class='star']//span[4]/text()").extract_first()
douban_item['describe'] = i_item.xpath(".//p[@class='quote']/span/text()").extract_first()
print(douban_item)
yield douban_item
# 解析下一页,取后一页的XPATH
next_link = response.xpath("//span[@class='next']/link/@href").extract()
if next_link:
next_link = next_link[0]
yield scrapy.Request("https://movie.douban.com/top250" next_link, callback=self.parse)
爬取内容
进入项目的根目录,执行下列命令启动spider:
代码语言:javascript复制在命令行输入:
scrapy crawl douban -o 豆瓣电影Top250.json
或者
scrapy crawl douban -o 豆瓣电影Top250.csv