python數(shù)據(jù)爬取與寫入

以爬取NASDAQ的股票數(shù)據(jù)為例

依賴

from lxml import html //獲取網(wǎng)頁信息
import requests //地址請求數(shù)據(jù)
from time import sleep //延時用
import json //生成json
import argparse //python 執(zhí)行參數(shù)讀取 暫時不用
from random import randint //生成延時隨機(jī)數(shù)
import pymongo //寫入mongodb

獲取數(shù)據(jù)

設(shè)置請求頭

headers = {
        "Referer": "http://www.nasdaq.com",
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36"
    }

請求網(wǎng)頁數(shù)據(jù)

url = "http://www.nasdaq.com/symbol/%s" % (ticker)
response = requests.get(url, verify=False)
print("respose code:%d" % (response.status_code))
if response.status_code != 200:
    raise ValueError("Invalid Response Received From Webserver")

解析和組裝數(shù)據(jù)(解析規(guī)則參考html.fromstring.xpath)

parser = html.fromstring(response.text)
xpath_head = "http://div[@id='qwidget_pageheader']//h1//text()"
xpath_key_stock_table = '//div[@class="row overview-results relativeP"]//div[contains(@class,"table-table")]/div'
xpath_open_price = '//b[contains(text(),"Open Price:")]/following-sibling::span/text()'
xpath_open_date = '//b[contains(text(),"Open Date:")]/following-sibling::span/text()'
xpath_close_price = '//b[contains(text(),"Close Price:")]/following-sibling::span/text()'
xpath_close_date = '//b[contains(text(),"Close Date:")]/following-sibling::span/text()'
xpath_key = './/div[@class="table-cell"]/b/text()'
xpath_value = './/div[@class="table-cell"]/text()'
raw_name = parser.xpath(xpath_head)
key_stock_table = parser.xpath(xpath_key_stock_table)
raw_open_price = parser.xpath(xpath_open_price)
raw_open_date = parser.xpath(xpath_open_date)
raw_close_price = parser.xpath(xpath_close_price)
raw_close_date = parser.xpath(xpath_close_date)

company_name = raw_name[0].replace("Common Stock Quote & Summary Data", "").strip() if raw_name else ''
open_price = raw_open_price[0].strip() if raw_open_price else None
open_date = raw_open_date[0].strip() if raw_open_date else None
close_price = raw_close_price[0].strip() if raw_close_price else None
close_date = raw_close_date[0].strip() if raw_close_date else None
# Grabbing ans cleaning keystock data
for i in key_stock_table:
    key = i.xpath(xpath_key)
    value = i.xpath(xpath_value)
    key = ''.join(key).strip().replace(".", "_")
    value = ' '.join(''.join(value).split())
    key_stock_dict[key] = value

    nasdaq_data = {
        "company_name": company_name,
        "ticker": ticker,
        "url": url,
        "open_price": open_price,
        "open_date": open_date,
        "close_price": close_price,
        "close_date": close_date,
        "key_stock_data": key_stock_dict
   }
return nasdaq_data

主函數(shù)執(zhí)行

symbols = ['aapl', 'gluu', 'mu', 'ntap', 'msft', 'intc', 'znga', 'csco', 'siri', 'jd', 'fb', 'nvda', 'bl', 'ftnt', 'chrs', 'loco', 'catm', 'cnce', 'fizz', 'acor', 'fldm', 'sptn', 'cent', 'xent', 'adap', 'gpro', 'brks', 'sgms', 'iova', 'aaon', 'eigi', 'amzn', 'nflx', 'tsla']
    for ticker in symbols:
        print("Fetching data for %s" % (ticker))
        scraped_data = parse_finance_page(ticker)
        print("Writing scraped data to output file")
        with open('%s-summary.json' % (ticker), 'w') as fp:
            json.dump(scraped_data, fp, indent=4, ensure_ascii=False)
        myclient = pymongo.MongoClient('mongodb://localhost:27107/')
        mydb = myclient['resthub']
        mycol = mydb["stocks"]
        x = mycol.insert_one(scraped_data)
        print(x.inserted_id)

結(jié)果

Fetching data for aapl
respose code:200
Parsing http://www.nasdaq.com/symbol/aapl
Writing scraped data to output file
5d44642d79c3f9765ab465fa
Fetching data for gluu
respose code:200
Parsing http://www.nasdaq.com/symbol/gluu
Writing scraped data to output file
5d44642f79c3f9765ab465fc
Fetching data for mu
respose code:200
Parsing http://www.nasdaq.com/symbol/mu
Writing scraped data to output file
5d44643179c3f9765ab465fe
Fetching data for ntap
respose code:200
Parsing http://www.nasdaq.com/symbol/ntap
Writing scraped data to output file
5d44643579c3f9765ab46600

需要mongodb已啟動在端口27107

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末危虱,一起剝皮案震驚了整個濱河市凌停,隨后出現(xiàn)的幾起案子雳灾,更是在濱河造成了極大的恐慌,老刑警劉巖傀蚌,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件框全,死亡現(xiàn)場離奇詭異棍鳖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)答朋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門贷揽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梦碗,你說我怎么就攤上這事禽绪。” “怎么了洪规?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵印屁,是天一觀的道長。 經(jīng)常有香客問我斩例,道長雄人,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任念赶,我火速辦了婚禮础钠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叉谜。我一直安慰自己旗吁,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布停局。 她就那樣靜靜地躺著很钓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪董栽。 梳的紋絲不亂的頭發(fā)上码倦,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音锭碳,去河邊找鬼袁稽。 笑死,一個胖子當(dāng)著我的面吹牛工禾,可吹牛的內(nèi)容都是我干的运提。 我是一名探鬼主播蝗柔,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼闻葵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了癣丧?” 一聲冷哼從身側(cè)響起槽畔,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胁编,沒想到半個月后厢钧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳞尔,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年早直,在試婚紗的時候發(fā)現(xiàn)自己被綠了寥假。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡霞扬,死狀恐怖糕韧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喻圃,我是刑警寧澤萤彩,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站斧拍,受9級特大地震影響雀扶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肆汹,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一愚墓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昂勉,春花似錦转绷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谴返,卻和暖如春煞肾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗓袱。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工籍救, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渠抹。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓蝙昙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梧却。 傳聞我的和親對象是個殘疾皇子奇颠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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