Python 實戰(zhàn):week2 設(shè)計斷點續(xù)傳程序

作業(yè)代碼:

#!/usr/bin/env python
# coding: utf-8

import time

from bs4 import BeautifulSoup
import requests
from pymongo import MongoClient

client = MongoClient('localhost', 27017)
bj58 = client['bj58']
info_links = bj58['links']
detailinfo = bj58['detailinfo']


def get_links_url():
    """獲取列表頁中所有詳情頁的標(biāo)題和鏈接"""
    for num in range(1,117):
        url = "http://bj.58.com/shoujihao/pn{}/".format(num)
        web_data = requests.get(url)
        time.sleep(1)
        detail_soup = BeautifulSoup(web_data.text, 'lxml')
        if num == 1:
            boxlist = detail_soup.select("div.boxlist div.boxlist")[1]
        else:
            boxlist = detail_soup.select("div.boxlist div.boxlist")[0]
        titles = boxlist.select("strong.number")
        links = boxlist.select("a.t")

        for title,link in zip(titles,links):
            data = {"title":title.get_text(), "link":link.get("href")}
            info_links.insert_one(data)

        print "page %s 已完成"% num

# get_links_url()


def get_item_info():
    """獲取詳情頁url,抓取詳情信息"""

    # url 列表
    url_lists = [item['link'] for item in info_links.find()]
    if detailinfo.find().count() > 0:  # 判斷是否中斷過
        item_lists = [item['url'] for item in detailinfo.find()]
        url_lists = set(url_lists)-set(item_lists)  # 獲取未爬取的 url 子集

    for url in url_lists:
        item_data = requests.get(url)
        detail_soup = BeautifulSoup(item_data.text, 'lxml')

        number = list(detail_soup.select("h1")[0].stripped_strings)[0]
        info_list = number.replace('\t','').replace(' ',"").replace('\n\n\n','\n').split("\n")
        # print 'number= ',info_list[0]
        # print 'isp= ', info_list[1]

        price = list(detail_soup.select(".price")[0].stripped_strings)[0].split(' ')[0]
        # print 'price= ', price

        seller = detail_soup.select(".vcard a.tx")[0].get_text()
        # print seller

        telephon = list(detail_soup.select(".arial")[0].stripped_strings)[0]
        # print tele

        data = {"sell_number": info_list[0],
                "isp": info_list[1],
                "price": price,
                "seller": seller,
                "telephon": telephon,
                "url": url
               }

        detailinfo.insert_one(data)
        print "%s 已完成"% str(url)

get_item_info()

作業(yè)項目地址

小結(jié)

  • thread & process

單進程單線程,一張一個人的桌子
單進程多線程魔种,一張多個人的桌子
多進程單線程,多張一個人的桌子
多進程多線程墩衙,多張多個人的桌子

一個進程占用一個CPU核心

deciding between subprocess, multiprocessing and thread in Python?

What is the difference between multiprocessing and subprocess?

subprocess + multiprocessing - multiple commands in sequence

multiprocessing 官方文檔

threading 官方文檔的說明:

CPython的實現(xiàn)細(xì)節(jié):在CPython中,由于全局解釋器鎖GIL的原因,同一時刻只有一個線程可以執(zhí)行Python代碼务嫡。如果想讓應(yīng)用程序更好地利用多核機器的硬件資源,建議使用multiprocessing。不過,如果想同時運行多個I/O密集型任務(wù),threading仍然是一個好的模型漆改。

  • 導(dǎo)入需要的庫

可以幫助 Python 調(diào)用電腦 CPU 的多個內(nèi)核完成任務(wù)

from multiprocessing import Pool

  • 導(dǎo)入自己寫的模塊
from channel_extract import channel_list
from page_parsing import get_links_from
  • 用函數(shù)傳入頁碼
def get_all_links_from():

傳入 channel ,指定頁數(shù)准谚,獲取列表頁的url

  • 創(chuàng)建進程池

所有 CPU 都會從進程池中領(lǐng)取任務(wù)

只需要將函數(shù)放入進程池挫剑,就會被分配給 cpu 執(zhí)行

pool = Pool() # 創(chuàng)建進程池
pool.map(get_all_links_from, channel_list.split())

Pool有一個參數(shù),precesses柱衔,明確要開多少進程樊破。并非進程越多效率越高愉棱。如果不指定,會根據(jù)電腦CPU的內(nèi)核數(shù)量自動分配哲戚。

內(nèi)建函數(shù)map()

pool.map()類似內(nèi)建函數(shù)map()(它只支持一個iterable參數(shù))奔滑。調(diào)用函數(shù)后會被阻塞,直到得到結(jié)果顺少。

  • 創(chuàng)建用來計數(shù)的監(jiān)控程序

導(dǎo)入創(chuàng)建的 集合對象朋其,使用.count()方法

  • iTerm 分屏

command + d

  • 作業(yè)的思考

斷點續(xù)傳程序,假設(shè)在抓取過程中網(wǎng)絡(luò)問題導(dǎo)致程序停止脆炎,設(shè)計一個功能梅猿,保證數(shù)據(jù)庫中抓取的數(shù)據(jù)不會重復(fù)

兩種想法:

  • 第一種

每次抓取一個帖子或一個頁面,在數(shù)據(jù)庫中查詢秒裕,如果有結(jié)果袱蚓,跳過。

這樣似乎效率很低几蜻?

  • 第二種

記錄當(dāng)前位置

  • 最后看了作業(yè)提示:

很棒的實現(xiàn)方式

# 設(shè)計思路:
# 1.分兩個數(shù)據(jù)庫喇潘,第一個用于只用于存放抓取下來的 url (ulr_list);第二個則儲存 url 對應(yīng)的物品詳情信息(item_info)
# 2.在抓取過程中在第二個數(shù)據(jù)庫中寫入數(shù)據(jù)的同時梭稚,新增一個字段(key) 'index_url' 即該詳情對應(yīng)的鏈接
# 3.若抓取中斷响蓉,在第二個存放詳情頁信息的數(shù)據(jù)庫中的 url 字段應(yīng)該是第一個數(shù)據(jù)庫中 url 集合的子集
# 4.兩個集合的 url 相減得出圣賢應(yīng)該抓取的 url 還有哪些


db_urls = [item['url'] for item in url_list.find()]     # 用列表解析式裝入所有要爬取的鏈接
index_urls = [item['url'] for item in item_info.find()] # 所引出詳情信息數(shù)據(jù)庫中所有的現(xiàn)存的 url 字段
x = set(db_urls)                                        # 轉(zhuǎn)換成集合的數(shù)據(jù)結(jié)構(gòu)
y = set(index_urls)
rest_of_urls = x-y                                      # 相減

于是,在自己的代碼中:

url_lists = [item['link'] for item in info_links.find()]
if detailinfo.find().count() > 0:  # 判斷是否中斷過
    item_lists = [item['url'] for item in detailinfo.find()]
    url_lists = set(url_lists)-set(item_lists)  # 獲取未爬取的 url 子集
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哨毁,一起剝皮案震驚了整個濱河市枫甲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扼褪,老刑警劉巖想幻,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異话浇,居然都是意外死亡脏毯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門幔崖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來食店,“玉大人,你說我怎么就攤上這事赏寇〖郏” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵嗅定,是天一觀的道長自娩。 經(jīng)常有香客問我,道長渠退,這世上最難降的妖魔是什么忙迁? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任脐彩,我火速辦了婚禮,結(jié)果婚禮上姊扔,老公的妹妹穿的比我還像新娘惠奸。我一直安慰自己,他們只是感情好恰梢,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布佛南。 她就那樣靜靜地躺著,像睡著了一般删豺。 火紅的嫁衣襯著肌膚如雪共虑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天呀页,我揣著相機與錄音妈拌,去河邊找鬼。 笑死蓬蝶,一個胖子當(dāng)著我的面吹牛尘分,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播丸氛,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼培愁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缓窜?” 一聲冷哼從身側(cè)響起定续,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎禾锤,沒想到半個月后私股,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡恩掷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年倡鲸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黄娘。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡峭状,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逼争,到底是詐尸還是另有隱情优床,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布氮凝,位于F島的核電站羔巢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏罩阵。R本人自食惡果不足惜竿秆,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稿壁。 院中可真熱鬧幽钢,春花似錦、人聲如沸傅是。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喧笔。三九已至帽驯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間书闸,已是汗流浹背尼变。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留浆劲,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓度气,卻偏偏與公主長得像磷籍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子栅盲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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