爬蟲:趕集網(wǎng)十萬數(shù)據(jù)級別

成果:


僅僅顯示的一部分

代碼在github:
趕集爬蟲

整體思路:
1.爬取page_url焚鲜。


爬取這里面的所有page_url,一共是20個項目

這個基本都是套路恤磷,很容易爬取,然后存在page_url這個數(shù)據(jù)庫中

2.爬取index檢索頁


其中有轉(zhuǎn)轉(zhuǎn)網(wǎng)的頁面牧愁,可以通過全匹配給刪除掉

從page_url拿出來打開的頁面票彪,進入到page_url红淡,把每個預(yù)覽頁面的url給剝離出來存到preview_url這個數(shù)據(jù)庫。必須加上驗證是否是有效頁面降铸。因為你不知道有多少頁在旱,所以就找一下數(shù)字比較大的頁面看看區(qū)別是什么樣的。
我在這里是用了大的頁面沒有page_box這個類推掸,而終止爬取

3.爬取詳情頁面


這個比較好爬桶蝎,因為所有頁面格式是一樣的,正是因為如此這個10W級別的寫的比較輕松

所有的頁面結(jié)構(gòu)是一樣的也就是說谅畅,他們做網(wǎng)站的輕松登渣,所以搞得我們爬取也輕松,就是這個道理毡泻。也就是說胜茧,無論電腦還是飾品分類都是一樣的頁面布局。
這步實現(xiàn)是從preview_url數(shù)據(jù)庫拿出來數(shù)據(jù)來爬取詳細信息然后存儲到info_details仇味。每個條目加上url呻顽,方便以后去重

4.整體思路就是以上,還有一些新手段:

  • 去重就是在數(shù)據(jù)庫檢索有沒有這個數(shù)據(jù)一般我們提取數(shù)據(jù)庫的數(shù)據(jù)是[i['url'] for i in first_grade.find()],這樣就返回了一個列表丹墨,你在用 url in [a,b,c……]這個布爾值來判斷是否需要插入信息

新技能GET:

1.進程池廊遍,

import multiprocessing


def do_calculation(data):
    return data * 2


def start_process():
    print('Starting', multiprocessing.current_process().name)


if __name__ == '__main__':
    inputs = list(range(10))
    print('Inputs  :', inputs)

    # 這個是不用進程池,Python原生的方法
    builtin_output = map(do_calculation, inputs)
    print('Build-In :', [i for i in builtin_output])

    # 用到進程池的方法
    # 整個cpu_count()可以計算cpu內(nèi)核數(shù)带到,不用裝魯大師去查了
    # 開了4個進程池
    pool_size = multiprocessing.cpu_count() * 2
    print('pool_size:', pool_size)
    pool = multiprocessing.Pool(processes=pool_size,
                                initializer=start_process, )

    pool_outputs = pool.map(do_calculation, inputs)
    pool.close()
    pool.join()

    print('Pool outputs:', pool_outputs)

輸出是:

Inputs  : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Build-In : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
pool_size: 4
Starting SpawnPoolWorker-1
Starting SpawnPoolWorker-3
Starting SpawnPoolWorker-2
Starting SpawnPoolWorker-4
Pool outputs: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

自己寫個了東西昧碉,便于自己加深印象:

from multiprocessing import Pool
from time import *


def delay_1(i):
    print('delay_one start{}'.format(i), ctime())
    sleep(2)
    print('delay_one end{}'.format(i), ctime())


def delay_2(i):
    print('delay_two start{}'.format(i), ctime())
    sleep(4)
    print('delay_two end{}'.format(i), ctime())


if __name__ == '__main__':
    print('all start', ctime())
    pool = Pool()
    # 電腦是雙核的,process=2揽惹,可以不用寫
   # 設(shè)置process=4真的可以提升速度被饿,但是好像不推薦
    pool.map(delay_1, [1, 2, 3, 4])
    # 前者結(jié)束后后者開始
    pool.map(delay_2, [1, 2])
    pool.close()
    pool.join()
    print('all end', ctime())

輸出結(jié)果:

all start Wed Aug 10 22:44:55 2016
delay_one start1 Wed Aug 10 22:44:55 2016
delay_one start2 Wed Aug 10 22:44:55 2016
delay_one end1 Wed Aug 10 22:44:57 2016
delay_one start3 Wed Aug 10 22:44:57 2016
delay_one end2 Wed Aug 10 22:44:57 2016
delay_one start4 Wed Aug 10 22:44:57 2016
delay_one end3 Wed Aug 10 22:44:59 2016
delay_one end4 Wed Aug 10 22:44:59 2016
delay_two start1 Wed Aug 10 22:44:59 2016
delay_two start2 Wed Aug 10 22:44:59 2016
delay_two end2 Wed Aug 10 22:45:03 2016
delay_two end1 Wed Aug 10 22:45:03 2016
all end Wed Aug 10 22:45:03 2016

進程池是個什么東西呢?可以看到pool.map(func,literal)的用法就是后面可迭代數(shù)據(jù)加到前面func中搪搏,本來我們一個參數(shù)放到一個函數(shù)運行結(jié)果出來需要2s的話狭握,4個是8s,但是我們開了多進程,默認雙核疯溺,所以進程池是兩個處理器處理數(shù)據(jù)论颅,也就是說一回可以處理2個,時間減半囱嫩,只需要4s恃疯。這是在需要大量迭代數(shù)據(jù)的進程中比較快捷的方法。
pool()之間不阻塞墨闲,一個完成以后開啟另一個
2.split的用處
str = """
1
2
3
4
"""
這樣的打出來是有格式的今妄,所以用str.split(),來處理一下,就返回一個列表每一行就是列表的一個元素

3.增加models
因為兩個py(一個a,一個b)中建立pymongo的話,a、b分別初始化的話會覆蓋掉對方盾鳞,所以增加了models,專用于
數(shù)據(jù)庫初始化犬性,如果在a中要用到models,就在文件a中import models腾仅,然后在a中:
直接models.first_grade.save(data)這樣使用乒裆。

4.import的一些問題,
如果用到A中的一些函數(shù),一定要一個一個寫出來推励,不要from A import *,這樣沒人知道你突然用到某個 函數(shù)是從A中import的鹤耍。
文件test1.py中有兩個函數(shù):a和b,其中b用到了a函數(shù)吹艇。在test2中import了test1以后惰蜜,怎么用a函數(shù)呢?
test1.a()使用受神,用b也是用test1.b(),但是b用到了a芭撞?沒關(guān)系?真的沒關(guān)系!即便在test2中寫from test1 import b鼻听,直接用b(),函數(shù)b()也會引用到a(),而不用我們操心去多添加一行from test2 import a(這行是完全沒有必要的)

5.soup.find()的使用
soup.find('a', 'apple')挑選出來的就是<a class='apple'></a>元素财著,但只是符合的第一個元素,不是列表撑碴,如果
是soup.find_all()才選出所有符合的列表

總結(jié)撑教,能夠爬取10w級別數(shù)據(jù)是因為這些數(shù)據(jù)的info頁面結(jié)構(gòu)是一樣的。因為對于公司方便醉拓,所以對我們也方便伟姐。
爬蟲告一段落了,爬蟲真的沒什么難學的亿卤,基本都是套路愤兵,習慣了就好了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市排吴,隨后出現(xiàn)的幾起案子秆乳,更是在濱河造成了極大的恐慌,老刑警劉巖钻哩,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屹堰,死亡現(xiàn)場離奇詭異,居然都是意外死亡街氢,警方通過查閱死者的電腦和手機扯键,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來珊肃,“玉大人荣刑,你說我怎么就攤上這事扣泊。” “怎么了嘶摊?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長评矩。 經(jīng)常有香客問我叶堆,道長,這世上最難降的妖魔是什么斥杜? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任虱颗,我火速辦了婚禮,結(jié)果婚禮上蔗喂,老公的妹妹穿的比我還像新娘忘渔。我一直安慰自己,他們只是感情好缰儿,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布畦粮。 她就那樣靜靜地躺著,像睡著了一般乖阵。 火紅的嫁衣襯著肌膚如雪宣赔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天瞪浸,我揣著相機與錄音儒将,去河邊找鬼。 笑死对蒲,一個胖子當著我的面吹牛钩蚊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹈矮,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼砰逻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了含滴?” 一聲冷哼從身側(cè)響起诱渤,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谈况,沒想到半個月后勺美,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡碑韵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年赡茸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祝闻。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡占卧,死狀恐怖遗菠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情华蜒,我是刑警寧澤辙纬,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站叭喜,受9級特大地震影響贺拣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捂蕴,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一譬涡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啥辨,春花似錦涡匀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至级乍,卻和暖如春拾酝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卡者。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工蒿囤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崇决。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓材诽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恒傻。 傳聞我的和親對象是個殘疾皇子脸侥,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容