Python分布式爬虫详解(二)_python的socket编程和分布式爬虫有什么区别

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

上一章Python分布式爬虫详解(一)简单的介绍了什么是分布式爬虫,废话不多说,本章开始从零搭建一个爬取电影天堂电影信息的分布式爬虫。

本章知识点:

a.CrawlSpider爬取电影天堂动作片第一页数据

b.将项目改为RedisCrawlSpider爬虫

一、CrawlSpider爬虫

要想搭建分布式爬虫,我们可以写一个普通的爬虫,然后对其修改,使之成为分布式爬虫。

首先,新建CrawlSpider项目:

scrapy genspider -t crawl dytt_slaver dy2018.com

1、定义爬取字段

import scrapy


class DyttRedisSlaverItem(scrapy.Item):
    # 译名
    name = scrapy.Field()
    # 年代
    year = scrapy.Field()
    # 语言
    language = scrapy.Field()
    # 上映日期
    release_date = scrapy.Field()
    # 评分
    score = scrapy.Field()
    # 文件大小
    file_size = scrapy.Field()
    # 片长
    film_time = scrapy.Field()
    # 简介
    introduction = scrapy.Field()
    # 海报
    posters = scrapy.Field()
    # 下载链接
    download_link = scrapy.Field()

2、定义Rule规则

查看网页源码发现,电影链接为/i/[一串数字].html的形式,但是我们只需要类目中的电影而不需要推荐的电影:

所以:

movie_links = LinkExtractor(allow=r'/i/\d*.html', restrict_xpaths=('//div[@class="co_content8"]'))

    rules = (
        Rule(movie_links, callback='parse_item'),
    )

3、定义提取影片信息规则

观察网页源码,发现页面结构并不是统一的:

有的信息在p标签中包裹,但是也有一些信息在div标签中。而且,由于主演人数不同,标签个数也不确定。所以,用xpath进行提取不是那么的方便了。这种情况就需要选用正则表达式来进行筛选。

观察网页编码,为gb2312

有些小众的电影并没有评分。

所以,筛选规则为:

        str_resp = response.body.decode('gb2312', errors='ignore')
        rep_chars = [' ', '·', '“', '”', '…']
        for rep in rep_chars:
            str_resp = str_resp.replace(rep, '')

        title = re.search(r'◎片  名(.*?)</.+>', str_resp).group(1).replace(u'\u3000', '')
        translation = re.search(r'◎译  名(.*?)</.+>', str_resp).group(1).replace(u'\u3000', '')
        # 名字
        items['name'] = title + "|" + translation
        # 年代
        items['year'] = re.search(r'◎年  代(.*?)</.+>', str_resp).group(1).replace(u'\u3000', '')
        # 评分
        try:
            items['score'] = response.xpath("//strong[@class='rank']/text()").extract()[0].replace(u'\u3000', '')
        except:
            items['score'] = '无评分'
            # 语言
        items['language'] = re.search(r'◎语  言(.*?)</.+>', str_resp).group(1).replace(u'\u3000', '')
        # 上映日期
        items['release_date'] = re.search(r'◎上映日期(.*?)</.+>', str_resp).group(1).replace(u'\u3000', '')
        # 文件大小
        items['file_size'] = re.search(r'◎文件大小(.*?)</.+>', str_resp).group(1).replace(u'\u3000', '')
        # 片长
        items['film_time'] = re.search(r'◎片  长(.*?)</.+>', str_resp).group(1).replace(u'\u3000', '')
        # 简介
        items['introduction'] = re.search(r'◎简  介</.+>\r\n<.+>(.*?)</.+>', str_resp).group(1).replace(u'\u3000', '')
        # 海报
        items['posters'] = response.xpath("//div[@id='Zoom']/*[1]/img/@src").extract()[0]

经测试发现,网站的迅雷下载链接是用js动态生成的。这就要用到selenium了。

from selenium import webdriver

# 下载链接
items['download_link'] = self.get_download_link(response.url)

def get_download_link(self, url):
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')
        driver = webdriver.Chrome(chrome_options=chrome_options)
        driver.get(url)
        link = re.search(r'\"(thunder:.*?)\"',  driver.page_source).group(1)
        driver.close()
        return link

最后,pipelines中保存数据:

class DyttRedisSlaverPipeline(object):
    def __init__(self):
        self.file = open('movie.json', 'w')

    def process_item(self, item, spider):
        content = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(content)
        return item

    def close_spider(self, spider):
        self.file.close()

运行爬虫,得到第一页的30条数据:

二、修改项目为RedisCrawlSpider爬虫

1、首先修改爬虫文件

① RedisCrawlSpider修改很简单,首先需要引入RedisCrawlSpider:

from scrapy_redis.spiders import RedisCrawlSpider

② 将父类中继承的CrawlSpider改为继承RedisCrawlSpider

class DyttSlaverSpider(RedisCrawlSpider):

③ 因为slaver端要从redis数据库中获取爬取的链接信息,所以去掉allowed_domains() 和 start_urls,并添加redis_key

redis_key = 'dytt:start_urls'

④ 增加__init__()方法,动态获取allowed_domains(),[理论上要加这个,但是实测加了爬取的时候链接都被过滤了,所以我没加,暂时没发现有什么影响]

     def __init__(self, *args, **kwargs):
         domain = kwargs.pop('domain', '')
         self.allowed_domains = filter(None, domain.split(','))
         super(DyttSlaverSpider, self).__init__(*args, **kwargs)

2、修改setting文件

① 首先要指定redis数据库的连接参数:

文末有福利领取哦~

👉一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。img

👉二、Python必备开发工具

img
👉三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
img

👉 四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
img

👉五、Python练习题

检查学习结果。
img

👉六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
img

img

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值