# -*- 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 爬豆瓣--记录
最新推荐文章于 2025-03-11 23:01:11 发布