scrapy_redis分布式爬取电影信息及下载链接保存入sql server数据库

#进行分布式爬取,首先在setting中添加scrapy-redis的相关配置

#########***************进行分布式爬取,首先在配置文件中添加scrapy-redis的相关配置
BOT_NAME = 'Movies_example'

SPIDER_MODULES = ['Movies_example.spiders']
NEWSPIDER_MODULE = 'Movies_example.spiders'
FEED_EXPORT_FIELDS=['movietype','moviename','moviepicture','movieinformation','mvurl']

####指定爬虫所使用的redis数据库
REDIS_HOST='localhost'
REDIS_PORT='6379'
REDIS_PARAMS = {
'password': '**',
}
# ####使用scrapy-redis的调度器替代scrapy原版调度器
SCHEDULER="scrapy_redis.scheduler.Scheduler"

# ####使用scrapy-redis的RFPDupeFilter作为去重过滤器
DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"


###将爬取到的数据汇总到sql server数据库中
ITEM_PIPELINES={
    'Movies_example.pipelines.SqlTablePipeline':301,}
####爬虫停止后,保留/清理redis中的请求队列及去重集合
#True:保留   ,False:清理,默认为True
SCHEDULER_PERSIST=False

#爬取主程序

# -*- coding: utf-8 -*-
from scrapy import Request
from ..items import MoviesExampleItem
from scrapy_redis.spiders import RedisSpider
import re
class MoviesSpider(RedisSpider):
    name = 'movies'
    allowed_domains = ['www.66ys.tv']
    redis_key = "Movies"
    def parse(self, response):
        #获取每个类型的url
        movietypes=['喜剧片','动作片','爱情片','科幻片','恐怖片','战争片','纪录片','剧情片','3D电影',
                       '国产剧','港台剧','日韩剧','欧美剧','国配电影','综艺']
        type_urls=response.css('div.menutv').xpath('./ul/li/a/@href').extract()
        for i in range(1,len(type_urls)):
            #返回的是当前类型的第一页
            yield Request(type_urls[i],dont_filter=True,callback=self.now_movie_type,meta={'类型':movietypes[i-1],

                                                              '首页链接':type_urls[i]})
    #获得当前类型电影的总页数,并循环访问每一页的电影
    def now_movie_type(self,response):
        #链接结尾是html的类型
        types=['喜剧片','动作片','爱情片','科幻片','恐怖片','战争片','纪录片']
        #当前类型
        nowtype=response.meta['类型']
        base_url=response.meta['首页链接']
        if nowtype in types:
            # 获取当前类别总页数
            page_urls = response.css('div.pagebox').xpath('./a/@href')
            pageall = int(page_urls[len(page_urls) - 1].re('.*?/index_(\d+).html')[0])
            for page in range(1, pageall + 1):
                if page == 1:
                    yield Request(base_url, dont_filter=True, callback=self.list_parse, meta={'类型': nowtype})
                else:
                    pageurl = base_url + '/index_' + str(page) + '.html'
                    yield Request(pageurl, dont_filter=True, callback=self.list_parse, meta={'类型': nowtype})
        else:
            # 获取当前类别总页数
            page_urls = response.css('div.pagebox').xpath('./a/@href')
            pageall = int(page_urls[len(page_urls) - 1].re('.*?/index_(\d+).htm')[0])
            for page in range(1, pageall + 1):
                if page == 1:
                    yield Request(base_url, dont_filter=True, callback=self.list_parse, meta={'类型': nowtype})
                else:
                    pageurl = base_url + '/index_' + str(page) + '.htm'
                    yield Request(pageurl, dont_filter=True, callback=self.list_parse, meta={'类型': nowtype})

    #获得该页下的电影列表,并获取列表下电影的链接,进入该电影链接
    def list_parse(self,response):
        nowtype = response.meta['类型']
        pageurls = response.css('div.listimg').xpath('./a/@href').extract()
        for url in pageurls:
            yield Request(url, dont_filter=True,callback=self.movie_parse, meta={'类型': nowtype})

    #获得单独一个电影的信息
    def movie_parse(self,response):
        #电影名
        name=response.css('div.contentinfo').xpath('./h1/text()').extract_first().strip()
        #电影海报链接
        image=response.css('div#text').xpath('./p/img/@src').extract_first().strip()
        #电影简介信息(将多个简介连成一个)
        mvdesc = response.xpath('//*[@id="text"]/p/text()')  # /p[2]/text()
        desc = ""
        for p in mvdesc:
            desc = desc+p.extract().strip().encode('unicode-escape').decode('string_escape')+' '
        desc = desc.replace('\\u3000', ' ')
        info=desc.decode("unicode-escape")
        #电影下载链接
        ##判断影片是否有两个table属性
        urls = response.xpath('//*[@id="text"]/table').xpath('./tbody/tr/td/a').extract()
        mvurls=[]
        for item in urls:
            url1=re.compile('href="(ftp:\/\/.*?)"').findall(item)
            url2=re.compile('href="(thunder:\/\/.*?)"').findall(item)
            url3 = re.compile('href="(ed2k:\/\/.*?)"').findall(item)
            if url1:
                 mvurls.append(url1)
            if url2:
                 mvurls.append(url2)
            if url3:
                 mvurls.append(url3)
        #存储数据
        moviesInfoitem=MoviesExampleItem()
        moviesInfoitem['movietype']=response.meta['类型'].decode('utf-8')
        moviesInfoitem['moviename']=name
        moviesInfoitem['moviepicture']=image
        moviesInfoitem['movieinformation']=info
        if mvurls:
            moviesInfoitem['mvurl']=mvurls[0]
        else:
            moviesInfoitem['mvurl']=None
        yield moviesInfoitem

#保存入数据库

# -*- coding: utf-8 -*-
from openpyxl import Workbook

class MoviesExamplePipeline(object):
    def process_item(self, item, spider):
        return item
class SqlTablePipeline(object):
    import pymssql
    server = "**"  # 连接服务器地址
    user = "**"  # 连接帐号
    password = "**"  # 连接密码
    conn = pymssql.connect(server, user, password, "**")  # 获取连接
    cursor = conn.cursor()  # 获取光标
    def __init__(self):
        # 创建表
        self.cursor.execute("""
            IF OBJECT_ID('Moviess','U')IS NOT NULL
                DROP TABLE Moviess
            CREATE TABLE Moviess (
                Movietype VARCHAR(max) NOT NULL,
                Moviename VARCHAR(max) NOT NULL,
                ImageUrl VARCHAR(max),
                MovieIntroduce VARCHAR(max),
                DownloadUrl VARCHAR(max)
            )
            """)
    def process_item(self, item, spider):
        # 插入获得的数据
        self.cursor.executemany(
            "INSERT INTO Moviess VALUES (%s, %s, %s,%s,%s)",
            [(item['movietype'],item['moviename'],item['moviepicture'],item['movieinformation']
              ,item['mvurl'])])
        # 调用 commit() 来保持你数据的提交如果你没有将自动提交设置为true
        self.conn.commit()
        return item
    def close_spider(self, spider):
        self.conn.close()

#爬取结果展示

每列分别为:类型、名称、海报链接、简介、下载链接。

进行scrapy_redis分布式爬取的步骤是:

1、首先在cmd中登录本机中的Redis数据库

2、然后运行python程序

3、最后在cmd中输入lpush key(在scrapy项目中输入的redis_key的名字) '***'(起始爬取地址)

输入完起始爬取地址后python程序将执行分布式爬取。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
已解决的问题:(2003/12/04) 1、不用EMAIL注册时,注册后会员密码为空 2、不能直接在后台修改管理员帐号及密码 3、可以在线播放WMV的电影了(之前只能播放RM格式的) 不好意思,由于本人的时间有限,所以不能很全面地进行测试,如果大家在使用 中发现有什么BUG的话,欢迎发EMAIL给我,我会及时修正的,谢谢!:) ********************************** 新增功能:(2003/11/30) 1、免费支持在线支付功能(详细安装说明请看相关目录里的说明文件) 2、增加投票功能(使用说明请看下面安装说明) ********************************** 新增功能:(2003/11/29) 一、关于后台订单程序的完善: 1、成交确认后的订单仍然保留,不会消失,这样可以方便查看历史交易 2、可以查看成交确认与未确认的订单 3、可以按**期查询或者删除订单(包括成交查询、未成交查询) 4、显示所购买的会员等级及金钱数 5、自动统计当前页面订单的总金额(如果按**期查询一个月的话,此功能就可以 方便显示当月所得的交易金额了) 6、只要提交了订单后,将不能再进行第二次提交,可以防止一人恶意提交多个订单 7、当会员的期限到后,即自动可以再次提交订单 8、如果提交的订单被删除了(如提交后一直没汇款过来,就要删除此订单了),那 此会员也自动可以再次提交订单 9、自动处理订单交易,即只要收到汇款,在后台按下“确认”,即可以给此会员增 加订单里相应的会员等级与会员期限,不必再次手动为会员增加 10、将用户查询功能改为“模糊”查询,以方便管理员使用 11、完善了提交订单后的提示页面与信息,更方便会员了解自己订单的情况(要更改 相关信息,请修改buyserver.asp文件) 二、其他方面的功能及改进: 1、增加了注册时以EMAIL自动发送密码的功能,防止一人注册多个帐号(修改方法见上面安装说明) 2、修正了后台管理里的EMAIL通知与回复会员的功能(修改方法见上面安装说明) 3、首页公告显示改为自动滚屏,可以显示更多的公告 4、后台管理里加上了“电影评论”修改的连接,并加上了查看只有评论的电影 5、在电影介绍页面里加上了“电影评论”查看及发表的连接 6、会员管理里增加了以EMAIL查询会员和显示未登录会员的功能 7、在首页增加了动网论坛登录口 8、首页新片推荐改为了翻页式,可以显示更多新推荐电影 9、在会员资料管理里,增加了直接修改会员所得佣金功能,管理员可自行修改某会员的佣金 10、在会员资料管理里,增加了显示会员登录时的IP 11、改善了会员继费功能,可让会员有更多的选择 12、后台电影管理里,增加了“模糊”查询电影功能,方便管理员查找某一部电影进行修改 13、后台增加了可添加在线观看电影服务器功能,此功能非常方便,可以做到只添加 一个地址就同时实现下载与在线观看的功能哦! ********************************************************************* 安装使用说明: 1、在MSSQL里建立一个数据库数据库名自己起吧 2、将imovie.sql文件用MSSQL查询器运行到你刚建立的数据库里 3、导imovie.mdb文件 4、修改articleconn.asp 和 user/conn.asp 文件里的数据库连接参数 5、将所有文件上传至你的**上,然后运行default.asp即可! 6、后台登录地址:你的**/login.asp 登录名和密码均是:admin 7、在进后台管理前请修改oklu.asp文件,改为你网站的地址,否则一些后台功能将不能使用 9、要使用邮件发送功能请修改sendmail.asp文件,修改的地方有: __________________________________________________________ 找到以下代码,改相应的参数即可:(此功能需服务器支持:JMAIL系统) smtpserver ="邮局服务器地址(IP)" smtpuser ="你的EMAIL登录帐号(如:webmaster@i-movie.cn)" smtppwd ="你的EMAIL登录密码" __________________________________________________________ 10、关于会员注册时使用邮件发密码的修改: ___________________________________________________________ 修改user/joinserver.asp文件 (1)修改你网站的欢迎信息方法,找到以下代码进行修改: ---------------------------------------------------------- mailb0="恭喜您 " mailb00=" 成为我们的会员,以下是您的密码:<br><br>" mailb1="您的密码是:" mailb2="<br><br>建议尽快登录并自行更改此密码!" mailb3="<br><br>爱视网:http://www.i-movie.cn" mailb4="<br><br>爱视论坛:http://bbs.i-movie.cn" ---------------------------------------------------------- (2)修改邮件发送服务器,找到以下代码进行修改:(此功能需服务器支持:JMAIL系统) ---------------------------------------------------------- frommail ="webmaster@i-movie.cn"      --改为你的EMAIL地址 tomail = email (这句不要改) mailsubject ="爱视网:恭喜您注册成功!"  --改为你的邮件主题 mailbody = mailb0 request("userid") mailb00 mailb1 radpass mailb2 mailb3 mailb4(这句不要改) smtpserver ="邮局IP"     --改为你邮局服务器的IP smtpuser ="webmaster@i-movie.cn" --改为你的EMAIL帐号 smtppwd ="123456" --改为你EMAIL的登录密码 ---------------------------------------------------------- 7、要改首页的LOGO,请修改home.asp文件 8、如果有会员在会员期没到时又想升级另下订单的话,请直接修改会员个人资料里的“付款状态”   将里面的数字清空即可再次提交订单了,这里的数字说明如下:  付款状态=" "(空)  即未提交订单  付款状态=0   提交了订单,但未得到确认(不能再提交了)  付款状态=1       提交了订单,并已得到确认(不能再提交了) 9、考虑到有些朋友的**可能不支持邮件发送功能,因此同时提供了不用EMAIL注册的文件,只要将   《不用EMAIL注册》目录里的2个文件复盖掉USER目录里的即可! 10、投票系统的使用: (1)登录vote/admin.asp进行新的投票设置(管理帐号密码均是:admin) (2)建立新投票后,会得到一段代码,将此代码COPY到default.asp文件里 (3)修改default.asp文件的方法: --------------------------------------------------------------- 找到以下代码: <object type="text/x-scriptlet" width="145" height="200" data="/vote/SHOWVOTE.ASP"></object> 将以上代码改为你在新建投票时所得到的代码即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值