Scrapy加Redis加IP代理池实现音乐爬虫
音乐爬虫
关注公众号“轻松学编程”了解更多。
目的:爬取歌名,歌手,歌词,歌曲url。
一、创建爬虫项目
创建一个文件夹,进入文件夹,打开cmd窗口,输入:
scrapy startproject songSpider
依次输入:
cd songSpider
scrapy genspider kuwo_spider kuwo.cn
在路径songSpider\songSpider\spiders\下多了一个文件kuwo_spider.py。
二、定义items.py中的字段名
import scrapy
class SongspiderItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field() # 歌名
singer = scrapy.Field() # 歌手
lyric = scrapy.Field() # 歌词
url = scrapy.Field() # 能拿到音乐文件的url
originId = scrapy.Field() # 来源
在Mysql数据库中建立一个表,表中的字段与上面的一样,方便接下来把数据保存进数据库(持久化)。
三、修改settings.py中的内容
ROBOTSTXT_OBEY = False
#使用代理
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
}
#使用管道把item保存进数据库
ITEM_PIPELINES = {
'songSpider.pipelines.SongspiderPipeline': 300,
}
四、修改pipelines.py
#保存进MySQL数据库
import pymysql
class SongspiderPipeline(object):
def __init__(self):
#连接数据库
self.conn = None
#游标
self.cur = None
# 打开爬虫时调用,只调用一次
def open_spider(self,spider):
self.conn = pymysql.connect(host='127.0.0.1',
user='root',
password="123456",
database='songSearch',
port=3306,
charset='utf8')
self.cur = self.conn.cursor()
def process_item(self, item, spider):
clos,value = zip(*item.items())
# print('sql语句',sql,value)
query_sql = f"""select sid from Song where name='{value[0]}'
and singer='{value[1]}'and originId={value[4]} """
# 如果歌曲已存在就不执行sql
if not self.cur.execute(query_sql):
sql = "INSERT INTO `%s`(%s) VALUES (%s)" % ('Song',
','.join(clos),
','.join(['%s'] * len(value)))
self.cur.execute(sql, value)
self.conn.commit()
return item
def close_spider(self, spider):
self.cur.close()
self.conn.close()
五、修改kuwo_spider.py
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from songSpider.items import SongspiderItem
#使用多页爬取
class KuwoSpider(CrawlSpider):
name = 'kuwo_spider'
allowed_domains = ['kuwo.cn']
start_urls = ['http://yinyue.kuwo.cn/yy/category.htm',
'http://www.kuwo.cn/mingxing',
]
# 设置爬取规则,可迭代对象,可设置多个规则
rules = [
Rule(LinkExtractor(allow=(
"http://www.kuwo.cn/yinyue/(\d+)")),
callback='get_song', follow=True),
Rule(LinkExtractor(allow=(".*"))),
]
# 获取歌曲信息
def get_song(self,response):
item = SongspiderItem()
item['name'] = response.xpath('//*[@id="lrcName"]/text()').extract()[0]
item['singer'] = response.xpath('//*[@id="musiclrc"]/div[1]/p[2]/span/a/text()').extract()[0]
# lyric = # 歌词
lyrics = response.xpath('//*[@id="llrcId"]/p')
lyricstr = item['name']
for lyric in lyrics:
lyricstr += '\n'
lyricstr += lyric.xpath('text()').extract()[0]
item['lyric'] = lyricstr
item['url'] = response.url
item['originId'] = 2
# with open(r'D:\Learn\pythonPro\qianfeng\MusicSearch\songSpider\songs.csv', 'a', newline='',encoding='utf-8') as f:
# writer = csv.writer(f)
# # 按行写入
# writer.writerow([item['name'],item['singer'],item['lyric'],item['url'],])
return item
六、在项目目录下添加start.py
主要使用来启动爬虫。
import scrapy.cmdline
def main():
scrapy.cmdline.execute(['scrapy','crawl','kuwo_spider'])
if __name__ == '__main__':
main()
七、使用Redis进行分布式爬虫
1、修改kuwo_spider.py
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from songSpider.items import SongspiderItem
from scrapy_redis.spiders import RedisCrawlSpider
# 使用Redis爬取
class KuwoSpider(RedisCrawlSpider):
name = 'kuwo_spider'
allowed_domains = ['kuwo.cn']
# 增加一个redis_key
redis_key = "kuwo:start_url"
# 设置爬取规则,可迭代对象,可设置多个规则
rules = [
Rule(LinkExtractor(allow=(
"http://www.kuwo.cn/yinyue/(\d+)")),
callback='get_song', follow=True),
Rule(LinkExtractor(allow=(".*"))),
]
# 获取歌曲信息
def get_song(self,response):
item = SongspiderItem()
item['name'] = response.xpath('//*[@id="lrcName"]/text()').extract()[0]
item['singer'] = response.xpath('//*[@id="musiclrc"]/div[1]/p[2]/span/a/text()').extract()[0]
# lyric = # 歌词
lyrics = response.xpath('//*[@id="llrcId"]/p')
lyricstr = item['name']
for lyric in lyrics:
lyricstr += '\n'
lyricstr += lyric.xpath('text()').extract()[0]
item['lyric'] = lyricstr
item['url'] = response.url
item['originId'] = 2
return item
2、修改settings.py
ITEM_PIPELINES = {
'songSpider.pipelines.SongspiderPipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400, # 通向redis
}
# 分布式配置
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
REDIS_URL = "redis://:123456@127.0.0.1:6379"
3、在CMD命令终端输入
开启redis服务。
然后在另一个cmd窗口输入:
redis-cli
auth 123456
lpush kuwo:start_url http://yinyue.kuwo.cn/yy/category.htm
4、在PyCharm中的Terminal中输入:
scrapy runspider kuwo_spider.py
5、实现分布式爬取
把这个程序在另外一台电脑运行,redis连接主机的服务器,启动爬虫即可。
具体操作为:
5.1 主机设置
在主机上启动redis服务:
redis-server redis.conf
打开CMD窗口输入redis_key:
redis-cli
auth 123456
lpush kuwo:start_url http://yinyue.kuwo.cn/yy/category.htm
在主机上启动爬虫:
scrapy runspider kuwo_spider.py
5.2 从机设置(可以有多个从机)
在从机上连接主机redis服务器:
# 在CMD窗口中输入
# 连接注解reids服务器
# 我当前的主机ip为10.3.141.228 端口为6379 密码为123456
redis-cli -h 10.3.141.228 -p 6379 -a 123456
打开CMD窗口输入redis_key:
redis-cli
auth 123456
lpush kuwo:start_url http://www.kuwo.cn/mingxing
不同的从机,kuwo:start_url的值可以设置不同的链接。
在从机上启动爬虫:
scrapy runspider kuwo_spider.py
八、使用IP代理池
1、修改settings.py,增加
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware':None,
'songSpider.middlewares.ProxyMiddleWare':125,
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware':None
}
2、修改middlewares.py,增加
from scrapy import signals
import random
import scrapy
from scrapy import log
import pymysql
# ip代理池
class ProxyMiddleWare(object):
"""docstring for ProxyMiddleWare"""
def process_request(self,request, spider):
'''对request对象加上proxy'''
proxy = self.get_random_proxy()
print("this is request ip:"+proxy)
request.meta['proxy'] = proxy
def process_response(self, request, response, spider):
'''对返回的response处理'''
# 如果返回的response状态不是200,重新生成当前request对象
if response.status != 200:
proxy = self.get_random_proxy()
print("this is response ip:"+proxy)
# 对当前reque加上代理
request.meta['proxy'] = proxy
return request
return response
def get_random_proxy(self):
'''随机从IP数据库中读取proxy'''
# 连接数据库
con = pymysql.connect(
host='localhost', # 数据库所在地址URL
user='root', # 用户名
password='123456', # 密码
database='proxypool', # 数据库名称
port=3306, # 端口号
charset='utf8'
)
# 拿到查询游标
cursor = con.cursor()
#获取ip
ip_ports = cursor.execute('select ip,ip_port from proxypool ')
if ip_ports:
# 从游标中取出查询结果
ip_ports = cursor.fetchall()
# 断开连接
cursor.close()
con.close()
proxies = []
for ip,port in ip_ports:
proxies.append("http://"+ip+':'+port)
proxy = random.choice(proxies)
return proxy
后记
【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。
也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!
公众号


关注我,我们一起成长~~
Scrapy加Redis加IP代理池实现音乐爬虫的更多相关文章
- Flask开发系列之Flask+redis实现IP代理池
Flask开发系列之Flask+redis实现IP代理池 代理池的要求 多站抓取,异步检测:多站抓取:指的是我们需要从各大免费的ip代理网站,把他们公开的一些免费代理抓取下来:一步检测指的是:把这些代 ...
- 利用 Flask+Redis 维护 IP 代理池
代理池的维护 目前有很多网站提供免费代理,而且种类齐全,比如各个地区.各个匿名级别的都有,不过质量实在不敢恭维,毕竟都是免费公开的,可能一个代理无数个人在用也说不定.所以我们需要做的是大量抓取这些免费 ...
- 记一次企业级爬虫系统升级改造(六):基于Redis实现免费的IP代理池
前言: 首先表示抱歉,春节后一直较忙,未及时更新该系列文章. 近期,由于监控的站源越来越多,就偶有站源做了反爬机制,造成我们的SupportYun系统小爬虫服务时常被封IP,不能进行数据采集. 这时候 ...
- [爬虫]一个易用的IP代理池
一个易用的IP代理池 - stand 写爬虫时常常会遇到各种反爬虫手段, 封 IP 就是比较常见的反爬策略 遇到这种情况就需要用到代理 IP, 好用的代理通常需要花钱买, 而免费的代理经常容易失效, ...
- python爬虫实战(三)--------搜狗微信文章(IP代理池和用户代理池设定----scrapy)
在学习scrapy爬虫框架中,肯定会涉及到IP代理池和User-Agent池的设定,规避网站的反爬. 这两天在看一个关于搜狗微信文章爬取的视频,里面有讲到ip代理池和用户代理池,在此结合自身的所了解的 ...
- Scrapy学习-13-使用DownloaderMiddleware设置IP代理池及IP变换
设置IP代理池及IP变换方案 方案一: 使用国内免费的IP代理 http://www.xicidaili.com # 创建一个tools文件夹,新建一个py文件,用于获取代理IP和PORT from ...
- 写一个scrapy中间件--ip代理池
middleware文件 # -*- coding: utf-8 -*- # Define here the models for your spider middleware # See docum ...
- ip代理池的爬虫编写、验证和维护
打算法比赛有点累,比赛之余写点小项目来提升一下工程能力.顺便陶冶一下情操 本来是想买一个服务器写个博客或者是弄个什么FQ的东西 最后刷知乎看到有一个很有意思的项目,就是维护一个「高可用低延迟的高匿IP ...
- 5 使用ip代理池爬取糗事百科
从09年读本科开始学计算机以来,一直在迷茫中度过,很想学些东西,做些事情,却往往陷进一些技术细节而蹉跎时光.直到最近几个月,才明白程序员的意义并不是要搞清楚所有代码细节,而是要有更宏高的方向,要有更专 ...
随机推荐
- Ribbon源码分析(二)-- 服务列表的获取和负载均衡算法分析
上一篇博客(https://www.cnblogs.com/yangxiaohui227/p/12614343.html)分享了ribbon如何实现对http://product/info/这个链接重 ...
- VUE第一个项目怎么读懂
VUE介绍 VUE是前端开发框架. 原始的前端开发需要工程师写html.写css.写javascript(js).js是脚本语言,浏览器可以运行js来执行一些js支持的动作,例如点击反馈,下拉菜单.操 ...
- 01 C语言基本介绍
C语言特点 容易上手学习 结构化语言 执行效率高 处理的工作和活动偏底层 可以在多种计算机平台上编译(类似Java的跨平台) C语言历史 目前,C 语言是最广泛使用的系统程序设计语言之一 C 语言是最 ...
- 剑指Offer(一):二维数组中的查找
一.前言 刷题平台:牛客网 二.题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...
- HTML & CSS & JavaScript 从一个表格到一个灰阶颜色表(目录)
HTML & CSS & JavaScript 从一个表格到一个灰阶颜色表 01 HTML & CSS & JavaScript 从一个表格到一个灰阶颜色表 02 HT ...
- SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理(上)----筑基中期
写在前面 通过前几篇文章的学习,我们从大体上了解了shiro关于认证和授权方面的应用.在接下来的文章当中,我将通过一个demo,带领大家搭建一个SpringBoot整合Shiro的一个项目开发脚手架, ...
- Nginx作为反向代理时传递客户端IP的设置方法
因为nginx的优越性,现在越来越多的用户在生产环境中使用nginx作为前端,不管nginx在前端是做负载均衡还是只做简单的反向代理,都需要把日志转发到后端real server,以方便我们检查程序的 ...
- RocketMQ消息丢失解决方案:事务消息
前言 上篇文章,王子通过一个小案例和小伙伴们一起分析了一下消息是如何丢失的,但没有提出具体的解决方案. 我们已经知道发生消息丢失的原因大体上分为三个部分: 1.生产者发送消息到MQ这一过程导致消息丢失 ...
- LR之Oracle 2tier协议录制Oracle脚本
在一次测试中,需用到sql去查询Oracle数据,并去使用改数据时,查阅各种资料终于实现LoadRunner对Oracle数据库进行操作,分享给大家,也与大家共同进步~ 同时也可用Loadrunn ...
- 多测师讲解python _re模块_高级讲师肖sir
import re# 一.常用方法:# match():从头匹配# search():从整个文本搜索# findall():找到所有符合的# split():分割# sub():替换# group() ...