Scrapy 爬豆瓣--记录

# -*- coding: utf-8 -*-
import scrapy
import ConfigParser
import re

class MovieSpider(scrapy.Spider):
    download_delay = 1 #防止IP被封,设置爬取时间
    config = ConfigParser.RawConfigParser() #RawConfigParser
    config.read('douban_movie/config.ini') #读取配置文件
    tag = config.get("Section","tag") #读取配置文件中的tag,也就是需要查找的栏目,此处是热门
    limit = int(config.get("Section","limit")) #读取配置文件中的limit,URL中是20
    page = int(config.get("Section","page")) #读取返回的JSON的页数,默认是0
    name = 'movie' #爬虫名称
    allowed_domains = ['movie.douban.com'] #爬取域,设置这个只爬取指定域
    base_urls = "https://movie.douban.com/j/search_subjects?type=movie&tag=%s&sort=recommend&page_limit=%s&page_start=%s"
    start_urls = [base_urls % (tag,limit,page)]

    def parse(self, response):
        from json import loads
        infos = loads(response.body)['subjects'] #把返回的Json转换为字典类型

        for info in infos:
            meta_item = {}
            meta_item['片名'] = info['title'] #取得Json中的影片名字
            meta_item['评分'] = info['rate'] #取得评分信息

            '''把Json中的影片URL传入回调函数,并且把取出的片名和评分传入方便使用'''
            yield scrapy.Request(info['url'],meta={'_meta_item':meta_item},callback=self.parse_page)


        if len(infos) == self.limit: #判断字典长度是否与limit相等,相等则继续,不等爬虫停止
            self.page += self.limit
            url = self.base_urls % (self.tag,self.limit,self.page)

            yield scrapy.Request(url)


    def parse_page(self,response):
        meta_item = response.meta['_meta_item'] #取得传入的片名和评分

        '''取得页面中需要的所有文字信息'''
        infos = response.css('div.subject div#info').xpath('string(.)').extract_first()

        '''提取class为pl的span标签中的所有影片字段,去掉左右空格,替换掉冒号'''
        fields = [s.strip().replace(':','') for s in response.css('div#info span.pl::text').extract()]

        '''使用re.split切割infos'''
        values = [re.sub('\s+','',s.strip()) for s in re.split('\s*(?:%s):\s*' % '|'.join(fields),infos)][1:]

        '''加入字典'''
        meta_item.update(dict(zip(fields,values)))

        yield meta_item

你可能感兴趣的:(Scrapy,scrapy-爬虫,python爬虫)