抓取的内容:电影的title,director,评分,名言和详情页的电影简介,一共爬取五个内容。涉及主页的爬取和详情页的爬取。用scrapy可以很简单的实现这次爬取。
此次涉及 的除了scrapy框架外还有正则表达式的编写等知识。
豆瓣250 之前也爬取过,用的selenium自动化,这次用scrapy爬取一次,用于scrapy的初探
首先建立一个project:
scrapy startproject doubanmovie
接下来建立一个爬虫文件:
scrapy genspider doubanspider douban.com
接下来就是正式编写爬虫了。
主体 doubanspider.py 文件了
# _*_ coding:utf-8 _*_
import scrapy
from scrapy.selector import Selector
from doubanmovie.items import DoubanmovieItem
class MovieSpider(scrapy.Spider):
name = "Douban"
start_urls = [
'https://movie.douban.com/top250?start=0&filter='
]
def parse(self,response):
lis = response.xpath('.//div[@class="article"]/ol[@class="grid_view"]/li')
for li in lis:
# 创建一个item实例
item = DoubanmovieItem()
title = li.xpath('.//div[@class="hd"]/a/span/text()').get()
# 这个*[\u4e00-\u9fa5]*是匹配汉字的正则表达式
director = li.xpath('.//div[@class="bd"]/p[1]/text()').re('([\u4e00-\u9fa5]?·?[\u4e00-\u9fa5]+?)\s')[0]
# 用正则提取上映时间,由于是提取出来是一个list,所以用join方法,组成一个字符串
time_list = li.xpath('.//div[@class="bd"]/p[1]/text()').re('\d+?')
time = ''.join(time_list)
rate = li.xpath('.//span[@class="rating_num"]/text()').get()
quote = li.xpath('.//p[@class="quote"]/span/text()').get()
detail_link = li.xpath('.//div[@class="hd"]/a/@href').get()
# 因为有几部电影没有名言,所以这里加了一个if判断
item['title'] = title
item['director'] = director
item['time'] = time
item['rate'] = rate
if quote:
item['quote'] = quote
request = scrapy.Request(url=detail_link,meta={"key":item},callback=self.parse_detail)
# yield关键字其实相当于一个return,每次调用都返回它后面的变量
yield request
next_page = response.xpath('//span[@class="next"]/a/@href')
# 对页面进行的一个循环,通过回调parse函数,对每个主页都执行一个parse方法
if next_page is not None:
yield response.follow(next_page, callback=self.parse)
def parse_detail(self,response):
# 回调函数中有一个response.meta方法可以取之前传递进来的值
item = response.meta['key']
sele = Selector(response)
short = sele.xpath('.//div[@id="link-report"]/span[1]/text()').extract_first()
item['short'] = short
yield item
还有 setting.py,pipelines.py,items.py文件的设置什么的都和上一篇一样,并没有很复杂的设置。
作者:killeri
来源:优快云
原文:https://blog.youkuaiyun.com/killeri/article/details/80214177