最后
🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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条数据:
![](https://img-blog.csdn.net/2018102016063434?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
**二、修改项目为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数据库的连接参数:
REDIS_HOST = ‘192.168.0.131’
REDIS_PORT = 6379
② 指定使用`scrapy-redis`的调度器
SCHEDULER = “scrapy_redis.scheduler.Scheduler”
③ 指定使用`scrapy-redis`的去重
DUPEFILTER_CLASS = ‘scrapy_redis.dupefilter.RFPDupeFilter’
④ 指定排序爬取地址时使用的队列
# 默认的 按优先级排序(Scrapy默认),由sorted set实现的一种非FIFO、LIFO方式。
SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.SpiderPriorityQueue’
# 可选的 按先进先出排序(FIFO)
# SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.SpiderQueue’
# 可选的 按后进先出排序(LIFO)
# SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.SpiderStack’
⑤ 设置断点续传,也就是不清理redis queues
SCHEDULER_PERSIST = True
⑥ 默认情况下,`RFPDupeFilter`只记录第一个重复请求。将`DUPEFILTER_DEBUG`设置为`True`会记录所有重复的请求。
DUPEFILTER_DEBUG =True
⑦ 配置`RedisPipeline`将`item`写入`key`为 `spider.name : items` 的redis的list中,供后面的分布式处理item
ITEM_PIPELINES = {
‘dytt_redis_slaver.pipelines.DyttRedisSlaverPipeline’: 300,
‘scrapy_redis.pipelines.RedisPipeline’: 400
}
3、增加爬虫信息字段(可选)
由于会有多个slaver端,所以可加一个爬虫名字的字段和时间字段来区分是哪个爬虫在什么时间爬到的信息。
① item中增加字段
# utc时间
crawled = scrapy.Field()
# 爬虫名
spider = scrapy.Field()
② pipelines中新增类:
class InfoPipeline(object):
def process_item(self, item, spider):
#utcnow() 是获取UTC时间
item[“crawled”] = datetime.utcnow()
# 爬虫名
item[“spider”] = spider.name
return item
③ setting中设置ITEM\_PIPELINES
ITEM_PIPELINES = {
‘dytt_redis_slaver.pipelines.DyttRedisSlaverPipeline’: 300,
‘dytt_redis_slaver.pipelines.InfoPipeline’:350,
‘scrapy_redis.pipelines.RedisPipeline’: 400
}
至此,项目修改完毕,现在可以爬取某一分类下的第一页的电影信息。
以Windows10为slaver端运行一下:
![](https://img-blog.csdn.net/20181020160653715?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
因为请求队列为空,所以爬虫会停下来进行监听,直到我们在Master端给它一个新的连接:
![](https://img-blog.csdn.net/20181020160703412?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
爬虫启动,开始爬取信息:
![](https://img-blog.csdn.net/2018102016071226?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。
我先来介绍一下这些东西怎么用,文末抱走。
* * *
**(1)Python所有方向的学习路线(新版)**
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/8fc093dcfa1f476694c574db1242c05b.png)
**(2)Python学习视频**
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
![在这里插入图片描述](https://img-blog.csdnimg.cn/d66e3ad5592f4cdcb197de0dc0438ec5.png#pic_center)
**(3)100多个练手项目**
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
![在这里插入图片描述](https://img-blog.csdnimg.cn/f5aeb4050ab547cf90b1a028d1aacb1d.png#pic_center)
**(4)200多本电子书**
这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
**(5)Python知识点汇总**
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。
![在这里插入图片描述](https://img-blog.csdnimg.cn/c741a91b05a542ba9dc8abf2f2f4b1af.png)
**(6)其他资料**
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。
![在这里插入图片描述](https://img-blog.csdnimg.cn/9fa77af248b84885a6ec779b2ead064d.png)
**这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**