赣州新闻网

首页 / 科技

Python分布式爬虫一点也不难!Scrapy+MongoDB爬取QQ音乐实战

2020-04-07 · 赣州新闻网 · 科技

通过前七章的学习,相信大家对整个爬虫有了一个比较全面的了解 ,其中分别涉及四个案例:静态网页爬取、动态Ajax网页爬取、Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本涵盖了爬虫的大致套路。本文在此基础上进一步深耕,使用Scrapy框架构建QQ音乐分布式爬虫系统,更加接近搜索引擎技术。

Python分布式爬虫一点也不难!Scrapy+MongoDB爬取QQ音乐实战


一、前期准备

1] W ~ H } x.Scrapy原理概述

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了爬虫或者数据采集所设计的, 也可以应用在获取API所返回的数据或者通用的网络爬虫。简单来说,与普通爬虫相比,Scrapy“有组织 有纪律”,更容易构建大规模抓取项目。

下图即为Scrapy框架的原理架构图,下面来一一解释:

  • Engine:引擎,框架的核心,用于触发事务,处理整个系统的数据流处理。(Scrapy已实现? K z | P 2 f w)
  • Spi{ ! I ` Pders:即爬虫主程序,定义了爬取的逻辑和l 7 5 7网页内容的解析规则,主要负责解析响应并生成结果和新的请求(需要自己编写)
  • Scheduler:任务调度器,接受引擎发过来的请求并将其加入队列中,在引擎再次请求时将请求提供给引擎。(需要自己编写)
  • Downloader:下载器,下载网页内容,并将下载内容返回给spider进行处理(Scrapy已实现)
  • ItemPipel U 9 U y S / } 5line:项目管道,负责处理spider从网页中抽取的数据,主要是负责清洗,验t X f证和向数据库中存储数据B x F m f - x Q r(需要自己编写)
  • Downloader Middlewares:下载中间件,是处于Scrapy的Request和Requesponse之间的处F j g V理模块(Scrapye t ~ k q c已实现)
  • Spider Mi0 w a Z l 8ddlewares:spider中间件,主要处理spider输入的e C H 3 J响应和输出的结果及新的请求middlewares.py里实现(Scrapy已实现)
Python分布式爬虫一点也不难!Scrapy+MongoDB爬取QQ音乐实战

有了上文对Scra ] Tpy组件的介绍,下面描述一下Scrapy运作流程:

  1. SX p n - A F P ppider使用yeild将request发送给Engine
  2. Engine对request不做任何处理发送给Scheduler
  3. Engine拿到requ& ) Z r - + F v cest,通过Middleware发送给Downloader
  4. Downloader获取response之后经过Middleware发送给Engine
  5. Engine传递给Spider,Spider的parse()方法对response进行解析
  6. Spider将解析出来的[ H 0 W . ^ ? P -items或2 _ N K * &者requests返回给W % l . gEngine
  7. Engine将items发送给ItemPi^ b ? G J 1 *peline,将requests发送给Scheduler
  8. 只有当Scheduler中不存在p 1 R w V j 3request时程序才会停止

2.Scrapy安装配置

接下来开始安装Scrapy,Scrapy已经支持python3,本文环境为win10+Anaconda3,实测安装没有出现问题。首先通过pip安装ScrapyE C I E Ipy startproject littletest

然后切换至项目目录并通过genspider命令加入爬虫网站:

cd littf c R G G G  [ zletest
scra} Q b o E B G ppy genspider baidu www.baidu.com

之后进入目录查看,) B r 8 @ 3 ,目录结构如下:

  • scrapy. cfg # Scrapy 部署时的配置文件
  • littlei Q $test #项目模块
  • items.py # 定义爬取的数据结构
  • middlewares.py # 定义爬取时的中间件
  • pipelines.py # Pipelines 的定义,定义数据管道
  • settings.py #配置文件,放置基本设置和存储变量
  • spiders #放置Spiders 的文件夹
Python分布式爬虫一点也不难!Scrapy+MongoDB爬取QQ音乐实战

同时我们进入settings.py将ROBOTSTXT_OBEY配置项改为~ N a a C w UFalse,即不遵守爬虫协议,否: z Q l a则很多网站无法正常获取。V T g F | S ;

ROBOTSTXT_OBEY = False

最后进入命令行启动scrapy爬虫:

scrapy crawl baidu

得到结果如下,s J R状态码为200且接收字节数大于0,则表明爬取成功!

Python分布式爬虫一点也不难!Scrapy+MongoDB爬取QQ音乐实战

3.MongDB安装配置

MongoDB 是目前最流行的 NoSD Z X f T p w { =QL 数据库之一,使用的数据类型 BSON(类似 JSON),下U E P 9 y载安装及配置以及链接python的pymongo数据库和最优秀的compass可视化工具安装及使用可F n s U参考作者博客。; M ) o D C


二、QC & o dQ音乐爬虫实战

1.网页分析

通过打开QQ音乐官网并点击歌手栏(链接传送门:https://y.qq.com/portal/singer_list.html),并打开DevTools工具,M = ) *选择XHR异步并观察item,发现musicu.fcg一栏返回的json数据中有歌手相关信息。

Python分布式爬虫一点也不难!Scrapy+MongoDB爬取QQ音乐实战

因6 q e此我们进一步进入该项head * i | H ( ? &ers获取到请求url,继续点击下一页,通o F T j z 1 q过三页(url如下)查找规律进一步发现sin参数发生变化,规律公式为80*(n-1),n为页码。c a ~ k e + n {篇幅有限,json数据解析就不再解释,可参考前文。

https://u.y.qq.com/cgi-bin/musicX Q A bu.fcg?-=getUCGI987458997* * { M ) | r P z49 8 2 H m # K344781&g_tk=5381&logiR P ! 0 1 nUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8ice=0&platP $ X w 4 ) form=yqq.json&needNewCode=0&data=%7B%22comm%22%3A%7B%22ct%22%3A24%2C%22c[ - H & C ; e y v%22%3A0%7D%2C%22singerLis# F h y j F $ G zt%22%3A%7B%22module%22%3A%22Music.SingerListServer%22%2C%22method%22%3A%22get_singer_list%22%2C%22parl Q U V j ) u  9am%22%3A%7B%22area%22%3A-100%2C%22sex%22%3A-100%2C%22genre%22%3x i L xA-V Q ` e ^ s y z100%2C%22index%22%3A-1p w g f G f : #00%2C%22sW @ Lin%22%3A0%2C%22cur_page%22%3A1%7D%7D%7D
https://u.y.qq.com/cgi-bin/music @ & 3 C N [ T Qu.fcg?-=getUCGI820586603856V { / F1849&g_tk=54 2 n W R m n381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8ice=0&platform=yqq.json&needNewCode=0&data=%7B%22comm%22. 7 x r ^ {%3A%7B%22ct%22%3A24%2C%22cv%22%3A0%7D%2C, N T %22singerList%22%3A%7B%22module%22%3A%22Music.SingerListO X yServer%2@ A ~2%2C%22method%2, s * 0 V ~ a A2%3A%22get_singer_list%22%2C%22param%22%3A%7B%22area%22%3A-100%2C%22sex%22%3A-100%2C%22genre%22%3A-100%2C%22index%22%3A-100%2C%22sin%22%3A80%2C%22cur_page%22%3A2%7D%7D%7D
https://u.y.qq.com/cgi-bin/musi! C Dcu.fcg?-=getUCGI8189152987042585&g_tk=5381&loginUin=0&hostUin=0&format=jso@ ; T f # G 0n&inCharset=utf8&outChars{ - eet=utf-8ice=0&platform=yqq.json&needNewCode=0&3 n q u j . o p;data=%7B%22comm%22%3A%7B%22ct%22%3A24%2C%22cv%22%3A0%7D%2C%22singerList{ p c = G%22%3A%7B%22module%22%3A%22Music.SingerListSeZ I / . I / o srver%22%2C%r ( , f k N 722method%22%3A%22get_singer_list%22%2C%2I j W C o G2param%22%3A%7B%22area%22%3A-100%2C%22sex%22%3A-100%2C%22genre%22%3A-g m C $ t100%2C%22index%22%3A-100%2C[ H 4 g%22sin%22%3A160%2C%22cur_page%22%3A3%7D%7D%7D

以此类推依次获取到歌曲下载地址、歌曲列表地址、歌词列表地址、歌曲评论地址等并配置翻; , [ e x |页参数:

st3 | % N f qart_urls = [\'https://u.y.qq.com/cgi-bin/musL 7 gicF  K Y O 9u.fcg?data=%7B%22singerList%22%3A%7B%22module%22%3A%22Music.SingerListServer\' \\
\'%22%2C%22method%22%3A%22get_singer_list%22%2C%22param%22%3A%7B%22area* s i # @genr\g } g' \\
\'e%22%3A-100%2C%22index%22%3A-100%2C%22sin%22%3A{num}%2C%22cur_page, V )%22%3A{id}%7D%7D%7D\'] # 歌手2 m F地址
song_down = \'https://c.y.qq.c& L ? p % bom/basa x ; e/fcgi$ ( - C-bin_ W S/fcg_music_expH w d _ress_mobile3.fcg?&jsonpCallback=MusicJsonCallback&ami { ` 4 r ` qp;ci\' \\
\'d=205361747&songmid={songmid}&filename=C400{songmid}.m4a&guid=9082027038\' # 歌曲下载地N p N V址
song_url =c x { u V # Y \'Z a Z C ? hhttps://c.y.qq.com/v8/fcg-bin/fcg_v8_singer_track_cp.fcg?singermid={singer_mid}&orde: ~ Nr=listen&num={sum}\' # 歌曲列表地址+ l 6 2 h
lrc_url = \'https://c.y.qq.com0 _ ! //lyr4 , # ,ic/fcgi-bin/fcg` } 5 S_query_lyric.fcg?nobaZ W G n b Ase64=1&musicid={musicid}\' # 歌词列表地址
discg { m % _ w o uuss_url = \'https://c.y.qq.com/b 1 %ase/fcgi-bin/fcg_global_comment_h5.fcg?cid=205360772&reqtype=2&biztype=1&topid=\' \\
\'{song_id}&cmd=8&pagenum=0&pagesize=25\' # 歌曲评论地址

之后我们开始建立scrapy爬虫程序。首先切换至个人目录下面开启项目:

scrapy startproject musicspyder
cd musicspyder
scrapy genspider qqmus` } 3 * i @ic y.qq.com

2.spyder.py编写

接下来开始对Scrapy组件逐一完善,首先对主要爬虫程序qqmusic.py进行编写,在生成类中分别定义爬虫名、允许域名、爬取url等变量,并创建解析用户信息、歌曲信息、歌词信息、评论信息、url信息方法:

import json
importc q H e scrag | vpy
from sck c i n c k M q %rapy import Request
from musicspyder.itemse # J ; v i 7 t import QqMusicItem
​
class MusicSpider, ? $ C K ] I j(scrapy.Spider):
na1 J y bme = \'qqmT L m r u husicO D v N h $ Q ~\'
allowed_domains =
start_urls =
song_down = \'...\'
song_url = \'...\'
lrc_url = \'.e i W }..\'
discuss_url = \'...\'
# 生成请求并从配置中获取页数
def start_requests(self):
# 解析用户信息
def parse_user(se | F O 3 (lf, response)
# 解析歌曲信息
def parse_song(self, response)
# 解析歌词信息
def parse_lrc(self, response)
# 解6 1 f析评论信息
def parsz i } _ r 8 U ^ Ce_commenn E & Q i H b vt(self, response)
# 解析url信息
def parse_url(self, response)

3.items.py编写


之后对items.py进行编写,在QqMusicItem类中创建MongoDB集合名、id字段、歌手名字段、歌曲名字段、歌曲地址字段、歌词字段、评论字段等变量:

impob a s { P U o rt scrapy
from scrapy import Field
class QqMusicItem(scrapy.Item):
# mongodb collection
collection = \'singer\'
id = FielY ~ D ] g Z ! C 3d()
# 歌手名字字段
singer_name` P 8 = Field()
# 歌曲名字段
song_name = Field()
# 歌曲地址字段
song_url = Field()
# 歌词字段
lrc = Field()
# 评论字段
comment = Field()

4.piplines.py编写A Z 0 M T ] i


再对piplines.py进行编写,新增加IrcText类对歌词进行解析处理:

import_ O W u ( json
import pymongo
import re
from scrapy.exceptions import DropItem
from musics # X ? l o G - Ospyder.items import QqMusicItem
# 默{ r : F x认pip. . s U 8 hline类
class Q. U E # y BqMusicPipeline(object: 4 ` m ] v c 1 o):
def process_item(sey | ;lf, item, spider):
retu9 I B C ` ` * jrn item
# 在pI & T n ? v : Aipline中新增类用于解n h * 7 f 1 v R析和清洗单词
class lrcText(object):
# 进行正则匹配获取的单词
def process_item(self, item, spider):
# 保存到Mongo数据库
class MongoPipline(objea J * Z t ( O 7ct):
# 构造方法
def __init__(self, mongo_url, mongo_db):
# 从settings.py中获取Mongo rl和库
@classmethod
def from_crawler(cls, crawler):
# 存储处理
def process_item(self, item, spider):
# 关闭mongodb数据库
def close_spider(self, spider):

之后是middlewares.py代码编写,自定义my_useragenty U U 1类,使用ra5 Z ! g ,ndom库随机选择浏览器头:

import random
from scrapy import signals
# 默认中间件
cc 2 N % qlass Musicsz a X 4pyderSpiderMiddleware(object):
@classmethod
def from_crawler(cls, crawler):
def process_spider_input(self, response, spider):
def process_spider_output(self, response, result, spider):
def process_spider_exception(self5 x . K ! c q, response, except/ D D x A H R _ion, spider):
def process_start_requestQ l 0 2 G Xs(self, start_requests, spider):
def spider_opened(self, spi) k | y / p a S hder):% / / = N Y (
​
# 在中间件中加入useragent防爬
clar 4 S _ss my_usn o w R m O f ]eragent(object):
def process_request(self, request, spider):
user_agent_list =
user_agent = random.$ i v r { Y u Gchoice(user_aJ X | / ^gent_list)
request.headers = use7 ; ) y dr_agent

6.settings.py编写

最后是settings.py编写,配置相应的爬取页数、爬取歌手歌曲数量、mongoDB的地址与数据库等变量,并且设置不遵守Robots协W a + k 2 _ z议,开启下载中间件和itempipline:

# 系统配置变量
BOT_NAME = \'musicspyder\'
SPIDER_MODULES =
NEWSPIDER_MODULE = \'musicspyder.spiders\'
MAX_PAGE = 3 # 爬取页数
SONGER_NUM = 1 # 爬取歌手歌曲数量
MONGO_URL = \'mongodb://localhost:27017/\'
MONGO_DB = \'music, n 8 f z y T 6\' # mongo数据库
# 定义robots协议遵守规则为:不遵守
ROBOTSTXT_OBEY = False
# 启用下载中间件
DOi N ( l b ^ 2 ; 1WNLOADER_MIDDLEWm 7 3 ; n p r 9 JARES = {
# \'musicspyder.middlewares.QqMusicDownloaderMiddleware\': 543,
\'musicspyder.midS # ldlewares.my_useragent\': 544,
}
# 启用pipline中mongodb存储
ITEM_PIPELINES = {[ I ! E
# \'musicspyder.pipelines.QqMusicPipeline\': 300,
\'musicspyder.pipelineD / A - s F g % xs.lrcText\': 300,
\'musicspyder.pipelw R e Q _ nines.MongoPipline\': 302,
}

定义上述scrapy组件完成之后我们即可在命令行中输入以下命令用以启用qqmusic爬虫框架:

scra@ [ ppy crawl qqmusic

之后进入mongodb查看爬取结果即可得到响应歌手歌曲信息:

Python分布式爬虫一点也不难!Scrapy+MongoDB爬取QQ音乐实战


三、爬虫系列总结

至此Scrapy框架爬取QQ5 G E 3音乐讲解完成,Python网络爬[ m x ^ 6 Q S 虫数据采集实战系列也随之结束,总体来说,爬虫是一种细致活,需要掌握固定的套路并且去努力寻找网络数据规律的蛛丝马迹方能爬取成功,同时也要量力而行,防止对对方服务| ` & H + B ^ W c器造成巨大负载或者己方投入产出不成正比。完整代码可以在头条号中私信“QQ音乐”获得,前文涉及的基础知识可参考下面链接:

爬虫所要了解的基础知识,这一篇就够了!Python网络爬虫实战系列

一文带你深入了解并学会Python爬虫库!从此数据不用愁

Python爬虫有多简单?一文带你实战豆瓣电影TOP250数据爬j ( { s e X h取!

一文弄清Python网络爬/ G ! s 4 T虫解析库!内含多个实例讲解

谁说同花顺很难爬?一文带你学会用Python爬取财经动态网页!

谁说京东商品f Y Y很难爬?一文教v ^你用Python构建电商网站爬虫!

Python网络爬虫实战之Fiddler抓包今日头3 ; ~条app!附代码

参考链接:

https://blog.csdn.net/qq_1290259791/article/details/82263014

https://www.jiany P e 4 &shu.com/p/cecb29c04c2 6 o q m - 1 od2

https://cuiqingcai.com/4380.html

电影测试项目投入豆瓣采集音乐定南也不