爬蟲(chóng)初窺

靜態(tài)爬蟲(chóng)和動(dòng)態(tài)爬蟲(chóng)

靜態(tài)爬蟲(chóng):頁(yè)面數(shù)據(jù)的展示不依靠js等和后臺(tái)的交互帅刀。
動(dòng)態(tài)爬蟲(chóng):頁(yè)面的數(shù)據(jù)需要通過(guò)js让腹,ajax等交互才能獲得(完整獲得)。

靜態(tài)爬蟲(chóng)

通過(guò)使用urllib扣溺,beautifulsoup等工具對(duì)下載的頁(yè)面進(jìn)行xml節(jié)點(diǎn)的解析骇窍。

一個(gè)例子(爬取自己的博客的所有blog):

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

from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup

import asyncio

from openpyxl import Workbook
import datetime

wb = Workbook()
worksheet = wb.active

entry_url = 'http://www.radasm.me:8080'

# 插入一行,行數(shù)據(jù)使用list來(lái)表示
@asyncio.coroutine
def save_one_row(ws_name):
    while True:
        l = yield
        if l is not None:
            l.insert(0, datetime.datetime.now())
            worksheet.append(l)
            print('正在保存中锥余。腹纳。。')
            wb.save(ws_name)

pre_url = 'http://www.radasm.me:8080'

@asyncio.coroutine
def begin_scrap(sa, url):
    try:
        html = urlopen(url)
    except HTTPError as e:
        print(e)
    bsobj = BeautifulSoup(html)
    posts = bsobj.find_all(class_='post')
    for post in posts:
        l = []
        blog_href = post.find(class_='title').find('a').attrs['href']
        blog_name = post.find(class_='title').find('a').get_text()
        blog_time = post.find(class_='time').find(class_='date').get_text()
        l.append(blog_time)
        l.append(blog_name)
        l.append('%s%s' % (pre_url, blog_href))
        sa.send(l)
        print('1條數(shù)據(jù)抓取完畢驱犹,正在喚醒save')
        yield

    if posts is not None:
        # 進(jìn)入下一個(gè)頁(yè)面進(jìn)行抓取
        next_url = '%s%s' % (entry_url, bsobj.find(class_='pager').find('a').attrs['href'])
        print('開(kāi)始抓取下一個(gè)頁(yè)面:next is %s' % next_url)
        begin_scrap(sa, next_url)

sa = save_one_row('haha.xls')
sa.send(None)
loop = asyncio.get_event_loop()
loop.run_until_complete(begin_scrap(sa, entry_url))
loop.close()

這種靜態(tài)爬蟲(chóng)比較簡(jiǎn)單嘲恍,只要分析清楚頁(yè)面結(jié)構(gòu)就可以了

注意點(diǎn):和協(xié)程配合使用;把需要捕獲的異常盡量寫全雄驹,整體代碼的邏輯清晰佃牛;使用mobile版本的地址進(jìn)行更快的解析。

動(dòng)態(tài)爬蟲(chóng)

比價(jià)麻煩医舆,在沒(méi)有學(xué)習(xí)scrapy框架之前(覺(jué)得需要慢慢來(lái)自己摸索的前進(jìn)~)俘侠,我選擇了selenium進(jìn)行數(shù)據(jù)的爬取象缀。

這是一個(gè)例子的片段:

@asyncio.coroutine
def begin(save):
    coun = 2
    driver = webdriver.Firefox()
    driver.get(entry_url)
    driver.find_element_by_xpath('//*[@id="reSearchForm"]/div/div[3]/input').click()
    time.sleep(2)
    for i in range(2):
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(5)
    flights = driver.find_element_by_xpath('//*[@id="J_flightlist2"]')
    children = flights.find_elements_by_xpath('div')
    print(children)
    for child in children:
        l = []
        # 航班號(hào)
        flight_id = child.get_attribute('id').strip()
        if pattern.search(flight_id) is not None:
            # 計(jì)劃?rùn)C(jī)型
            flight_type = child.find_element_by_xpath('table/tbody/tr/td[1]/div[2]/span').text.strip()
            # 起飛時(shí)刻
            flight_dtime = child.find_element_by_xpath('table/tbody/tr/td[2]/div[1]/strong').text.strip()
            # 起飛機(jī)場(chǎng)
            flight_dport = child.find_element_by_xpath('table/tbody/tr/td[2]/div[2]').text.strip()
            # 到達(dá)時(shí)刻
            flight_atime = child.find_element_by_xpath('table/tbody/tr/td[4]/div[1]/strong').text.strip()
            # 到達(dá)時(shí)刻
            flight_aport = child.find_element_by_xpath('table/tbody/tr/td[4]/div[2]').text.strip()
            # 幣種
            money_type = child.find_element_by_xpath('table/tbody/tr/td[8]/span/dfn').text.strip()
            # 最低價(jià)格
            flight_lprice = child.find_element_by_xpath('table/tbody/tr/td[8]/span').text.strip()[1:]
            price = int(flight_lprice[1:])
            # 折扣
            discount = price / FULL_PRICE
            l.append(flight_id)
            l.append(flight_type)
            l.append(flight_dtime)
            l.append(flight_dport)
            l.append(flight_atime)
            l.append(flight_aport)
            l.append(money_type)
            l.append(flight_lprice)
            l.append(discount)
            save.send(l)
            yield

從攜程上爬取航班的價(jià)格情況。

技術(shù)點(diǎn)

****XPATH****的使用方法:

selenium最常見(jiàn)的解析節(jié)點(diǎn)的方法就是使用xpath進(jìn)行解析爷速。

//*[@id="reSearchForm"]/div/div[3]/input

找到文檔中名為“reSearchForm”的節(jié)點(diǎn)央星,并逐步向下解析。其中類似”input[number]“中的number的起始數(shù)字是”1“惫东,這點(diǎn)需要注意莉给。

****time.sleep()****

在經(jīng)過(guò)類似于”click()“等事件之后,需要主動(dòng)的進(jìn)行time.sleep()的處理廉沮。

****頁(yè)面的拖拽****

有些js需要經(jīng)過(guò)頁(yè)面的拖拽才能從后臺(tái)抓取數(shù)據(jù)禁谦,需要代碼中進(jìn)行拖拽,例如:

for i in range(2):
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(5)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末废封,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丧蘸,更是在濱河造成了極大的恐慌漂洋,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件力喷,死亡現(xiàn)場(chǎng)離奇詭異刽漂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)弟孟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門贝咙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拂募,你說(shuō)我怎么就攤上這事庭猩。” “怎么了陈症?”我有些...
    開(kāi)封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蔼水,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我录肯,道長(zhǎng)趴腋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任论咏,我火速辦了婚禮优炬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厅贪。我一直安慰自己蠢护,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布卦溢。 她就那樣靜靜地躺著糊余,像睡著了一般秀又。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贬芥,一...
    開(kāi)封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天吐辙,我揣著相機(jī)與錄音,去河邊找鬼蘸劈。 笑死昏苏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的威沫。 我是一名探鬼主播贤惯,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼棒掠!你這毒婦竟也來(lái)了孵构?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烟很,失蹤者是張志新(化名)和其女友劉穎颈墅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體雾袱,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恤筛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芹橡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毒坛。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖林说,靈堂內(nèi)的尸體忽然破棺而出煎殷,到底是詐尸還是另有隱情,我是刑警寧澤腿箩,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布蝌数,位于F島的核電站,受9級(jí)特大地震影響度秘,放射性物質(zhì)發(fā)生泄漏顶伞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一剑梳、第九天 我趴在偏房一處隱蔽的房頂上張望唆貌。 院中可真熱鬧,春花似錦垢乙、人聲如沸锨咙。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)酪刀。三九已至粹舵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骂倘,已是汗流浹背眼滤。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留历涝,地道東北人诅需。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像荧库,于是被迫代替她去往敵國(guó)和親堰塌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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