標籤:

Python爬蟲學習?

想請教一下大家都是通過哪些途徑學習python爬蟲的?新手有點無從下手


什麼是網路爬蟲

網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在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

主要依賴第三方庫

Requests(http://www.python-requests.org) 用來發起請求
BeautifulSoup(bs4) 用來解析HTML結構並提取內容
faker(http://fake-factory.readthedocs.io/en/stable/)用來模擬請求UA(User-Agent)

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

Python123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119#-*- coding: utf-8 -*-by sudo rm -rf http://imchenkun.comimport osimport requestsfrom bs4 import BeautifulSoupimport randomfrom faker import Factoryimport Queueimport 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 ] # 替換自己的代理IPheaders = { 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 \ncrawl end\n\n def spider(self, vol): url = luoo_site + vol print crawling: + url + \n 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期前的音樂編號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) 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.\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 = 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()

以上代碼執行後結果如下圖所示

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

總結

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

最後:我有建立一個python學習交流群,在群里大家相互幫助,相互關心。相互分享知識,多一個人多一個想法,只有人多的時候遇到問題才會有更多的人幫你解決問題,如果你也是願意分享,不是單純的伸手黨我歡迎你來群里,先在搜索框裡面加483在加上546 最後是416 這樣你就可以找到組織大家一起來分享

快速學習python交流總群:619307290 &>483546416


1 爬蟲是互聯網上最常見的一種東西了吧。
爬蟲這東西每天都在網上爬大量的信息,各大搜索引擎廠商每天都有上百萬的爬蟲在網路上活動,這些爬蟲的作用就是給搜索引擎採集互聯網上最新的內容,採集來的內容經過分類、加工之後,進入搜索引擎的索引。這是爬蟲最常見的應用。
關於搜索引擎的理論非常多,應該已經形成系統的理論和方法了。這裡不再多追求搜索引擎的細節,只來看看爬蟲如何爬有效的信息。
ps. 這個博客已經很久沒有更新了。現在時間越來越少,平時鮮有時間來更新博客了。
最近某人發現,python其實是一種很適合寫爬蟲的語言,而且python越用越順手。現在若是有人問我「c++和c#學哪一個?「之類的問題的時候,我一定會說,學python吧,因為生命短暫,你應該學習python。
所謂爬蟲,就是把網頁的html下載下來,然後從裡面提取出來有用的信息,這些有用的信息一般就是正文,圖片,鏈接一類的信息。
針對特定網站的爬蟲就更好寫了,用正則表達式,把網頁里的鏈接信息找到,然後找到需要的信息,保存在本地,然後進入下一個鏈接重複上一次的過程。
下面的腳本演示如何從加菲貓的官網上把從1978年至今的所有漫畫全部下載下來

import os,urllib,urllib2,re

hosts = "http://www.gocomics.com"
#initpos = "/mobile/garfield/1978/06/19"
initpos ="/mobile/garfield/1979/08/08"
pname = re.compile(&.+?&(.*?)&&)
pcomic = re.compile(&)
pnext = re.compile(&)

def getpage(url):
print url
req = urllib2.Request(url)
req.add_header("User-Agent","Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0")
req.add_header("If-None-Match","c1858c2845ca9501136ca83d624f8d4d")
u = urllib2.urlopen(req).read()
return u

def getnextpos(content,patten):
r = patten.findall(content)
for x in r:
print find next: ,x
return x

def savecomic(content,patten):
r = patten.findall(content)
print find commic:,r
r2 = pname.findall(content)
print find name:,r2
urlcomic = r[0]
u = urllib.urlopen(urlcomic).read()
name = r2[0].replace( ,).split(,)
year = name[-1]
day = name[-2]
filename = test.jpg
if not os.path.exists(year):
os.makedirs(year)
# is gif file ,the name the file as gif
if ((u[0] is G) and (u[1] is I) and (u[2] is F)):
filename = year+day+.gif
else:
filename = year+day+.jpg
f = file(year+"/"+filename,"wb+")
f.write(u)
f.close()

def main():
url = hosts+initpos
while(True):
c = getpage(url)
savecomic(c,pcomic)
u = getnextpos(c,pnext)
if u is None:
break
else:
url = hosts+u

if __name__ == __main__:
main()

2

想學習python的爬蟲,除了python的四大經典爬蟲模塊外,那就不得不說說scrapy了,scrapy簡單來說就是為了爬取我們想要的數據而編寫的一個應用框架。更專業點的說法是:scrapy是python開發的一個為了爬取網站數據,提取結構性數據而編寫的應用框架,可以應用在數據挖掘、信息處理、存儲歷史數據等一些列的程序中,框架內包含的各種介面,可以讓我們靈活的將其應用於各種需求中。

那麼,scrapy到底為我們提供了哪些高效的特性來簡化我們的工作呢:

對html,xml源數據的選擇和提取的支持,提供了selector選擇器和Xpath表達式進行處理,使用正則表達式來提取數據。提供互動式的shell終端,為編寫過程中驗證部分提取數據提供了便利(selector、xpath)通過feed為導出的數據提供了多種格式(json、csv、xml),多種存儲端(ftp、s3、本地文件系統)的內置支持。提供一些列在spider之間共享的可復用的過濾器即Item Loaders,內置的服務可以更好的進行智能文件爬取數據。針對非英語語系中不標準或者錯誤的編碼聲明,提供了自動檢測以及健壯的編碼支持。具有高擴展性,通過使用signals,使用設計好的API如中間件、extensions、pipelines來實現自己所需的功能。內置的中間件及擴展可以為cookies and session處理、Http壓縮、HTTP認證、HTTP緩存、user-agent、robots.txt等功能提供支持。內置Telent終端,通過在Scrapy進程中鉤入Python終端,使您可以查看並調試爬蟲。

網路上最流行的scrapy架構為:

Scrapy Engine(爬蟲引擎):核心部分,用來處理整個系統的數據流。scheduler(調度器):用來接收引擎發過來的requests,並在引擎再次發來請求的時候,返回信息。Downloader(下載器):從scheduler處獲取目標網頁數據,並將數據返回給spiderSpiders(蜘蛛):主要用它指定域名和網頁的解析規則,並編寫用於分析經response返回的item的類以及額外跟進的URL類。每個Spider負責處理相應的網站。Item Pipeline(項目管道):負責處理spiders提取出來的item,並對其進行驗證、存儲。Downloader Middlewares(下載器中間件):位於Scrapy engine和downloader之間的鉤子,通過插入自定義的代碼,來擴展scrapy的功能,並處理Scrapy引擎與下載器之間的requests和response。Spider Middlewares(蜘蛛中間件):介於Scrapy engine和spider之間的鉤子,主要工作是處理spide的響應輸入和請求輸出。Scheduler Middlewares(調度中間件):介於Scrapy engine和scheduler之間的鉤子,從Scrapy引擎發送到調度的請求和響應。

整個爬蟲的工作流程可簡單理解為:

從初始URL開始,Scheduler會將其交給Downloader進行下載,Spider會對Downloader下載下來的數據進行分析。經Spider的分析有兩種結果:如果是需要進一步抓取的鏈接,則這些東西會被傳回Scheduler,;另一種是需要保存的數據,則被送到Item Pipeline那裡經第三步,如果是第一種則再次回到第一步進行。如果是第中則對數據進行後期處理(詳細分析、過濾、存儲等)。另外,在數據流動的通道里還可以安裝各種中間件,進行必要的處理。

而在爬蟲的過程中,數據流懂得過程為:

引擎按照給定的初始網址,打開網站,找到處理該網站的Spider並向Spider請求要爬取的第一個網頁地址。引擎獲得地址後,使用scheduler進行request。處理完第一個網址後,引擎向調度器請求下一個目標網址。scheduler向引擎返回一個新的網址,引擎通過下載中間件將該網址轉給downloader。downloader繼續從網路中獲取所需數據,下載完成後,返回一個response,攜帶者這些數據通過下載中間件流向引擎。引擎將收到的response通過Spider中間件流向Spider,交由Spider處理。Spider處理這個response並返回爬取到item或者新的request給引擎。引擎如果收到的是item則將其流向item Pipeline引擎如果收到的是新的request,則將其發向調度器。重複上述操作,直至沒有新的request,引擎關閉該網站,此次爬取結束。

本期對scrapy的簡單介紹就到這裡,以後的文章將會從項目入手學習scrapy,如果你對scrapy也感興趣,可以關注一下以便系統為您繼續推薦。謝謝!

自己多問下為什麼學python

如果一門語言沒有改變你的編程思維,那麼它不值得你去學習」。如果這麼說,我們大學的時候,學習了c,c++,java,C#,算是值得學習么?很多時候是不值得,我覺得我們大學的課程就是用java,c#,c++把"C程序設計"又上了一遍.

這是因為,學校的老師會C和java之類的,所以要跟著規矩開這門課,(這也就是為什麼,許多學校還在教vb,),這也就是為什麼,你所以為的一樣就是大家都有For都有while,都有switch..都有Class...都有int 都有float,所謂的不一樣就是用C有指針,java沒有,這就是為什麼教育是失敗的,這也就是為什麼,我目前認識的幾個編程大牛

python的優點:簡單 我所說的簡單,是相比於象C和C++這樣的語言,你為了編程,要學習許多偏底層的東西.在比如,你在學習一個新的編程範式,或者想要馬上做個例子看看,試驗某個API,如果你是寫java的,你不得不去寫一個main,寫一些構造,即使有IDE這樣的東西,能夠為你帶來代碼生成器,而我做得就是寫一段「腳本」,或者打開python互動式解釋器就行了。

自己認識的python朋友出去工作,工資比較高,然後自己又剛剛好是會python所以選擇學習python,這樣的人比較危險但是也比較有激勵,還有就是覺得python比其他開發語言好用。

學完python前景會咋樣

其實我個人是很看好python未來的就業前景的,因為我認識太多的工程師都已經在學python,很多都是月收入大幾萬的

我個人也並非一直用python。前些年主要用c/c++以及java開發一些通信,移動系統,互聯網通信。近3年開始才轉向python。坦白的說,這可能與你相處的公司以及環境不大一樣。隨便舉個例子,google的protocol buffer協議一出來就具有c++/python/java三種語言支持。google的廣告系統早在03,04年左右就一併對python進行了webservice支持,大部分涉及基礎核心系統的公司,都開始對python進行了擴展支持。甚至開源社區的postgresql資料庫,除了自身的ansi SQL,pgsql,pg/TCL,PG/PERL之外對python進行了內嵌支持,唯獨卻沒有呼聲很高的java。在FREEBSD(MIT)/LINUX(GPL)平台上,對java可能排斥性比較大,但綜合而言,目前python發展還沒有java那種普及,主要是python大部分工作仍然是在較為深入地系統層和框架層做設計開發,例如django,SQLAlchemy,fail2ban,mail郵件系統,twisted等等。這部分對於那種習慣應用前輩們框架的編碼人員而言,缺乏創造力的他們根本無法適用這種開發。尤其在python涉及一些系統層面需要有較強的c/c++能力,這部分人在國內要麼就累得要死沒時間,要麼就啥都不會就會拷貝代碼,而國內公司也鮮有主動去做這部分基礎勞動的,大多都是等別人做好了在直接拿來用,所以造就了任何技術性的東西出來,國內都是先等等看,然後抄襲應用。

大環境如此,但千萬誤認為先等等看吧。對於一個技術人員而言,缺乏對新技術的渴望與熱情,這是一種非常危險的事情。我工作8年了,按照國內很多的人的說法早已不做代碼了,但又一次在聽一個老外的演講,他說他50多歲仍然每天堅持寫代碼,了解最新的動態,所以他才能做到他們公司的首席科學家,因此它才能時刻指導項目團隊前進並保證項目的質量。他坦言對於一個不寫代碼並且不了解最新的技術動態的技術人員或者技術團隊的負責人而言,這種團隊也就足夠做作小項目,一旦壓力和項目過大,就會有很多問題漏出來。

對於新人而言,無論學習什麼技術,都要以鼓勵的姿態出現。太多用薪水和你個人所看到的現狀去衡量一門技術,那絕對是欠缺眼光的。任何一門技術,一旦有人學習,他有可能逐漸成為這個領域的專家,即便再濫再沒有人用的開發語言技術,他也有可能就是明日的奠基者或者大師。

自己如何確定目標

在生活中學會不斷挖掘自己的潛力。我們都是一個普通人,可能並不清楚自己到底在哪方面佔有優勢。所以,學著在生活中找到自己的優勢,並根據優勢選擇一定的就業方向。

不隨波逐流。不要看周圍的人做什麼,自己就做什麼,也許別人做的並不適合你。別人的優勢很可能會成為你的劣勢。所以,堅定自己的想法,讓自己知道那些方面適合自己,自己可以勝任。

不斷嘗試可能成為自己的優勢。你不知道什麼適合自己,所以才要大膽、勇敢地嘗試。找到一種可以屬於你的獨特的優勢。

堅定信念。一旦你堅定了自己的信念,就不要被別人的意見或是諷刺或是嘲笑所干擾。別人不是你,不懂的你在想什麼,不清楚你開始這件事的源頭。你的事情,不了解你的人,沒有資格輕易評說。

不茫然,不多想。別讓太多的事干擾到你奮鬥下去的信念。夢想不容許太多的雜念。那些雜念只會讓你的心愈來愈脆弱,多為一個人考慮,到頭來,傷害的還是自己。

選擇自己學習方法

每個人都有適合自己的方法,有的人去選擇自學,有的人選擇看視頻學習,有的人選擇報名培訓班,那在這個時候,你就要自己考慮清楚,到底那樣對的幫助是最大的,個人覺得是跟著培訓班最好的,畢竟人家的實戰項目多,我們學軟體開發的都知道實戰項目對於學好一門語言是 很重要的。

學習python有那些誤區

具體裡面的誤區非常的多,那些就不需要我去寫出來,我給你說的一般都是心態的問題,首先一個覺得自己會java和c++,然後我學習python就很牛,但是你要知道語言是有很多相同的地方,但是不是通用,一定要自己學習的仔細。還有一種就是覺得我不會英語,我要先去把英語學習好在來學python。因為自己想還壞主意然後學習,這樣的都是容易找進誤區的。

怎麼樣才能學好python

學好python你需要一個良好的環境,一個優質的開發交流群,群里都是那種相互幫助的人才是可以的,我有建立一個python學習交流群,在群里我們相互幫助,相互關心,相互分享內容,這樣出問題幫助你的人就比較多,群號是483,還有546,最後是416,這樣就可以找到大神聚合的群,如果你只願意別人幫助你,不願意分享或者幫助別人,那就請不要加了,你把你會的告訴別人這是一種分享。


一旦決定要學習,那就不要猶豫,不要多想。Go and do it

先看官方模塊文檔比如requests 然後去搜點爬蟲小項目,,看看別人怎麼寫,之後自然自己寫幾個。

一路上你會逐步遇到更多問題,比如請求偽造,數據抽取,信息存取,分散式多進程多線程,然後對方反爬蟲怎麼處理,遇到的問題就慢慢查一路實踐一路把所經歷的都寫成博客記錄下來。

我就是如此一路走來。

因此形成了這份博客:http://www.urlteam.org 裡面逐步積累百來篇技術文章

也形成了這份有300+stat的github開源項目:越來越多的網站具有反爬蟲特性,有的用圖片隱藏關鍵數據,有的使用反人類的驗證碼,建立反反爬蟲的代碼倉庫,通過與不同特性的網站做鬥爭(無惡意)提高技術。(歡迎提交難以採集的網站)

祝你好運,我博客中有諸多實踐項目和技術總結,可以去看看。


當你Python語法基礎概念都清楚,明白什麼是HTTP協議,什麼是爬蟲,什麼是HTML,什麼是json,什麼是Cookie,什麼是Session,什麼是Ajax,什麼是資料庫,最好懂點兒JS的時候……

寫爬蟲和寫web其實都是翻一翻要用的模塊/框架的文檔的事兒……所以說基礎很重要。


我是一個從零開始自學的人,3個月的自學剛找到工作,學習中看了N多大神的回答,也該回饋一下知乎了,現在能夠爬去簡單的網頁,我只能告訴你怎麼入門。深入需要你自己研究。

首先確定你的Pyhon基礎,我不知道你Python基礎,所謂的基礎也就是些列表,字典,元組的用法,沒關係,其實不管有沒有基礎都不重要。

我不知道你用的Python版本,我默認你用的Python3。

簡單的網頁你只需要用到兩個庫。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

先說例子在說庫:

import requests
from bs4 import BeautifulSoup
url = https://www.baidu.com
re = requests.get(url)
soup = BeautifulSoup(re.text,lxml)
soup.title

這就是一個最簡單的爬蟲

運行一下

第一次編碼問題沒有顯示正常,這也就是為什麼用Python3的原因,一句話就能搞定

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

requests和BeautifulSoup

1.requests

請求方式:(括弧裡面加網址)
Import requests

requests.get()
requests.post()
Requests.put()
Requests.delete()
Requests.head()
Requests.options()
很麻煩是不是,其實你一般只用的到兩個,get和post。而最最常用的就是get。

這就最簡單的請求到一個網址了,至於怎麼解析json,怎麼獲取二進位數據,怎麼用post請求,狀態碼的判斷今天不寫了,以後陸續更新到微信公眾號或知乎,咱們只講最簡單的。

2.beautifulsoup 他是一個靈活方便的網頁解析庫

解析庫

parser

lxml

xml

html5lib

他有這麼多解析庫,咱們現在也只需要用到第一個。

選擇器也有很多,也說最簡單的。

一:標籤選擇器:通過標籤名字取得

1.選擇元素

soup.title

soup.head

soup.p 只會輸出第一個p標籤

這樣就能吧你需要的元素選擇出來。

先這樣吧。。。。。。

第一次回答,也附上二維碼圖片,以後陸陸續續寫點東西與大家交流學習。哈哈

http://weixin.qq.com/r/Uj_CmqrE1Perre7592pA (二維碼自動識別)


今天剛開課:Python網路爬蟲與信息提取_中國大學MOOC(慕課)

非常好!!!


Scrapy 爬蟲框架有個新手教程 Scrapy Tutorial - Scrapy 1.3.2 documentation


推薦閱讀:

TAG:Python入門 |