一、前期準備1.Scrapy原理概述 Scrapy是一個為了爬取網(wǎng)站數(shù)據(jù),提取結構性數(shù)據(jù)而編寫的應用框架??梢詰迷诎〝?shù)據(jù)挖掘,信息處理或存儲歷史數(shù)據(jù)等一系列的程序中。其最初是為了爬蟲或者數(shù)據(jù)采集所設計的, 也可以應用在獲取API所返回的數(shù)據(jù)或者通用的網(wǎng)絡爬蟲。簡單來說,與普通爬蟲相比,Scrapy“有組織 有紀律”,更容易構建大規(guī)模抓取項目。 下圖即為Scrapy框架的原理架構圖,下面來一一解釋:
有了上文對Scrapy組件的介紹,下面描述一下Scrapy運作流程:
2.Scrapy安裝配置 接下來開始安裝Scrapy,Scrapy已經(jīng)支持python3,本文環(huán)境為win10 Anaconda3,實測安裝沒有出現(xiàn)問題。首先通過pip安裝Scrapy: pip install scrapy 之后進入到python命行并導入,如果沒有出現(xiàn)報錯則初步說明安裝成功。
3.Scrapy入門測試 接著我們通過一個百度分布式爬蟲框架小例子進行測試,首先在cmd中用cd命令切到任一目錄,之后運行: scrapy startproject littletest 然后切換至項目目錄并通過genspider命令加入爬蟲網(wǎng)站:
之后進入目錄查看,目錄結構如下:
同時我們進入settings.py將ROBOTSTXT_OBEY配置項改為False,即不遵守爬蟲協(xié)議,否則很多網(wǎng)站無法正常獲取。 ROBOTSTXT_OBEY = False 最后進入命令行啟動scrapy爬蟲:
得到結果如下,狀態(tài)碼為200且接收字節(jié)數(shù)大于0,則表明爬取成功! 3.MongDB安裝配置 MongoDB 是目前最流行的 NoSQL 數(shù)據(jù)庫之一,使用的數(shù)據(jù)類型 BSON(類似 JSON),下載安裝及配置以及鏈接python的pymongo數(shù)據(jù)庫和最優(yōu)秀的compass可視化工具安裝及使用可參考作者博客。 二、QQ音樂爬蟲實戰(zhàn) 1.網(wǎng)頁分析 通過打開QQ音樂官網(wǎng)并點擊歌手欄(鏈接傳送門:https://y.qq.com/portal/singer_list.html),并打開DevTools工具,選擇XHR異步并觀察item,發(fā)現(xiàn)musicu.fcg一欄返回的json數(shù)據(jù)中有歌手相關信息。 因此我們進一步進入該項headers獲取到請求url,繼續(xù)點擊下一頁,通過三頁(url如下)查找規(guī)律進一步發(fā)現(xiàn)sin參數(shù)發(fā)生變化,規(guī)律公式為80*(n-1),n為頁碼。篇幅有限,json數(shù)據(jù)解析就不再解釋,可參考前文。 https://u.y.qq.com/cgi-bin/musicu.fcg?-=getUCGI9874589974344781&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8?ice=0&platform=yqq.json&needNewCode=0&data=%7B%22comm%22%3A%7B%22ct%22%3A24%2C%22cv%22%3A0%7D%2C%22singerList%22%3A%7B%22module%22%3A%22Music.SingerListServer%22%2C%22method%22%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%3A0%2C%22cur_page%22%3A1%7D%7D%7D
https://u.y.qq.com/cgi-bin/musicu.fcg?-=getUCGI8205866038561849&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8?ice=0&platform=yqq.json&needNewCode=0&data=%7B%22comm%22%3A%7B%22ct%22%3A24%2C%22cv%22%3A0%7D%2C%22singerList%22%3A%7B%22module%22%3A%22Music.SingerListServer%22%2C%22method%22%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/musicu.fcg?-=getUCGI8189152987042585&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8?ice=0&platform=yqq.json&needNewCode=0&data=%7B%22comm%22%3A%7B%22ct%22%3A24%2C%22cv%22%3A0%7D%2C%22singerList%22%3A%7B%22module%22%3A%22Music.SingerListServer%22%2C%22method%22%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%3A160%2C%22cur_page%22%3A3%7D%7D%7D 以此類推依次獲取到歌曲下載地址、歌曲列表地址、歌詞列表地址、歌曲評論地址等并配置翻頁參數(shù):
之后我們開始建立scrapy爬蟲程序。首先切換至個人目錄下面開啟項目: scrapy startproject musicspyder
cd musicspyder
scrapy genspider qqmusic y.qq.com 2.spyder.py編寫 接下來開始對Scrapy組件逐一完善,首先對主要爬蟲程序qqmusic.py進行編寫,在生成類中分別定義爬蟲名、允許域名、爬取url等變量,并創(chuàng)建解析用戶信息、歌曲信息、歌詞信息、評論信息、url信息方法:
3.items.py編寫 之后對items.py進行編寫,在QqMusicItem類中創(chuàng)建MongoDB集合名、id字段、歌手名字段、歌曲名字段、歌曲地址字段、歌詞字段、評論字段等變量: import scrapy
from scrapy import Field
class QqMusicItem(scrapy.Item):
# mongodb collection
collection = 'singer'
id = Field()
# 歌手名字字段
singer_name = Field()
# 歌曲名字段
song_name = Field()
# 歌曲地址字段
song_url = Field()
# 歌詞字段
lrc = Field()
# 評論字段
comment = Field() 4.piplines.py編寫 再對piplines.py進行編寫,新增加IrcText類對歌詞進行解析處理:
之后是middlewares.py代碼編寫,自定義my_useragent類,使用random庫隨機選擇瀏覽器頭: import random
from scrapy import signals
# 默認中間件
class MusicspyderSpiderMiddleware(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(self, response, exception, spider):
def process_start_requests(self, start_requests, spider):
def spider_opened(self, spider):
?
# 在中間件中加入useragent防爬
class my_useragent(object):
def process_request(self, request, spider):
user_agent_list = ['...','...',...]
user_agent = random.choice(user_agent_list)
request.headers['User_Agent'] = user_agent 6.settings.py編寫 最后是settings.py編寫,配置相應的爬取頁數(shù)、爬取歌手歌曲數(shù)量、mongoDB的地址與數(shù)據(jù)庫等變量,并且設置不遵守Robots協(xié)議,開啟下載中間件和itempipline:
定義上述scrapy組件完成之后我們即可在命令行中輸入以下命令用以啟用qqmusic爬蟲框架: scrapy crawl qqmusic 之后進入mongodb查看爬取結果即可得到響應歌手歌曲信息: 三、爬蟲系列總結至此Scrapy框架爬取QQ音樂講解完成,Python網(wǎng)絡爬蟲數(shù)據(jù)采集實戰(zhàn)系列也隨之結束,總體來說,爬蟲是一種細致活,需要掌握固定的套路并且去努力尋找網(wǎng)絡數(shù)據(jù)規(guī)律的蛛絲馬跡方能爬取成功,同時也要量力而行,防止對對方服務器造成巨大負載或者己方投入產(chǎn)出不成正比。完整代碼可以在頭條號中私信“QQ音樂”獲得,前文涉及的基礎知識可參考下面鏈接: 爬蟲所要了解的基礎知識,這一篇就夠了!Python網(wǎng)絡爬蟲實戰(zhàn)系列 一文帶你深入了解并學會Python爬蟲庫!從此數(shù)據(jù)不用愁 Python爬蟲有多簡單?一文帶你實戰(zhàn)豆瓣電影TOP250數(shù)據(jù)爬??! 一文弄清Python網(wǎng)絡爬蟲解析庫!內含多個實例講解 誰說同花順很難爬?一文帶你學會用Python爬取財經(jīng)動態(tài)網(wǎng)頁! 誰說京東商品很難爬?一文教你用Python構建電商網(wǎng)站爬蟲! Python網(wǎng)絡爬蟲實戰(zhàn)之Fiddler抓包今日頭條app!附代碼 參考鏈接: https://blog.csdn.net/qq_1290259791/article/details/82263014 https://www.jianshu.com/p/cecb29c04cd2 https:///4380.html |
|