1. 程式人生 > >Scrapy加Redis加IP代理池實現音樂爬蟲

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://:[email protected]: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

相關推薦

ScrapyRedisIP代理實現音樂爬蟲

音樂爬蟲 目的:爬取歌名,歌手,歌詞,歌曲url。 一、建立爬蟲專案 建立一個資料夾,進入資料夾,開啟cmd視窗,輸入: scrapy startproject songSpider 依次輸入: cd songSpider scrapy

【Python3爬蟲Scrapy使用IP代理和隨機User-Agent

findall 4.3 sdch 5.0 agen and 由於 付費 status 在使用爬蟲的時候,有時候會看到由於目標計算機積極拒絕,無法連接...,這就是因為我們的爬蟲被識別出來了,而這種反爬蟲主要是通過IP識別的,針對這種反爬蟲,我們可以搭建一個自己的IP代理池,

scrapy中設定IP代理(自定義IP代理

首先主要的就是你應該對scrapy目錄結構,有一個相對清晰的認識,至少有過一個demo 一、手動更新IP池 1.在settings配置檔案中新增IP池: IPPOOL=[ {"ipaddr":"61.129.70.131:8080"}, {"ipaddr":"61.152

Java網路爬蟲(七)--實現定時爬取與IP代理

定點爬取 當我們需要對金融行業的股票資訊進行爬取的時候,由於股票的價格是一直在變化的,我們不可能手動的去每天定時定點的執行程式,這個時候我們就需要實現定點爬取了,我們引入第三方庫quartz的使用: package timeutils; imp

爬取西刺網實現ip代理

使用ip代理伺服器可以防止在爬蟲時被封本機ip。國內免費的高匿代理可以選擇西刺網總體目標是寫一個爬蟲,將這些欄位儲存在資料庫中,然後篩選速度快的作為代理伺服器,實現ip代理池。在這裡使用requests庫來實現。程式碼如下import requests def crawl_i

scrapy 解決IP代理的三種方法

一.手動更新ip池 1.1在setting配置檔案中新增ip池 IPPOOL=[ {“ipaddr”:”61.129.70.131:8080”}, {“ipaddr”:”61.152.81.193:9100”}, {“ipaddr”:”120.204.

scrapy爬去知乎使用者+代理實現

spider: # -*- coding: utf-8 -*- import json from scrapy import Spider, Request from zhihuuser.items import UserItem # https://www.cnblo

scrapy ip代理】如何解決ip被限制的問題

1、首先寫一個指令碼proxies.py 自動獲取代理ip # *-* coding:utf-8 *-* import requests from bs4 import BeautifulSoup import lxml from multiproces

scrapy接入IP代理(程式碼部分)

> 記錄一個比較完整的通過ip池進行爬蟲被禁的處理 class HttpProxymiddleware(object): # 一些異常情況彙總 EXCEPTIONS_TO

ip代理-基於mongodb數據庫

url upd tostring mls from path ida request protocol 代碼用的python2.7,抓取xici免費代理,檢測放入數據庫中,為以後爬蟲做準備。下面直接上代碼 1 #-*-encoding=utf-8-*- 2 3 i

centos7生產環境IP代理(python)

.py openssl href snappy ttext ima sna make per 最近在研究爬蟲,需要在前面部署IP代理池,於是在開源中國找到proxy pool。可以自動抓取國內幾個免費IP代理網站的IP,並實時校驗IP的可用性,數據庫為SSDB。IP代理池網

python學習 —— 建立IP代理

圖片 端口 position except app rtl 分享圖片 ipp use   代碼: from bs4 import BeautifulSoup from requests import Session, get, post from time imp

小白也能做的IP代理,好久沒更新了,不知道你們想看什麽呢!

不知道 一個 pytho 爬取 save 包含著 異步處理 使用方法 gen IP代理池制作 GitHub主頁: https://github.com/hfldqwe/ 使用工具: ip代理抓取: requests 後臺搭建: Django+Redis 代理檢測: ip

Python爬蟲ip代理

clas 檢查 isp turn pre image 小白 flat for 可能在學習爬蟲的時候,遇到很多的反爬的手段,封ip 就是其中之一。 對於封IP的網站。需要很多的代理IP,去買代理IP,對於初學者覺得沒有必要,每個賣代理IP的網站有的提供了免

自己搭建億級爬蟲IP代理

做爬蟲抓取時,我們經常會碰到網站針對IP地址封鎖的反爬蟲策略。但只要有大量可用的IP資源,問題自然迎刃而解。 以前嘗試過自己抓取網路上免費代理IP來搭建代理池,可免費IP質量參差不齊,不僅資源少、速度慢,而且失效快,滿足不了快速密集抓取的需求。 收費代理提供的代理資源質量明顯提升,經過多家測試,

ProxyApi-大資料採集用的IP代理

用於大資料採集用的代理池 在資料採集的過程中,最需要的就是一直變化的代理ip。 自建adsl為問題是隻有一個區域的IP。 買的代理存在的問題是不穩定,影響採集效率。 雲vps不允許安裝花生殼等,即使有花生殼,它的解析也不及時,跟不上3分鐘變一次。 本專案的作用是將目前的雲vps,安裝代理軟體,然後使用指令碼每

爬蟲ip代理新建(使用芝麻ip代理

如果真入職爬蟲工程師職位後,真正做爬蟲爬取資料的過程,將會使用大量的ip做ip替換,否則很容易被封ip,導致資料獲取無法持續下去。 而現在市面上的免費代理其實很多都是無效的,或者持續效果很低效的。因此需要找到一個穩定高效且效果不錯的代理商。 現在我就把自己目前使用的ip代理和自己獲取代理使用

python 反爬總結(1)- 限制IP UA 的解決方法,修改headers和新增IP代理

在學習python爬蟲的過程中,遇到各種反爬機制,個人總結了一下: 對同樣的ip或User-Agent進行限制, 對頻繁訪問的ip進行限制, 設定登陸限制, 設定驗證碼, 設定Ajax載入頁面。 目前小白我也就瞭解這麼多,其中驗證碼的反反爬還在學習當中,學無止境啊 &

怎樣簡單的搭建一個免費的IP代理

之前寫過一篇python實戰專案二:獲取IP代理的文章,不過說實話,這個程式有幾點不足,以至於不能愉快玩耍之後,我就重新整理了思路,又寫了一個關於獲取免費IP代理的程式碼。在這兒我想寫反思一下之前這個程式碼的主要不足: 第一點,由於資料很雜,所以在提取資訊時頻繁的使用了迴圈

python3 requests IP代理出錯

Traceback (most recent call last): File "E:/py1803/pachong/mimimovie/movies_spider.py", line 129, in <module> m.get_content()