03.3.1. 定义爬虫标识
# 定义唯一标识区分爬虫,系统自动生成
name = 'douban'
# 定义域爬取范围
allowed_domains = ['movie.douban.com']
# 定义要爬取的网站
baseurl = 'https://movie.douban.com/top250?start='
# 定义偏移值
offset = 0
# 定义起始的url,系统自动生成,但是需要我们改动进行字符串拼接,方便爬取多页
start_urls = [baseurl + str(offset)]
3.3.2. 获取单条的影片信息
# xpath为response中的方法,可以将xpath表达式直接作用于该函数中
# 思路:爬取任何东西要先获取它变成一个整体(标签),然后一条一条爬取里边信息构建出一个列表
# 例如:[movie_name,movie_link,star,quote]这是一个标签里获取的一条电影信息
# 提醒:这个地方不要想着爬取整个网页然后在区分。
# 例如:[name,name,name,name][link,link,link,link][star,star,star,star] ......
moive_node = response.xpath("//div[@class='item']/div[@class='info']")
# 获取moive_node里每一条电影信息(每个页面会有25个movie_node)
for movie in moive_node:
# 通过xpth获取每个节点的单条电影信息的内容:
# xpath函数返回的为列表,列表中存放的数据为Selector类型的数据,所以返回给我们的是一个对象而不是我们想要的数据
# 我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出
# 影片名称
movie_name = movie.xpath("./div[@class='hd']/a/span[@class='title'][1]/text()").extract()
# 影片连接
movie_link = movie.xpath("./div[@class='hd']/a/@href").extract()
# 影评评分
star = movie.xpath("./div[@class='bd']/div[@class='star']/span[@class='rating_num']/text()").extract()
# 影片引言
quote = movie.xpath("./div[@class='bd']/p[@class='quote']/span[@class='inq']/text()").extract()
# 部分影片没有引言,所以要做判断处理
if quote:
quote = quote[0]
else:
quote = ""
# 将解析到的数据封装至items对象中
item = StudyItem()
# 下面是提取字典中的数据(值)
item['movie_name'] = movie_name[0]
item['movie_link'] = movie_link[0]
item['star'] = star[0]
# 此处注意不要写[0],因为上边判断的时候已经提取了第一个元素如果在取[0]只能取到第一个数字
item['quote'] = quote
# 提交item到管道文件(pipelines.py)
yield item
3.3.3. 获取所有电影信息
# 此处的if应该在for循环外面
# 如果写在for循环里的话就表示每提取一条信息就执行一下if
# 写在外边的话就是当前页面所有信息提取完了再执行下面代码
# 通过页面url分析我们得知最后一页是225但是不能大于等于哦!
if self.offset < 225:
# 通过分析得知步进值为25
self.offset += 25
# 拼接url获取下一页的url
url = self.baseurl + str(self.offset)
# 通过回调函数callback将下一页的url提交给parse再进行电影信息解析提取
# for循环25次,if的代码执行一次
# 注:for里面相当于每个电影,if里面相当于每一页
yield scrapy.Request(url, callback=self.parse)
# 注意:此方案不是最佳方案因为判断条件我写死了(因为豆瓣top250不会进行数据更新,最多250个)
# 思路1:可以通过下一页标签用xpath提取下一页,进行url拼接,然后再传递url
# 需要判断什么情况下下一页是灰色,例如://a[[url=home.php?mod=space&uid=341152]@Class[/url] = next] == 0的时候
# 还要注意第一页的上一页也是灰色,所以判断要满足某两个条件才行
# 思路2: 可以通过获取当前网站的总页数来进行数据爬取