在 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)