乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      5行代碼就能寫(xiě)個(gè)爬蟲(chóng),python真是太方便了!

       東西二王 2019-05-17

      不少讀者是剛剛?cè)腴T(mén)Python或者想學(xué)習(xí)Python的,今天就來(lái)談?wù)?strong>如何用快速入門(mén)爬蟲(chóng)。

      先說(shuō)結(jié)論:入門(mén)爬蟲(chóng)很容易,幾行代碼就可以,可以說(shuō)是學(xué)習(xí)Python最簡(jiǎn)單的途徑。

      以我純小白、零基礎(chǔ)的背景來(lái)說(shuō),入門(mén)爬蟲(chóng)其實(shí)很容易,容易在代碼編寫(xiě)很簡(jiǎn)單,簡(jiǎn)單的爬蟲(chóng)通常幾行就能搞定,而不容易在確定爬蟲(chóng)的目標(biāo),也就是說(shuō)為什么要去寫(xiě)爬蟲(chóng),有沒(méi)有必要用到爬蟲(chóng),是不是手動(dòng)操作幾乎無(wú)法完成,互聯(lián)網(wǎng)上有數(shù)以百萬(wàn)千萬(wàn)計(jì)的網(wǎng)站,到底以哪一個(gè)網(wǎng)站作為入門(mén)首選,這些問(wèn)題才是難點(diǎn)。所以在動(dòng)手寫(xiě)爬蟲(chóng)前,最好花一些時(shí)間想一想這清楚這些問(wèn)題。

      「Talk is cheap. Show me the code」,下面我就以曾寫(xiě)過(guò)的一個(gè)爬蟲(chóng)為例,說(shuō)一說(shuō)我是如何快速入門(mén)Python爬蟲(chóng)的。(私信我python,獲得萬(wàn)元python學(xué)習(xí)大禮包!

      ▌確立目標(biāo)

      第一步,確立目標(biāo)。

      為什么想起寫(xiě)這個(gè)爬蟲(chóng)呢,是因?yàn)檫@是曾經(jīng)在工作中想要解決的問(wèn)題,當(dāng)時(shí)不會(huì)爬蟲(chóng),只能用Excel花了數(shù)個(gè)小時(shí)才勉強(qiáng)地把數(shù)據(jù)爬了下來(lái), 所以在接觸到爬蟲(chóng)后,第一個(gè)想法就是去實(shí)現(xiàn)曾未實(shí)現(xiàn)的目標(biāo)。以這樣的方式入門(mén)爬蟲(chóng),好處顯而易見(jiàn),就是有了很明確的動(dòng)力。

      很多人學(xué)爬蟲(chóng)都是去爬網(wǎng)上教程中的那些網(wǎng)站,網(wǎng)站一樣就算了,爬取的方法也一模一樣,等于抄一遍,不是說(shuō)這樣無(wú)益,但是會(huì)容易導(dǎo)致動(dòng)力不足,因?yàn)槟銢](méi)有帶著目標(biāo)去爬,只是為了學(xué)爬蟲(chóng)而爬,爬蟲(chóng)雖然是門(mén)技術(shù)活,但是如果能建立在興趣愛(ài)好或者工作任務(wù)的前提下,學(xué)習(xí)的動(dòng)力就會(huì)強(qiáng)很多。

      在確定好爬蟲(chóng)目標(biāo)后,接著我就在腦中預(yù)想了想要得到什么樣的結(jié)果、如何展示出來(lái)、以什么形式展現(xiàn)這些問(wèn)題。所以,我在爬取網(wǎng)站之前,就預(yù)先構(gòu)想出了想要的一個(gè)結(jié)果,大致是下面這張圖的樣子。

      5行代碼就能寫(xiě)個(gè)爬蟲(chóng),python真是太方便了!

      目標(biāo)是利用爬下來(lái)的數(shù)據(jù),嘗試從不同維度年份、省份、城市去分析全國(guó)的股市信息,然后通過(guò)可視化圖表呈現(xiàn)出來(lái)。

      拋開(kāi)數(shù)據(jù),可能你會(huì)覺(jué)得這張圖在排版布局、色彩搭配、字體文字等方面還挺好看的。這些呢,就跟爬蟲(chóng)沒(méi)什么關(guān)系了,而跟審美有關(guān),提升審美的一種方式是可以通過(guò)做PPT來(lái)實(shí)現(xiàn),所以你看,咱們說(shuō)著說(shuō)著就從爬蟲(chóng)跳到了 PPT,不得不說(shuō)我此前發(fā)的文章鋪墊地很好啊,哈哈。其實(shí),在職場(chǎng)中,你擁有的技能越多越好。

      ▌直接開(kāi)始

      確定了目標(biāo)后,第二步就可以開(kāi)始寫(xiě)爬蟲(chóng)了,如果你像我一樣,之前沒(méi)有任何編程基礎(chǔ),那我下面說(shuō)的思路,可能會(huì)有用。

      剛開(kāi)始動(dòng)手寫(xiě)爬蟲(chóng),我只關(guān)注最核心的部分,也就是先成功抓到數(shù)據(jù),其他的諸如:下載速度、存儲(chǔ)方式、代碼條理性等先不管,這樣的代碼簡(jiǎn)短易懂、容易上手,能夠增強(qiáng)信心。

      所以,我在寫(xiě)第一遍的時(shí)候,只用了5行代碼,就成功抓取了全部所需的信息,當(dāng)時(shí)的感覺(jué)就是很爽,覺(jué)得爬蟲(chóng)不過(guò)如此啊,自信心爆棚。

      import pandas as pd import csv for i in range(1,178): # 爬取全部頁(yè) tb = pd.read_html('http://s./stock/a/?reportTime=2017-12-31&pageNum=%s' % (str(i)))[3] tb.to_csv(r'1.csv', mode='a', encoding='utf_8_sig', hea

      3000 上市公司的信息,安安靜靜地躺在 Excel 中:

      5行代碼就能寫(xiě)個(gè)爬蟲(chóng),python真是太方便了!

      ▌不斷完善

      有了上面的信心后,我開(kāi)始繼續(xù)完善代碼,因?yàn)?行代碼太單薄,功能也太簡(jiǎn)單,大致從以下幾個(gè)方面進(jìn)行了完善:

      • 增加異常處理

      由于爬取上百頁(yè)的網(wǎng)頁(yè),中途很可能由于各種問(wèn)題導(dǎo)致爬取失敗,所以增加了 try except 、if 等語(yǔ)句,來(lái)處理可能出現(xiàn)的異常,讓代碼更健壯。

      • 增加代碼靈活性

      初版代碼由于固定了URL參數(shù),所以只能爬取固定的內(nèi)容,但是人的想法是多變的,一會(huì)兒想爬這個(gè)一會(huì)兒可能又需要那個(gè),所以可以通過(guò)修改 URL 請(qǐng)求參數(shù),來(lái)增加代碼靈活性,從而爬取更靈活的數(shù)據(jù)。

      • 修改存儲(chǔ)方式

      初版代碼我選擇了存儲(chǔ)到Excel這種最為熟悉簡(jiǎn)單的方式,人是一種惰性動(dòng)物,很難離開(kāi)自己的舒適區(qū)。但是為了學(xué)習(xí)新知識(shí),所以我選擇將數(shù)據(jù)存儲(chǔ)到 MySQL 中,以便練習(xí) MySQL 的使用。

      • 加快爬取速度

      初版代碼使用了最簡(jiǎn)單的單進(jìn)程爬取方式,爬取速度比較慢,考慮到網(wǎng)頁(yè)數(shù)量比較大,所以修改為了多進(jìn)程的爬取方式。

      經(jīng)過(guò)以上這幾點(diǎn)的完善,代碼量從原先的5行增加到了下面的幾十行:

       1import requests
       2import pandas as pd
       3from bs4 import BeautifulSoup
       4from lxml import etree
       5import time
       6import pymysql
       7from sqlalchemy import create_engine
       8from urllib.parse import urlencode # 編碼 URL 字符串
       9
      10start_time = time.time() #計(jì)算程序運(yùn)行時(shí)間
      11def get_one_page(i):
      12 try:
      13 headers = {
      14 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
      15 }
      16 paras = {
      17 'reportTime': '2017-12-31',
      18 #可以改報(bào)告日期,比如2018-6-30獲得的就是該季度的信息
      19 'pageNum': i #頁(yè)碼
      20 }
      21 url = 'http://s./stock/a/?'   urlencode(paras)
      22 response = requests.get(url,headers = headers)
      23 if response.status_code == 200:
      24 return response.text
      25 return None
      26 except RequestException:
      27 print('爬取失敗')
      28
      29def parse_one_page(html):
      30 soup = BeautifulSoup(html,'lxml')
      31 content = soup.select('#myTable04')[0] #[0]將返回的list改為bs4類(lèi)型
      32 tbl = pd.read_html(content.prettify(),header = 0)[0]
      33 # prettify()優(yōu)化代碼,[0]從pd.read_html返回的list中提取出DataFrame
      34 tbl.rename(columns = {'序號(hào)':'serial_number', '股票代碼':'stock_code', '股票簡(jiǎn)稱(chēng)':'stock_abbre', '公司名稱(chēng)':'company_name', '省份':'province', '城市':'city', '主營(yíng)業(yè)務(wù)收入(201712)':'main_bussiness_income', '凈利潤(rùn)(201712)':'net_profit', '員工人數(shù)':'employees', '上市日期':'listing_date', '招股書(shū)':'zhaogushu', '公司財(cái)報(bào)':'financial_report', '行業(yè)分類(lèi)':'industry_classification', '產(chǎn)品類(lèi)型':'industry_type', '主營(yíng)業(yè)務(wù)':'main_business'},inplace = True)
      35 return tbl
      36
      37def generate_mysql():
      38 conn = pymysql.connect(
      39 host='localhost',
      40 user='root',
      41 password='******',
      42 port=3306,
      43 charset = 'utf8', 
      44 db = 'wade')
      45 cursor = conn.cursor()
      46
      47 sql = 'CREATE TABLE IF NOT EXISTS listed_company (serial_number INT(20) NOT NULL,stock_code INT(20) ,stock_abbre VARCHAR(20) ,company_name VARCHAR(20) ,province VARCHAR(20) ,city VARCHAR(20) ,main_bussiness_income VARCHAR(20) ,net_profit VARCHAR(20) ,employees INT(20) ,listing_date DATETIME(0) ,zhaogushu VARCHAR(20) ,financial_report VARCHAR(20) , industry_classification VARCHAR(20) ,industry_type VARCHAR(100) ,main_business VARCHAR(200) ,PRIMARY KEY (serial_number))'
      48 cursor.execute(sql)
      49 conn.close()
      50
      51def write_to_sql(tbl, db = 'wade'):
      52 engine = create_engine('mysql pymysql://root:******@localhost:3306/{0}?charset=utf8'.format(db))
      53 try:
      54 tbl.to_sql('listed_company2',con = engine,if_exists='append',index=False)
      55 # append表示在原有表基礎(chǔ)上增加,但該表要有表頭
      56 except Exception as e:
      57 print(e)
      58
      59def main(page):
      60 generate_mysql()
      61 for i in range(1,page): 
      62 html = get_one_page(i)
      63 tbl = parse_one_page(html)
      64 write_to_sql(tbl)
      65
      66# # 單進(jìn)程
      67if __name__ == '__main__': 
      68 main(178)
      69 endtime = time.time()-start_time
      70 print('程序運(yùn)行了%.2f秒' %endtime)
      71
      72# 多進(jìn)程
      73from multiprocessing import Pool
      74if __name__ == '__main__':
      75 pool = Pool(4)
      76 pool.map(main, [i for i in range(1,178)]) #共有178頁(yè)
      77 endtime = time.time()-start_time
      78 print('程序運(yùn)行了%.2f秒' %(time.time()-start_time))

      雖然代碼行數(shù)增加了不少,但是這個(gè)過(guò)程卻覺(jué)得很自然,因?yàn)槊看涡薷亩际轻槍?duì)一個(gè)小點(diǎn),一點(diǎn)點(diǎn)去學(xué),搞懂后添加進(jìn)來(lái),而如果讓我上來(lái)就直接寫(xiě)出這幾十行的代碼,我很可能就放棄了。

      所以,你可以看到,入門(mén)爬蟲(chóng)是有套路的,最重要的是給自己信心。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類(lèi)似文章 更多