scrapy 框架
框架: 软件半成品, 基础的部分不用自己写, 直接用
目标站点 https://movie.douban.com/top250
pip install scrapy
创建scrapy项目
scrapy startproject spider_douban
下面来简单介绍一下各个主要文件的作用:
> scrapy.cfg :项目的配置文件
spider_douban包:项目的Python模块,将会从这里引用代码
spider_douban/items.py :项目的目标文件
spider_douban/pipelines.py :项目的管道文件
spider_douban/settings.py :项目的设置文件
spider_douban/spiders/ :存储爬虫代码目录
明确目标(items.py)
我们打算抓取:https://movie.douban.com/top250信息
-
打开spider_douban目录下的items.py
-
Item 定义结构化数据字段,用来保存爬取到的数据,有点像Python中的dict,但是提供了一些额外的保护减少错误。
-
可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field的类属性来定义一个Item。
接下来,创建一个SpiderDoubanItem 类和构建item模型(model)
- items.py
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class SpiderDoubanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 序号
serial_number = scrapy.Field()
# 电影名称
movie_name = scrapy.Field()
# 电影介绍
introduce = scrapy.Field()
# 电影 星级
star = scrapy.Field()
# 电影评价人数
evalute = scrapy.Field()
# 电影描述
describe = scrapy.Field()
爬虫功能要分成两步
1.爬数据
切换到 C:\Users\Eric\Documents\GitHub\mysqlandPython\day14\spider_douban\spider_douban执行
scrapy genspider douban250 movie.douban.com
scrapy genspider 生成一个爬虫项目, 后面第一个参数douban250是会在spiders包中自动生成的一个py文件, 第二个参数是movie.douban.com是爬取目标站点的二级域名
修改start_url
修改parse方法
def parse(self, response):
print(response.text)
执行爬虫命令
scrapy crawl douban250 # douban250就是name的名字
在setting.py中添加请求头(第19行)
重新执行
scrapy crawl douban250
可以在后台看到数据
为避免频繁输入命令可以创建main.py
from scrapy import cmdline
cmdline.execute('scrapy crawl douban250'.split())
第一版
# -*- coding: utf-8 -*-
import scrapy
from spider_douban.items import SpiderDoubanItem
class Douban250Spider(scrapy.Spider):
# 继承scrapy.Spider,这里是爬虫名字,不能和项目名字重复
name = 'douban250'
# 允许的域名
allowed_domains = ['movie.douban.com']
# 入口 url,扔到调度器里面
start_urls = ['https://movie.douban.com/top250']
# 默认解析方法
def parse(self, response):
movie_list = response.xpath('//div[@id="content"]//ol/li')
print(len(movie_list))
for i_item in movie_list:
douban_item = SpiderDoubanItem()
douban_item['movie_name'] = i_item.xpath('div[@class="item"]/div[@class="info"]/div[@class="hd"]/a/span[1]/text()').extract_first()
print(douban_item)
# 序号
# 电影介绍
# 电影 星级
# 电影评价人数
# 电影描述
yield douban_item #
# 不进行 yield 无法进入 pipelines 里面,将获取的数据交给pipelines
# 解析下一页
next_link = response.xpath('//span[@class="next"]/link/@href').extract()
# 如果有就一直取下一页
if next_link:
next_link = next_link[0]
# 将获取的数据交给pipelines
# 第一个参数是下一页的链接, 第二个参数是回调函数 的名字
yield scrapy.Request('https://movie.douban.com/top250'+next_link, callback=self.parse)
在main.py中修改
from scrapy import cmdline
cmdline.execute('scrapy crawl douban250 -o douban.csv'.split())