国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

爬蟲(chóng)學(xué)習(xí)之一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲(chóng)

Anleb / 3519人閱讀

摘要:概述這是一個(gè)網(wǎng)絡(luò)爬蟲(chóng)學(xué)習(xí)的技術(shù)分享,主要通過(guò)一些實(shí)際的案例對(duì)爬蟲(chóng)的原理進(jìn)行分析,達(dá)到對(duì)爬蟲(chóng)有個(gè)基本的認(rèn)識(shí),并且能夠根據(jù)自己的需要爬到想要的數(shù)據(jù)。

概述

這是一個(gè)網(wǎng)絡(luò)爬蟲(chóng)學(xué)習(xí)的技術(shù)分享,主要通過(guò)一些實(shí)際的案例對(duì)爬蟲(chóng)的原理進(jìn)行分析,達(dá)到對(duì)爬蟲(chóng)有個(gè)基本的認(rèn)識(shí),并且能夠根據(jù)自己的需要爬到想要的數(shù)據(jù)。有了數(shù)據(jù)后可以做數(shù)據(jù)分析或者通過(guò)其他方式重新結(jié)構(gòu)化展示。

什么是網(wǎng)絡(luò)爬蟲(chóng)

網(wǎng)絡(luò)爬蟲(chóng)(又被稱為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò)機(jī)器人,在FOAF社區(qū)中間,更經(jīng)常的稱為網(wǎng)頁(yè)追逐者),是一種按照一定的規(guī)則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動(dòng)索引、模擬程序或者蠕蟲(chóng)。via?百度百科網(wǎng)絡(luò)爬蟲(chóng)

網(wǎng)絡(luò)蜘蛛(Web spider)也叫網(wǎng)絡(luò)爬蟲(chóng)(Web crawler),螞蟻(ant),自動(dòng)檢索工具(automatic indexer),或者(在FOAF軟件概念中)網(wǎng)絡(luò)疾走(WEB scutter),是一種“自動(dòng)化瀏覽網(wǎng)絡(luò)”的程序,或者說(shuō)是一種網(wǎng)絡(luò)機(jī)器人。它們被廣泛用于互聯(lián)網(wǎng)搜索引擎或其他類似網(wǎng)站,以獲取或更新這些網(wǎng)站的內(nèi)容和檢索方式。它們可以自動(dòng)采集所有其能夠訪問(wèn)到的頁(yè)面內(nèi)容,以供搜索引擎做進(jìn)一步處理(分檢整理下載的頁(yè)面),而使得用戶能更快的檢索到他們需要的信息。via?維基百科網(wǎng)絡(luò)蜘蛛

以上是百度百科和維基百科對(duì)網(wǎng)絡(luò)爬蟲(chóng)的定義,簡(jiǎn)單來(lái)說(shuō)爬蟲(chóng)就是抓取目標(biāo)網(wǎng)站內(nèi)容的工具,一般是根據(jù)定義的行為自動(dòng)進(jìn)行抓取,更智能的爬蟲(chóng)會(huì)自動(dòng)分析目標(biāo)網(wǎng)站結(jié)構(gòu)類似與搜索引擎的爬蟲(chóng),我們這里只討論基本的爬蟲(chóng)原理。

爬蟲(chóng)工作原理

網(wǎng)絡(luò)爬蟲(chóng)框架主要由控制器解析器索引庫(kù)三大部分組成,而爬蟲(chóng)工作原理主要是解析器這個(gè)環(huán)節(jié),解析器的主要工作是下載網(wǎng)頁(yè),進(jìn)行頁(yè)面的處理,主要是將一些JS腳本標(biāo)簽、CSS代碼內(nèi)容、空格字符、HTML標(biāo)簽等內(nèi)容處理掉,爬蟲(chóng)的基本工作是由解析器完成。所以解析器的具體流程是:

入口訪問(wèn)->下載內(nèi)容->分析結(jié)構(gòu)->提取內(nèi)容

分析爬蟲(chóng)目標(biāo)結(jié)構(gòu)

這里我們通過(guò)分析一個(gè)網(wǎng)站[落網(wǎng):http://luoo.net] 對(duì)網(wǎng)站內(nèi)容進(jìn)行提取來(lái)進(jìn)一步了解!

第一步 確定目的
抓取目標(biāo)網(wǎng)站的某一期所有音樂(lè)

第二步 分析頁(yè)面結(jié)構(gòu)
訪問(wèn)落網(wǎng)的某一期刊,通過(guò)Chrome的開(kāi)發(fā)者模式查看播放列表中的歌曲,右側(cè)用紅色框線圈出來(lái)的是一些需要特別注意的語(yǔ)義結(jié)構(gòu),見(jiàn)下圖所示:

以上紅色框線圈出的地方主要有歌曲名稱,歌曲的編號(hào)等,這里并沒(méi)有看到歌曲的實(shí)際文件地址,所以我們繼續(xù)查看,點(diǎn)擊某一個(gè)歌曲就會(huì)立即在瀏覽器中播放,這時(shí)我們可以看到在Chrome的開(kāi)發(fā)者模式的Network中看到實(shí)際請(qǐng)求的播放文件,如下圖所示:

根據(jù)以上分析我們可以得到播放清單的位置和音樂(lè)文件的路徑,接下來(lái)我們通過(guò)Python來(lái)實(shí)現(xiàn)這個(gè)目的。

實(shí)現(xiàn)爬蟲(chóng)

Python環(huán)境安裝請(qǐng)自行Google

主要依賴第三方庫(kù)

Requests(http://www.python-requests.org) 用來(lái)發(fā)起請(qǐng)求

BeautifulSoup(bs4) 用來(lái)解析HTML結(jié)構(gòu)并提取內(nèi)容

faker(http://fake-factory.readthedocs.io/en/stable/)用來(lái)模擬請(qǐng)求UA(User-Agent)

主要思路是分成兩部分,第一部分用來(lái)發(fā)起請(qǐng)求分析出播放列表然后丟到隊(duì)列中,第二部分在隊(duì)列中逐條下載文件到本地,一般分析列表速度更快,下載速度比較慢可以借助多線程同時(shí)進(jìn)行下載。

主要代碼如下:

#-*- coding: utf-8 -*-
"""by sudo rm -rf  http://imchenkun.com"""
import os
import requests
from bs4 import BeautifulSoup
import random
from faker import Factory
import Queue
import threading

fake = Factory.create()
luoo_site = "http://www.luoo.net/music/"
luoo_site_mp3 = "http://luoo-mp3.kssws.ks-cdn.com/low/luoo/radio%s/%s.mp3"

proxy_ips = [    "27.15.236.236"    ] # 替換自己的代理IP
headers = {
    "Connection": "keep-alive",
    "User-Agent": fake.user_agent()
    }

def random_proxies():
    ip_index = random.randint(0, len(proxy_ips)-1)
    res = { "http": proxy_ips[ip_index] }
    return res

def fix_characters(s):
    for c in ["<", ">", ":", """, "/", "", "|", "?", "*"]:
        s = s.replace(c, "")
    return s


class LuooSpider(threading.Thread):
    def __init__(self, url, vols, queue=None):
        threading.Thread.__init__(self)
        print "[luoo spider]"
        print "=" * 20
        self.url = url
        self.queue = queue
        self.vol = "1"
        self.vols = vols

    def run(self):
        for vol in self.vols:
            self.spider(vol)
        print "
crawl end

"
        def spider(self, vol):
        url = luoo_site + vol
        print "crawling: " + url + "
"
        res = requests.get(url, proxies=random_proxies())
                soup = BeautifulSoup(res.content, "html.parser")
        title = soup.find("span", attrs={"class": "vol-title"}).text
        cover = soup.find("img", attrs={"class": "vol-cover"})["src"]
        desc = soup.find("div", attrs={"class": "vol-desc"})
        track_names = soup.find_all("a", attrs={"class": "trackname"})
        track_count = len(track_names)
        tracks = []
        for track in track_names:
            _id = str(int(track.text[:2])) if (int(vol) < 12) else track.text[:2]  # 12期前的音樂(lè)編號(hào)1~9是1位(如:1~9),之后的都是2位 1~9會(huì)在左邊墊0(如:01~09)
            _name = fix_characters(track.text[4:])
            tracks.append({"id": _id, "name": _name})
            phases = {
                "phase": vol,                         # 期刊編號(hào)
                "title": title,                       # 期刊標(biāo)題
                 "cover": cover,                      # 期刊封面
                 "desc": desc,                        # 期刊描述
                 "track_count": track_count,          # 節(jié)目數(shù)
                 "tracks": tracks                     # 節(jié)目清單(節(jié)目編號(hào),節(jié)目名稱)
            }
            self.queue.put(phases)


class LuooDownloader(threading.Thread):
    def __init__(self, url, dist, queue=None):
        threading.Thread.__init__(self)
        self.url = url
        self.queue = queue
        self.dist = dist
        self.__counter = 0       

     def run(self):
        while True:
            if self.queue.qsize() <= 0:
                pass
            else:
                phases = self.queue.get()
                self.download(phases)

    def download(self, phases):
        for track in phases["tracks"]:
            file_url = self.url % (phases["phase"], track["id"])

            local_file_dict = "%s/%s" % (self.dist, phases["phase"])
            if not os.path.exists(local_file_dict):
                os.makedirs(local_file_dict)              

            local_file = "%s/%s.%s.mp3" % (local_file_dict, track["id"], track["name"])
            if not os.path.isfile(local_file):
                print "downloading: " + track["name"]
                res = requests.get(file_url, proxies=random_proxies(), headers=headers)
                with open(local_file, "wb") as f:
                    f.write(res.content)
                    f.close()
                print "done.
"
            else:
                print "break: " + track["name"]


if __name__ == "__main__":
    spider_queue = Queue.Queue()

    luoo = LuooSpider(luoo_site, vols=["680", "721", "725", "720"],queue=spider_queue)
    luoo.setDaemon(True)
    luoo.start()

    downloader_count = 5
    for i in range(downloader_count):
        luoo_download = LuooDownloader(luoo_site_mp3, "D:/luoo", queue=spider_queue)
        luoo_download.setDaemon(True)
        luoo_download.start()

以上代碼執(zhí)行后結(jié)果如下圖所示


Github地址:https://github.com/imchenkun/ick-spider/blob/master/luoospider.py

總結(jié)

通過(guò)本文我們基本了解了網(wǎng)絡(luò)爬蟲(chóng)的知識(shí),對(duì)網(wǎng)絡(luò)爬蟲(chóng)工作原理認(rèn)識(shí)的同時(shí)我們實(shí)現(xiàn)了一個(gè)真實(shí)的案例場(chǎng)景,這里主要是使用一些基礎(chǔ)的第三方Python庫(kù)來(lái)幫助我們實(shí)現(xiàn)爬蟲(chóng),基本上演示了網(wǎng)絡(luò)爬蟲(chóng)框架中基本的核心概念。通常工作中我們會(huì)使用一些比較優(yōu)秀的爬蟲(chóng)框架來(lái)快速的實(shí)現(xiàn)需求,比如 scrapy框架,接下來(lái)我會(huì)通過(guò)使用Scrapy這類爬蟲(chóng)框架來(lái)實(shí)現(xiàn)一個(gè)新的爬蟲(chóng)來(lái)加深對(duì)網(wǎng)絡(luò)爬蟲(chóng)的理解!

特別申明:本文所提到的落網(wǎng)是我本人特別喜歡的一個(gè)音樂(lè)網(wǎng)站,本文只是拿來(lái)進(jìn)行爬蟲(chóng)的技術(shù)交流學(xué)習(xí),讀者涉及到的所有侵權(quán)問(wèn)題都與本人無(wú)關(guān)

本文首發(fā)在sudo rm -rf 采用署名(BY)-非商業(yè)性使用(NC)-禁止演繹(ND) 轉(zhuǎn)載請(qǐng)注明原作者

--EOF--

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/38063.html

相關(guān)文章

  • 爬蟲(chóng)學(xué)習(xí)之基于Scrapy網(wǎng)絡(luò)爬蟲(chóng)

    摘要:不過(guò)不用擔(dān)心,中有很多非常優(yōu)秀的爬蟲(chóng)框架,比如我們接下來(lái)要學(xué)習(xí)到的。結(jié)合以上分析我們基本確定了本次爬蟲(chóng)的各個(gè)路線入口,接下來(lái)我們就開(kāi)始通過(guò)程序來(lái)實(shí)現(xiàn)本次的目標(biāo)。這里我們的目的是建立一種寫(xiě)爬蟲(chóng)的思路,而不在于怎么使用工具來(lái)爬數(shù)據(jù)。 概述 在上一篇文章《爬蟲(chóng)學(xué)習(xí)之一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲(chóng)》中我們對(duì)爬蟲(chóng)的概念有了一個(gè)初步的認(rèn)識(shí),并且通過(guò)Python的一些第三方庫(kù)很方便的提取了我們想要的內(nèi)容,但是...

    BingqiChen 評(píng)論0 收藏0
  • 爬蟲(chóng)學(xué)習(xí)之基于 Scrapy 爬蟲(chóng)自動(dòng)登錄

    摘要:概述在前面兩篇爬蟲(chóng)學(xué)習(xí)之基于的網(wǎng)絡(luò)爬蟲(chóng)和爬蟲(chóng)學(xué)習(xí)之簡(jiǎn)單的網(wǎng)絡(luò)爬蟲(chóng)文章中我們通過(guò)兩個(gè)實(shí)際的案例,采用不同的方式進(jìn)行了內(nèi)容提取。 概述 在前面兩篇(爬蟲(chóng)學(xué)習(xí)之基于Scrapy的網(wǎng)絡(luò)爬蟲(chóng)和爬蟲(chóng)學(xué)習(xí)之簡(jiǎn)單的網(wǎng)絡(luò)爬蟲(chóng))文章中我們通過(guò)兩個(gè)實(shí)際的案例,采用不同的方式進(jìn)行了內(nèi)容提取。我們對(duì)網(wǎng)絡(luò)爬蟲(chóng)有了一個(gè)比較初級(jí)的認(rèn)識(shí),只要發(fā)起請(qǐng)求獲取響應(yīng)的網(wǎng)頁(yè)內(nèi)容,然后對(duì)內(nèi)容進(jìn)行格式化存儲(chǔ)。很多時(shí)候我們抓取到的內(nèi)容...

    Panda 評(píng)論0 收藏0
  • 后端文章 - 收藏集 - 掘金

    摘要:為什么我會(huì)說(shuō)它們是一樣的簡(jiǎn)單思考一下我的后端書(shū)架后端掘金我的后端書(shū)架月前本書(shū)架主要針對(duì)后端開(kāi)發(fā)與架構(gòu)。一方案調(diào)研版本選擇當(dāng)前主流版本是和應(yīng)用的后臺(tái)運(yùn)行配置后端掘金醬油一篇,整理一下關(guān)于后臺(tái)運(yùn)行的一些配置方式。 分享 50 個(gè)完整的 React Native 項(xiàng)目 - 掘金本文為 Marno 原創(chuàng),轉(zhuǎn)載必須保留出處! 公眾號(hào) aMarno,關(guān)注后回復(fù) RN 加入交流群 簡(jiǎn)書(shū)專題《 Rea...

    CntChen 評(píng)論0 收藏0
  • 首次公開(kāi),整理12年積累博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...

    Harriet666 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<