国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

為你的爬蟲提提速?

yanest / 3604人閱讀

摘要:項(xiàng)目介紹本文將展示如何利用中的異步模塊來提高爬蟲的效率。使用用的爬蟲爬取了條數(shù)據(jù),耗時小時,該爬蟲爬取條數(shù)據(jù),耗時半小時。如果是同樣的數(shù)據(jù)量,那么爬取條數(shù)據(jù)耗時約小時,該爬蟲僅用了爬蟲的四分之一的時間就出色地完成了任務(wù)。

項(xiàng)目介紹

??本文將展示如何利用Pyhton中的異步模塊來提高爬蟲的效率。
??我們需要爬取的目標(biāo)為:融360網(wǎng)站上的理財(cái)產(chǎn)品信息(https://www.rong360.com/licai...),頁面如下:

我們需要爬取86394條理財(cái)產(chǎn)品的信息,每頁10條,也就是8640個頁面。
??在文章Python爬蟲(16)利用Scrapy爬取銀行理財(cái)產(chǎn)品信息(共12多萬條)中,我們使用爬蟲框架Scrapy實(shí)現(xiàn)了該爬蟲,爬取了127130條數(shù)據(jù),并存入MongoDB,整個過程耗時3小時。按道理來說,使用Scrapy實(shí)現(xiàn)爬蟲是較好的選擇,但是在速度上,是否能有所提升呢?本文將展示如何利用Pyhton中的異步模塊(aiohtpp和asyncio)來提高爬蟲的效率。

爬蟲項(xiàng)目

??我們的爬蟲分兩步走:

爬取融360網(wǎng)頁上的理財(cái)產(chǎn)品信息并存入csv文件;

讀取csv文件并存入至MySQL數(shù)據(jù)庫。

??首先,我們爬取融360網(wǎng)頁上的理財(cái)產(chǎn)品信息并存入csv文件,我們使用aiohttp和asyncio來加速爬蟲,完整的Python代碼如下:

import re
import time
import aiohttp
import asyncio
import pandas as pd
import logging

# 設(shè)置日志格式
logging.basicConfig(level = logging.INFO, format="%(asctime)s - %(levelname)s: %(message)s")
logger = logging.getLogger(__name__)


df = pd.DataFrame(columns=["name", "bank", "currency", "startDate",
                           "endDate", "period", "proType", "profit", "amount"])

# 異步HTTP請求
async def fetch(sem, session, url):
    async with sem:
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"}
        async with session.get(url, headers=headers) as response:
            return await response.text()

# 解析網(wǎng)頁
async def parser(html):
    # 利用正則表達(dá)式解析網(wǎng)頁
    tbody = re.findall(r"[sS]*?", html)[0]
    trs = re.findall(r"", tbody)
    for tr in trs:
        tds = re.findall(r"", tr)
        name,bank = re.findall(r"title="(.+?)"", "".join(tds))
        name = name.replace("&", "").replace("quot;", "")
        currency, startDate, endDate, amount = re.findall(r"(.+?)", "".join(tds))
        period = "".join(re.findall(r"(.+?)", tds[5]))
        proType = "".join(re.findall(r"(.+?)", tds[6]))
        profit = "".join(re.findall(r"(.+?)", tds[7]))
        df.loc[df.shape[0] + 1] = [name, bank, currency, startDate, endDate, 
                                   period, proType, profit, amount]

    logger.info(str(df.shape[0])+"	"+name)

# 處理網(wǎng)頁
async def download(sem, url):
    async with aiohttp.ClientSession() as session:
        try:
            html = await fetch(sem, session, url)
            await parser(html)
        except Exception as err:
            print(err)

# 全部網(wǎng)頁
urls = ["https://www.rong360.com/licai-bank/list/p%d"%i for i in range(1, 8641)]

# 統(tǒng)計(jì)該爬蟲的消耗時間
print("*" * 50)
t3 = time.time()

# 利用asyncio模塊進(jìn)行異步IO處理
loop = asyncio.get_event_loop()
sem=asyncio.Semaphore(100)
tasks = [asyncio.ensure_future(download(sem, url)) for url in urls]
tasks = asyncio.gather(*tasks)
loop.run_until_complete(tasks)

df.to_csv("E://rong360.csv")

t4 = time.time()
print("總共耗時:%s" % (t4 - t3))
print("*" * 50)

輸出的結(jié)果如下(中間的輸出已省略,以......代替):

**************************************************
2018-10-17 13:33:50,717 - INFO: 10    金百合第245期
2018-10-17 13:33:50,749 - INFO: 20    金荷恒升2018年第26期
......
2018-10-17 14:03:34,906 - INFO: 86381    翠竹同益1M22期FGAB15015A
2018-10-17 14:03:35,257 - INFO: 86391    潤鑫月月盈2號
總共耗時:1787.4312353134155
**************************************************

可以看到,在這個爬蟲中,我們爬取了86391條數(shù)據(jù),耗時1787.4秒,不到30分鐘。雖然數(shù)據(jù)比預(yù)期的少了3條,但這點(diǎn)損失不算什么。來看一眼csv文件中的數(shù)據(jù):


??OK,離我們的目標(biāo)還差一步,將這個csv文件存入至MySQL,具體的操作方法可參考文章:Python之使用Pandas庫實(shí)現(xiàn)MySQL數(shù)據(jù)庫的讀寫:https://www.jianshu.com/p/238... 。完整的Python代碼如下:

# -*- coding: utf-8 -*-

# 導(dǎo)入必要模塊
import pandas as pd
from sqlalchemy import create_engine

# 初始化數(shù)據(jù)庫連接,使用pymysql模塊
engine = create_engine("mysql+pymysql://root:******@localhost:33061/test", echo=True)

print("Read CSV file...")
# 讀取本地CSV文件
df = pd.read_csv("E://rong360.csv", sep=",", encoding="gb18030")

# 將新建的DataFrame儲存為MySQL中的數(shù)據(jù)表,不儲存index列
df.to_sql("rong360",
          con=engine,
          index= False,
          index_label="name"
          )

print("Write to MySQL successfully!")

輸出結(jié)果如下(耗時十幾秒):

Read CSV file...
2018-10-17 15:07:02,447 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE "sql_mode"
2018-10-17 15:07:02,447 INFO sqlalchemy.engine.base.Engine {}
2018-10-17 15:07:02,452 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2018-10-17 15:07:02,452 INFO sqlalchemy.engine.base.Engine {}
2018-10-17 15:07:02,454 INFO sqlalchemy.engine.base.Engine show collation where `Charset` = "utf8mb4" and `Collation` = "utf8mb4_bin"
2018-10-17 15:07:02,454 INFO sqlalchemy.engine.base.Engine {}
2018-10-17 15:07:02,455 INFO sqlalchemy.engine.base.Engine SELECT CAST("test plain returns" AS CHAR(60)) AS anon_1
2018-10-17 15:07:02,456 INFO sqlalchemy.engine.base.Engine {}
2018-10-17 15:07:02,456 INFO sqlalchemy.engine.base.Engine SELECT CAST("test unicode returns" AS CHAR(60)) AS anon_1
2018-10-17 15:07:02,456 INFO sqlalchemy.engine.base.Engine {}
2018-10-17 15:07:02,457 INFO sqlalchemy.engine.base.Engine SELECT CAST("test collated returns" AS CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_bin AS anon_1
2018-10-17 15:07:02,457 INFO sqlalchemy.engine.base.Engine {}
2018-10-17 15:07:02,458 INFO sqlalchemy.engine.base.Engine DESCRIBE `rong360`
2018-10-17 15:07:02,458 INFO sqlalchemy.engine.base.Engine {}
2018-10-17 15:07:02,459 INFO sqlalchemy.engine.base.Engine ROLLBACK
2018-10-17 15:07:02,462 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE rong360 (
    `Unnamed: 0` BIGINT, 
    name TEXT, 
    bank TEXT, 
    currency TEXT, 
    `startDate` TEXT, 
    `endDate` TEXT, 
    enduration TEXT, 
    `proType` TEXT, 
    profit TEXT, 
    amount TEXT
)


2018-10-17 15:07:02,462 INFO sqlalchemy.engine.base.Engine {}
2018-10-17 15:07:02,867 INFO sqlalchemy.engine.base.Engine COMMIT
2018-10-17 15:07:02,909 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2018-10-17 15:07:03,973 INFO sqlalchemy.engine.base.Engine INSERT INTO rong360 (`Unnamed: 0`, name, bank, currency, `startDate`, `endDate`, enduration, `proType`, profit, amount) VALUES (%(Unnamed: 0)s, %(name)s, %(bank)s, %(currency)s, %(startDate)s, %(endDate)s, %(enduration)s, %(proType)s, %(profit)s, %(amount)s)
2018-10-17 15:07:03,974 INFO sqlalchemy.engine.base.Engine ({"Unnamed: 0": 1, "name": "龍信20183773", "bank": "龍江銀行", "currency": "人民幣", "startDate": "2018-10-12", "endDate": "2018-10-14", "enduration": "99天", "proType": "不保本", "profit": "4.8%", "amount": "5萬"}, {"Unnamed: 0": 2, "name": "福瀛家NDHLCS20180055B", "bank": "寧波東海銀行", "currency": "人民幣", "startDate": "2018-10-12", "endDate": "2018-10-17", "enduration": "179天", "proType": "保證收益", "profit": "4.8%", "amount": "5萬"}, {"Unnamed: 0": 3, "name": "薪鑫樂2018年第6期", "bank": "無為農(nóng)商行", "currency": "人民幣", "startDate": "2018-10-12", "endDate": "2018-10-21", "enduration": "212天", "proType": "不保本", "profit": "4.8%", "amount": "5萬"}, {"Unnamed: 0": 4, "name": "安鑫MTLC18165", "bank": "民泰商行", "currency": "人民幣", "startDate": "2018-10-12", "endDate": "2018-10-15", "enduration": "49天", "proType": "不保本", "profit": "4.75%", "amount": "5萬"}, {"Unnamed: 0": 5, "name": "農(nóng)銀私行·如意ADRY181115A", "bank": "農(nóng)業(yè)銀行", "currency": "人民幣", "startDate": "2018-10-12", "endDate": "2018-10-16", "enduration": "90天", "proType": "不保本", "profit": "4.75%", "amount": "100萬"}, {"Unnamed: 0": 6, "name": "穩(wěn)健成長(2018)176期", "bank": "威海市商業(yè)銀行", "currency": "人民幣", "startDate": "2018-10-12", "endDate": "2018-10-15", "enduration": "91天", "proType": "不保本", "profit": "4.75%", "amount": "5萬"}, {"Unnamed: 0": 7, "name": "季季紅J18071", "bank": "溫州銀行", "currency": "人民幣", "startDate": "2018-10-12", "endDate": "2018-10-16", "enduration": "96天", "proType": "不保本", "profit": "4.75%", "amount": "1萬"}, {"Unnamed: 0": 8, "name": "私人銀行客戶84618042", "bank": "興業(yè)銀行", "currency": "人民幣", "startDate": "2018-10-12", "endDate": "2018-10-17", "enduration": "99天", "proType": "不保本", "profit": "4.75%", "amount": "50萬"}  ... displaying 10 of 86391 total bound parameter sets ...  {"Unnamed: 0": 86390, "name": "潤鑫月月盈3號RX1M003", "bank": "珠海華潤銀行", "currency": "人民幣", "startDate": "2015-06-24", "endDate": "2015-06-30", "enduration": "35天", "proType": "不保本", "profit": "4.5%", "amount": "5萬"}, {"Unnamed: 0": 86391, "name": "潤鑫月月盈2號", "bank": "珠海華潤銀行", "currency": "人民幣", "startDate": "2015-06-17", "endDate": "2015-06-23", "enduration": "35天", "proType": "不保本", "profit": "4.4%", "amount": "5萬"})
2018-10-17 15:07:14,106 INFO sqlalchemy.engine.base.Engine COMMIT
Write to MySQL successfully!

??如果你還不放心,也許我們可以看一眼MySQL中的數(shù)據(jù):

總結(jié)

??讓我們來比較該爬蟲與使用Scrapy的爬蟲。使用Scrap用的爬蟲爬取了127130條數(shù)據(jù),耗時3小時,該爬蟲爬取86391條數(shù)據(jù),耗時半小時。如果是同樣的數(shù)據(jù)量,那么Scrapy爬取86391條數(shù)據(jù)耗時約2小時,該爬蟲僅用了Scrapy爬蟲的四分之一的時間就出色地完成了任務(wù)。
??最后,讓我們看看前十名的銀行及理財(cái)產(chǎn)品數(shù)量(按理財(cái)產(chǎn)品數(shù)量從高到低排列),輸入以下MySQL命令:

use test;
SELECT bank, count(*) as product_num 
FROM rong360
GROUP BY bank
ORDER BY product_num DESC
LIMIT 10;

輸出結(jié)果如下:

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44801.html

相關(guān)文章

  • 分享幾個YYDS的Pycharm插件

    摘要:大家好,我是一行之前一行分享過好用的幾種編輯器,測試有沒有下載成功,用來做數(shù)據(jù)分析,開發(fā)的大殺器,等等,小眾猿群使用那在用這個開發(fā)大殺器的同時,一行也來分享幾個它很好用的插件,來給你的搬磚提提速可以作為摸魚好助手次下載 ...

    Richard_Gao 評論0 收藏0
  • 【Python】一文弄懂python裝飾器(附源碼例子)

    摘要:裝飾器的使用符合了面向?qū)ο缶幊痰拈_放封閉原則。三簡單的裝飾器基于上面的函數(shù)執(zhí)行時間的需求,我們就手寫一個簡單的裝飾器進(jìn)行實(shí)現(xiàn)。函數(shù)體就是要實(shí)現(xiàn)裝飾器的內(nèi)容。類裝飾器的實(shí)現(xiàn)是調(diào)用了類里面的函數(shù)。類裝飾器的寫法比我們裝飾器函數(shù)的寫法更加簡單。 目錄 前言 一、什么是裝飾器 二、為什么要用裝飾器 ...

    liuchengxu 評論0 收藏0
  • Python爬蟲理論之cookie驗(yàn)證,不回顧下歷史,套路都不知道怎么來的!

    摘要:在發(fā)明之初,為了幫助服務(wù)器同步網(wǎng)頁上的用戶信息,同時保存用戶操作,以此減輕服務(wù)器壓力。由正在瀏覽的網(wǎng)站創(chuàng)建的被稱為第一方。這些第三方怎么來的呢他們又有什么作用了。寫在最后了解歷史,有助于,我們更好的定位問題。 ...

    fuyi501 評論0 收藏0
  • 速30%:FoxOne 使用 Electron browserview 的最佳實(shí)踐

    摘要:最初,也在使用,并且最初看來功能安好。和的區(qū)別最大的區(qū)別在于托管于而不是。存在的問題在使用中,我們發(fā)現(xiàn)存在的問題主要表現(xiàn)在兩方面。使用考慮到的獨(dú)立性,我們設(shè)計(jì)了一個來管理所有,并使用和建立通訊。 在 FoxOne 1.5.1 版更新中,打開各個交易所網(wǎng)頁的速度得到了巨大提升。 我們分別在不同的網(wǎng)絡(luò)環(huán)境下,測算了新版 FoxOne 在 Dom 加載和頁面加載條件下的所需時間: showI...

    cjie 評論0 收藏0
  • 我的第一個豆瓣短評爬蟲

    摘要:,借鑒之前使用的經(jīng)驗(yàn),嘗試直接使用與發(fā)現(xiàn),豆瓣的短評,最一開始還好,但是在爬取將近十多頁的短評時,會報(bào)出的異常,查詢后得知,應(yīng)該是豆瓣對于游客用戶的限制,需要登錄才可以。爬蟲實(shí)踐戰(zhàn)狼豆瓣影評分析 豆瓣上有著大量的影視劇的評論,所以說,要是想要實(shí)現(xiàn)對廣大人民群眾的觀點(diǎn)的分析,對一部片子的理解,綜合來看大家的評論是很有必要的。而短評作為短小精干的快速評論入口,是值得一談的。 所以先要實(shí)現(xiàn)對...

    gxyz 評論0 收藏0

發(fā)表評論

0條評論

yanest

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<