最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python多線程+代理池爬取天天基金網(wǎng)、股票數(shù)據(jù)過程解析

 更新時間:2019年08月13日 09:23:09   作者:孤鳥  
這篇文章主要介紹了python多線程+代理池爬取天天基金網(wǎng)、股票數(shù)據(jù)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

簡介

提到爬蟲,大部分人都會想到使用Scrapy工具,但是僅僅停留在會使用的階段。為了增加對爬蟲機制的理解,我們可以手動實現(xiàn)多線程的爬蟲過程,同時,引入IP代理池進行基本的反爬操作。

本次使用天天基金網(wǎng)進行爬蟲,該網(wǎng)站具有反爬機制,同時數(shù)量足夠大,多線程效果較為明顯。

技術(shù)路線

  • IP代理池
  • 多線程
  • 爬蟲與反爬

編寫思路

首先,開始分析天天基金網(wǎng)的一些數(shù)據(jù)。經(jīng)過抓包分析,可知:
./fundcode_search.js包含所有基金的數(shù)據(jù),同時,該地址具有反爬機制,多次訪問將會失敗的情況。

同時,經(jīng)過分析可知某只基金的相關(guān)信息地址為:fundgz.1234567.com.cn/js/ + 基金代碼 + .js

分析完天天基金網(wǎng)的數(shù)據(jù)后,搭建IP代理池,用于反爬作用。點擊這里搭建代理池,由于該作者提供了一個例子,所以本代碼里面直接使用的是作者提供的接口。如果你需要更快速的獲取到普匿IP,則可以自行搭建一個本地IP代理池。

  # 返回一個可用代理,格式為ip:端口
  # 該接口直接調(diào)用github代理池項目給的例子,故不保證該接口實時可用
  # 建議自己搭建一個本地代理池,這樣獲取代理的速度更快
  # 代理池搭建github地址https://github.com/1again/ProxyPool
  # 搭建完畢后,把下方的proxy.1again.cc改成你的your_server_ip,本地搭建的話可以寫成127.0.0.1或者localhost
  def get_proxy():
    data_json = requests.get("http://proxy.1again.cc:35050/api/v1/proxy/?type=2").text
    data = json.loads(data_json)
    return data['data']['proxy']

搭建完IP代理池后,我們開始著手多線程爬取數(shù)據(jù)的工作。一旦使用多線程,則需要考慮到數(shù)據(jù)的讀寫順序問題。這里使用python中的隊列queue進行存儲基金代碼,不同線程分別從這個queue中獲取基金代碼,并訪問指定基金的數(shù)據(jù)。由于queue的讀取和寫入是阻塞的,所以可以確保該過程不會出現(xiàn)讀取重復(fù)和讀取丟失基金代碼的情況。

  # 將所有基金代碼放入先進先出FIFO隊列中
  # 隊列的寫入和讀取都是阻塞的,故在多線程情況下不會亂
  # 在不使用框架的前提下,引入多線程,提高爬取效率
  # 創(chuàng)建一個隊列
  fund_code_queue = queue.Queue(len(fund_code_list))
  # 寫入基金代碼數(shù)據(jù)到隊列
  for i in range(len(fund_code_list)):
    #fund_code_list[i]也是list類型,其中該list中的第0個元素存放基金代碼
    fund_code_queue.put(fund_code_list[i][0])

現(xiàn)在,開始編寫如何獲取指定基金的代碼。首先,該函數(shù)必須先判斷queue是否為空,當(dāng)不為空的時候才可進行獲取基金數(shù)據(jù)。同時,當(dāng)發(fā)現(xiàn)訪問失敗時,則必須將我們剛剛?cè)〕龅幕鸫a重新放回到隊列中去,這樣才不會導(dǎo)致基金代碼丟失。

  # 獲取基金數(shù)據(jù)
  def get_fund_data():

    # 當(dāng)隊列不為空時
    while (not fund_code_queue.empty()):

      # 從隊列讀取一個基金代碼
      # 讀取是阻塞操作
      fund_code = fund_code_queue.get()

      # 獲取一個代理,格式為ip:端口
      proxy = get_proxy()

      # 獲取一個隨機user_agent和Referer
      header = {'User-Agent': random.choice(user_agent_list),
           'Referer': random.choice(referer_list)
      }
      try:
        req = requests.get("http://fundgz.1234567.com.cn/js/" + str(fund_code) + ".js", proxies={"http": proxy}, timeout=3, headers=header)
      except Exception:
        # 訪問失敗了,所以要把我們剛才取出的數(shù)據(jù)再放回去隊列中
        fund_code_queue.put(fund_code)
        print("訪問失敗,嘗試使用其他代理訪問")

當(dāng)訪問成功時,則說明能夠成功獲得基金的相關(guān)數(shù)據(jù)。當(dāng)我們在將這些數(shù)據(jù)存入到一個.csv文件中,會發(fā)現(xiàn)數(shù)據(jù)出現(xiàn)錯誤。這是由于多線程導(dǎo)致,由于多個線程同時對該文件進行寫入,導(dǎo)致出錯。所以需要引入一個線程鎖,確保每次只有一個線程寫入。

  # 申請獲取鎖,此過程為阻塞等待狀態(tài),直到獲取鎖完畢
  mutex_lock.acquire()
  # 追加數(shù)據(jù)寫入csv文件,若文件不存在則自動創(chuàng)建
  with open('./fund_data.csv', 'a+', encoding='utf-8') as csv_file:
    csv_writer = csv.writer(csv_file)
    data_list = [x for x in data_dict.values()]
    csv_writer.writerow(data_list)
  # 釋放鎖
  mutex_lock.release()

至此,大部分工作已經(jīng)完成了。為了更好地實現(xiàn)偽裝效果,我們對header進行隨機選擇。

  # user_agent列表
  user_agent_list = [
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
    'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36'
  ]
  # referer列表
  referer_list = [
    'http://fund.eastmoney.com/110022.html',
    'http://fund.eastmoney.com/110023.html',
    'http://fund.eastmoney.com/110024.html',
    'http://fund.eastmoney.com/110025.html'
  ]
  # 獲取一個隨機user_agent和Referer
  header = {'User-Agent': random.choice(user_agent_list),
       'Referer': random.choice(referer_list)
  }

最后,在main中,開啟線程即可。

  # 創(chuàng)建一個線程鎖,防止多線程寫入文件時發(fā)生錯亂
  mutex_lock = threading.Lock()
  # 線程數(shù)為50,在一定范圍內(nèi),線程數(shù)越多,速度越快
  for i in range(50):
    t = threading.Thread(target=get_fund_data,name='LoopThread'+str(i))
    t.start()

通過對多線程和IP代理池的實踐操作,能夠更加深入了解多線程和爬蟲的工作原理。當(dāng)你在使用一些爬蟲框架的時候,就能夠做到快速定位錯誤并解決錯誤。

數(shù)據(jù)格式

000056,建信消費升級混合,2019-03-26,1.7740,1.7914,0.98,2019-03-27 15:00

000031,華夏復(fù)興混合,2019-03-26,1.5650,1.5709,0.38,2019-03-27 15:00

000048,華夏雙債增強債券C,2019-03-26,1.2230,1.2236,0.05,2019-03-27 15:00

000008,嘉實中證500ETF聯(lián)接A,2019-03-26,1.4417,1.4552,0.93,2019-03-27 15:00

000024,大摩雙利增強債券A,2019-03-26,1.1670,1.1674,0.04,2019-03-27 15:00

000054,鵬華雙債增利債券,2019-03-26,1.1697,1.1693,-0.03,2019-03-27 15:00

000016,華夏純債債券C,2019-03-26,1.1790,1.1793,0.03,2019-03-27 15:00

功能截圖

配置說明

# 確保安裝以下庫,如果沒有,請在python3環(huán)境下執(zhí)行pip install 模塊名
  import requests
  import random
  import re
  import queue
  import threading
  import csv
  import json

補充

完整版源代碼存放在github上,有需要的可以下載

項目持續(xù)更新,歡迎您star本項目

,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值

相關(guān)文章

  • 在Python的Django框架中編寫編譯函數(shù)

    在Python的Django框架中編寫編譯函數(shù)

    這篇文章主要介紹了在Python的Django框架中編寫編譯函數(shù),配合模版標簽在模版中進行使用<需要的朋友可以參考下
    2015-07-07
  • python正則表達式爬取貓眼電影top100

    python正則表達式爬取貓眼電影top100

    這篇文章主要為大家詳細介紹了python正則表達式爬取貓眼電影top100,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Python編程實現(xiàn)兩個文件夾里文件的對比功能示例【包含內(nèi)容的對比】

    Python編程實現(xiàn)兩個文件夾里文件的對比功能示例【包含內(nèi)容的對比】

    這篇文章主要介紹了Python編程實現(xiàn)兩個文件夾里文件的對比功能,包含內(nèi)容的對比操作,涉及Python文件與目錄的遍歷、比較、運算等相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • 聊聊Python中關(guān)于a=[[]]*3的反思

    聊聊Python中關(guān)于a=[[]]*3的反思

    這篇文章主要介紹了Python中關(guān)于a=[[]]*3的反思,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • django2.2安裝錯誤最全的解決方案(小結(jié))

    django2.2安裝錯誤最全的解決方案(小結(jié))

    這篇文章主要介紹了django2.2安裝錯誤最全的解決方案(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • pyecharts動態(tài)軌跡圖的實現(xiàn)示例

    pyecharts動態(tài)軌跡圖的實現(xiàn)示例

    這篇文章主要介紹了pyecharts動態(tài)軌跡圖的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Python如何繪制概率分布直方圖淺析

    Python如何繪制概率分布直方圖淺析

    項目中在前期經(jīng)常要看下數(shù)據(jù)的分布情況,這對于探究數(shù)據(jù)規(guī)律非常有用,概率分布表示樣本數(shù)據(jù)的模樣,使用Python繪制頻率分布直方圖非常簡潔,因為用的頻次非常高,這篇文章主要給大家介紹了關(guān)于Python如何繪制概率分布直方圖的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • 基于python的selenium兩種文件上傳操作實現(xiàn)詳解

    基于python的selenium兩種文件上傳操作實現(xiàn)詳解

    這篇文章主要介紹了基于python的selenium兩種文件上傳操作實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Python中re模塊下的函數(shù)詳解

    Python中re模塊下的函數(shù)詳解

    這篇文章主要介紹了Python中re模塊下的函數(shù)詳解,re.match() 函數(shù)是從頭開始匹配一個符合規(guī)則的字符串,從起始位置開始匹配,匹配成功返回一個對象,未匹配成功返回None,需要的朋友可以參考下
    2023-08-08
  • Tensorflow實現(xiàn)酸奶銷量預(yù)測分析

    Tensorflow實現(xiàn)酸奶銷量預(yù)測分析

    這篇文章主要為大家詳細介紹了Tensorflow酸奶銷量預(yù)測分析,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07

最新評論

犍为县| 鸡东县| 宜章县| 永川市| 巫山县| 宁南县| 阿鲁科尔沁旗| 镶黄旗| 和政县| 南川市| 元江| 文昌市| 保德县| 大足县| 图木舒克市| 灵丘县| 玉山县| 邯郸县| 江北区| 衡水市| 元江| 石景山区| 洪雅县| 饶平县| 平远县| 昆明市| 柘荣县| 英德市| 萝北县| 大化| 东乡族自治县| 临安市| 卓资县| 宣威市| 淮南市| 渝中区| 乌兰浩特市| 福州市| 文成县| 共和县| 双鸭山市|