1. 程式人生 > >爬蟲學習之一個簡單的網路爬蟲

爬蟲學習之一個簡單的網路爬蟲

概述

這是一個網路爬蟲學習的技術分享,主要通過一些實際的案例對爬蟲的原理進行分析,達到對爬蟲有個基本的認識,並且能夠根據自己的需要爬到想要的資料。有了資料後可以做資料分析或者通過其他方式重新結構化展示。

什麼是網路爬蟲

網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社群中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼。另外一些不常使用的名字還有螞蟻、自動索引、模擬程式或者蠕蟲。via 百度百科網路爬蟲
網路蜘蛛(Web spider)也叫網路爬蟲(Web crawler)[1],螞蟻(ant),自動檢索工具(automatic indexer),或者(在FOAF軟體概念中)網路疾走(WEB scutter),是一種“自動化瀏覽網路”的程式,或者說是一種網路機器人。它們被廣泛用於網際網路搜尋引擎或其他類似網站,以獲取或更新這些網站的內容和檢索方式。它們可以自動採集所有其能夠訪問到的頁面內容,以供搜尋引擎做進一步處理(分檢整理下載的頁面),而使得使用者能更快的檢索到他們需要的資訊。via 

維基百科網路蜘蛛

以上是百度百科和維基百科對網路爬蟲的定義,簡單來說爬蟲就是抓取目標網站內容的工具,一般是根據定義的行為自動進行抓取,更智慧的爬蟲會自動分析目標網站結構類似與搜尋引擎的爬蟲,我們這裡只討論基本的爬蟲原理。
###爬蟲工作原理

網路爬蟲框架主要由控制器解析器索引庫三大部分組成,而爬蟲工作原理主要是解析器這個環節,解析器的主要工作是下載網頁,進行頁面的處理,主要是將一些JS指令碼標籤、CSS程式碼內容、空格字元、HTML標籤等內容處理掉,爬蟲的基本工作是由解析器完成。所以解析器的具體流程是:

入口訪問->下載內容->分析結構->提取內容

分析爬蟲目標結構

這裡我們通過分析一個網站[落網:http://luoo.net] 對網站內容進行提取來進一步瞭解!

第一步 確定目的
抓取目標網站的某一期所有音樂

第二步 分析頁面結構
訪問落網的某一期刊,通過Chrome的開發者模式檢視播放列表中的歌曲,右側用紅色框線圈出來的是一些需要特別注意的語義結構,見下圖所示:
落網播放列表

以上紅色框線圈出的地方主要有歌曲名稱,歌曲的編號等,這裡並沒有看到歌曲的實際檔案地址,所以我們繼續檢視,點選某一個歌曲就會立即在瀏覽器中播放,這時我們可以看到在Chrome的開發者模式的Network中看到實際請求的播放檔案,如下圖所示:

播放檔案請求

檢視請求地址

根據以上分析我們可以得到播放清單的位置和音樂檔案的路徑,接下來我們通過Python來實現這個目的。

實現爬蟲

Python環境安裝請自行Google

主要依賴第三方庫

主要思路是分成兩部分,第一部分用來發起請求分析出播放列表然後丟到佇列中,第二部分在佇列中逐條下載檔案到本地,一般分析列表速度更快,下載速度比較慢可以藉助多執行緒同時進行下載。
主要程式碼如下:

Python
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 #-*- coding: utf-8 -*-'''by sudo rm -rf  http://imchenkun.com'''importosimportrequestsfrombs4 importBeautifulSoupimportrandomfromfaker importFactoryimportQueueimportthreadingfake=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']# 替換自己的代理IPheaders={'Connection':'keep-alive','User-Agent':fake.user_agent()}defrandom_proxies():ip_index=random.randint(0,len(proxy_ips)-1)res={'http':proxy_ips[ip_index]}returnresdeffix_characters(s):forcin['<','>',':','"','/','\\\\','|','?','*']:s=s.replace(c,'')returnsclassLuooSpider(threading.Thread):def__init__(self,url,vols,queue=None):threading.Thread.__init__(self)print'[luoo spider]'print'='*20self.url=urlself.queue=queueself.vol='1'self.vols=volsdefrun(self):forvol inself.vols:self.spider(vol)print'\\ncrawl end\\n\\n'defspider(self,vol):url=luoo_site+volprint'crawling: '+url+'\\n'res=requests.get(url,proxies=random_proxies())soup=BeautifulSoup(res.content,'html.parser')title=soup.find('span',attrs={'class':'vol-title'}).textcover=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=[]fortrack intrack_names:_id=str(int(track.text[:2]))if(int(vol)<12)elsetrack.text[:2]# 12期前的音樂編號1~9是1位(如:1~9),之後的都是2位 1~9會在左邊墊0(如:01~09)_name=fix_characters(track.text[4:])tracks.append({'id':_id,'name':_name})phases={'phase':vol,# 期刊編號'title':title,# 期刊標題'cover':cover,# 期刊封面'desc':desc,# 期刊描述'track_count':track_count,# 節目數'tracks':tracks# 節目清單(節目編號,節目名稱)}self.queue.put(phases)classLuooDownloader(threading.Thread):def__init__(self,url,dist,queue=None):threading.Thread.__init__(self)self.url=urlself.queue=queueself.dist=distself.__counter=0defrun(self):whileTrue:ifself.queue.qsize()<=0:passelse:phases=self.queue.get()self.download(phases)defdownload(self,phases):fortrack inphases['tracks']:file_url=self.url%(phases['phase'],track['id'])local_file_dict='%s/%s'%(self.dist,phases['phase'])ifnotos.path.exists(local_file_dict):os.makedirs(local_file_dict)local_file='%s/%s.%s.mp3'%(local_file_dict,track['id'],track['name'])ifnotos.path.isfile(local_file):print'downloading: '+track['name']res=requests.get(file_url,proxies=random_proxies(),headers=headers)withopen(local_file,'wb')asf:f.write(res.content)f.close()print'done.\\n'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=5foriinrange(downloader_count):luoo_download=LuooDownloader(luoo_site_mp3,'D:/luoo',queue=spider_queue)luoo_download.setDaemon(True)luoo_download.start()

總結

通過本文我們基本瞭解了網路爬蟲的知識,對網路爬蟲工作原理認識的同時我們實現了一個真實的案例場景,這裡主要是使用一些基礎的第三方Python庫來幫助我們實現爬蟲,基本上演示了網路爬蟲框架中基本的核心概念。通常工作中我們會使用一些比較優秀的爬蟲框架來快速的實現需求,比如 scrapy框架,接下來我會通過使用Scrapy這類爬蟲框架來實現一個新的爬蟲來加深對網路爬蟲的理解!

特別申明:本文所提到的落網是我本人特別喜歡的一個音樂網站,本文只是拿來進行爬蟲的技術交流學習,讀者涉及到的所有侵權問題都與本人無關

相關推薦

爬蟲學習之一簡單網路爬蟲

概述 這是一個網路爬蟲學習的技術分享,主要通過一些實際的案例對爬蟲的原理進行分析,達到對爬蟲有個基本的認識,並且能夠根據自己的需要爬到想要的資料。有了資料後可以做資料分析或者通過其他方式重新結構化展示。 什麼是網路爬蟲 網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社群中間

urllib庫的學習總結(python3網路爬蟲開發實戰專案)

urllib庫是python內建的HTTP請求庫,包含以下四個模組: request:最基本的HTTP請求模組,可以用來模擬傳送請求。只需要給庫方法傳入URL以及額外的引數,就可以模擬實現這個過程了。 error:異常處理模組,如果出現請求錯誤,我們可以捕獲這些異常,然後進行重試或其

Java基於httpclient獲取網頁資料,實現簡單網路爬蟲

1、pom檔案引入httpclient依賴     <dependency>             <groupId>org.apache.httpcompon

基於Jsoup實現的簡單網路爬蟲

之前是完全不會爬蟲的,但是新專案中需要從網頁上爬一大堆的資料,所以就花了一天時間學習了下。主題部分還是很簡單的。 * 既然想要寫博文,那我就要寫的細緻點,對自己對讀者都是一種負責! 什麼是爬蟲? 我所理解的爬蟲就是從網際網路上獲取Url,順著U

【Python】 簡單網路爬蟲實現

引言 網路爬蟲(英語:web crawler),也叫網路蜘蛛(spider),是一種用來自動瀏覽全球資訊網的網路機器人。其目的一般為編纂網路索引。 --維基百科 網路爬蟲可以將自己所訪問的頁面儲存下來,以便搜尋引擎事後生成索引供使用者搜尋。 一般有兩個步驟:1.獲取網頁內

56Python網路爬蟲資源,媽媽再也不用擔心你找不到資源!

本列表包含Python網頁抓取和資料處理相關的庫。 網路相關 通用 urllib - 網路庫(標準庫) requests - 網路庫 grab - 網路庫(基於pycurl) pycurl - 網路庫 (與libcurl繫結) urllib3 - 具有執行緒

學了2天的Python,自己寫了簡單爬蟲,可是爬蟲有什麼用呢?

# -*- coding: UTF-8 -*- import requests import pandas import re import json from bs4 import BeautifulSoup import openpyxl def par

Linux 網路程式設計之一簡單的客戶端伺服器程式

1、服務端#include "includes.h" #include <sys/types.h> #include <sys/socket.h> #include <linux/in.h> #define SERV

用python零基礎寫爬蟲--編寫第一網絡爬蟲

等待 客戶端瀏覽器 身份驗證 1.2 不存在 ssp 地址 執行c ade 首先要說明的是,一下代碼是在python2.7版本下檢測的 一.最簡單的爬蟲程序 --下載網頁 import urllib2 request=urllib2.Request("http://www.

Golang之一簡單的聊天機器人

color func 後退 std gpo 錯誤 main pac hat 翠花,上代碼 package main import ( "bufio" "fmt" "os" "strings" ) func main

爬蟲基本知識及簡單生成爬蟲

(1)爬蟲是什麼:一段自動抓取網際網路資訊的程式,網際網路是URL的互相連線,爬蟲就是從一個URL出發然後走到與它相關的所有URL並且提取需要的資料;價值:獲得更多網際網路資料,得到自己想用的資料; (2)簡單爬蟲構架:爬蟲排程端:URL管理器,包括已經爬取的URL和未訪問的URL,把待爬取的U

如何學習爬蟲,我的爬蟲學習之路,怎樣學好爬蟲的,爬蟲認知篇(1)

          作為一個小白來說,那就是---->我,看那多原理,等於天書,我看不懂,但是為啥是叫了解爬蟲,而不是懂裡邊內容,框架(Scrapy)怎麼寫的,我作為小白知道怎麼用,不就行了嗎,對不對,之後在瞭解深入.

python之一簡單的單例模式

# from 模組名 import 模組裡的方法 #呼叫一個方法 # from 模組名 import * #呼叫所有方法 #單列模式 一個類建立物件是同一個 class Shopping: '''購物

JVMTI開發教程之一簡單的Agent

概述JVM TI是JDK提供的一套用於開發JVM監控, 問題定位與效能調優工具的通用程式設計介面(API)。通過JVMTI,我們可以開發各式各樣的JVMTI Agent。這個Agent的表現形式是一個以c/c++語言編寫的動態共享庫。JVMTI Agent原理: java啟動

IOS學習之一示例弄懂代理(delegate)和協議

轉自http://blog.csdn.net/pony_maggie/article/details/25655443 代理和協議的語法這裡不贅述,自己查資料。 這個demo的思路是這樣的,有一個A類,這個類不是一個基於檢視類,它繼承自NSObject,這個類會啟動

SpringMVC之一簡單的helloworld專案(從配置資訊到請求處理)

首先:建立專案,在使用SpringMVC之前,我們照例需要先匯入springframework的jar包:除了上述的二十個jar包之外,我們還需要一個名為一個如下的jar包:如果不新增這個jar包,執行專案則會出現java.lang.NoClassDefFoundError:

Python 爬蟲:8 常用的爬蟲技巧總結!

用python也差不多一年多了,python應用最多的場景還是web快速開發、爬蟲、自動化運維:寫過簡單網站、寫過自動發帖指令碼、寫過收發郵件指令碼、寫過簡單驗證碼識別指令碼。 爬蟲在開發過程中也有很多複用的過程,這裡總結一下,以後也能省些事情。 1、基本抓取網頁 get方法 imp

爬蟲學習之基於 Scrapy 的爬蟲自動登入

概述 在前面兩篇(爬蟲學習之基於Scrapy的網路爬蟲和爬蟲學習之簡單的網路爬蟲)文章中我們通過兩個實際的案例,採用不同的方式進行了內容提取。我們對網路爬蟲有了一個比較初級的認識,只要發起請求獲取響應的網頁內容,然後對內容進行格式化儲存。很多時候我們抓取到的內容可能會發生重複,

HTML5之一簡單的登入介面

一個簡單的登入介面 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></tit

Leaflet之一簡單的地圖展示

至於為啥要學Leaflet我也不知道為啥,隨便學學,以後可能用的上,Leafleat好小啊1.4M,很輕巧,官網給的API簡單明瞭,很簡單,基本的地圖操作都有,支援瀏覽器和手機客戶端一、檔案引入(這裡用的官網最新的那個18年釋出的) <link href="Scr