在 movie 的setting中,会有spider这个类,里面有种子url以及解析
import scrapy
from douban.items import MovieItem
class MovieSpider(scrapy.Spider):
name = 'movie'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
item = MovieItem()
要想保存数据,就得定义模型
import scrapy
class MovieItem(scrapy.Item):
title = scrapy.Field()
score = scrapy.Field()
motto = scrapy.Field()
现在开始继续写我们的spider,里面的xpath可以打开浏览器的开发者工具copy里面的代码, 如下图所示:
response.xpath('//*[@id="content"]/div/div[1]/ol/li')
这时候测试的时候(命令行输入scrapy shell https://movie.douban.com/top250)会发现出现403错误,我们就回到setting里面设置我们的爬虫:
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' \
'Chrome/27.0.1453.94 Safari/537.36'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
运行成功后,我们开始写爬虫的结构,要拿到电影的三个属性,titel,score,motto,如果直接copy,xpath地址为
//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[2]/p[2]/span
我们只需要后面的那截地址,即:
div/div[2]/div[1]/a/span[1]/text()
class MovieSpider(scrapy.Spider):
name = 'movie'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
# 解析页面
li_list = response.xpath('//*[@id="content"]/div/div[1]/ol/li')
for li in li_list:
item = MovieItem()
# 电影名字,肖申克救赎
item['title'] = li.xpath('div/div[2]/div[1]/a/span[1]/text()').extract_first()
# 评分, 9.6
item['score'] = li.xpath('div/div[2]/div[2]/div/span[2]/text()').extract_first()
# 说明,'希望让人自由'
item['motto'] = li.xpath('div/div[2]/div[2]/p[2]/span/text()').extract_first()
yield item
现在我们在terminal里面输入scrapy crawl movie就可以简单的开始爬取前25个电影:
现在我们来爬取top250页全部电影,即除了爬取电影,还要爬取翻页的超链接, 可以看到href都是以‘ ?start’开始的:
所以我们接着写:
# 带href的 a 标签, ::attr("href")即取出属性是href--超链接
href_list = response.css('a[href]::attr("href")').re('\?start=.*')
for href in href_list:
# 将超链接补完整
url = response.urljoin(href)
# 返回request 对象,给一个新的url,处理完url还是执行parse方法
yield scrapy.Request(url=url, callback=self.parse)