<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          5行Python就能爬取 3000+ 上市公司的信息?

          共 4321字,需瀏覽 9分鐘

           ·

          2020-09-27 07:58

          ↑↑↑點(diǎn)擊上方藍(lán)字,回復(fù)資料,10個(gè)G的驚喜
          作者:蘇克?
          源自:https://www.makcyun.top/web_scraping_withpython18.html

          入門爬蟲很容易,幾行代碼就可以,可以說是學(xué)習(xí) Python 最簡單的途徑。

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

          基本環(huán)境配置

          • 版本:Python3
          • 系統(tǒng):Windows
          • 相關(guān)模塊:pandas、csv

          爬取目標(biāo)網(wǎng)站

          實(shí)現(xiàn)代碼

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

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

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

          增加異常處理

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

          增加代碼靈活性

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

          修改存儲(chǔ)方式

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

          加快爬取速度

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

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

          import?requests
          import?pandas?as?pd
          from?bs4?import?BeautifulSoup
          from?lxml?import?etree
          import?time
          import?pymysql
          from?sqlalchemy?import?create_engine
          from?urllib.parse?import?urlencode??#?編碼?URL?字符串

          start_time?=?time.time()??#計(jì)算程序運(yùn)行時(shí)間
          def?get_one_page(i):
          ????try:
          ????????headers?=?{
          ????????????'User-Agent':?'Mozilla/5.0?(Windows?NT?6.1;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/66.0.3359.181?Safari/537.36'
          ????????}
          ????????paras?=?{
          ????????'reportTime':?'2017-12-31',
          ????????#可以改報(bào)告日期,比如2018-6-30獲得的就是該季度的信息
          ????????'pageNum':?i???#頁碼
          ????????}
          ????????url?=?'http://s.askci.com/stock/a/?'?+?urlencode(paras)
          ????????response?=?requests.get(url,headers?=?headers)
          ????????if?response.status_code?==?200:
          ????????????return?response.text
          ????????return?None
          ????except?RequestException:
          ????????print('爬取失敗')

          def?parse_one_page(html):
          ????soup?=?BeautifulSoup(html,'lxml')
          ????content?=?soup.select('#myTable04')[0]?#[0]將返回的list改為bs4類型
          ????tbl?=?pd.read_html(content.prettify(),header?=?0)[0]
          ????#?prettify()優(yōu)化代碼,[0]從pd.read_html返回的list中提取出DataFrame
          ????tbl.rename(columns?=?{'序號(hào)':'serial_number',?'股票代碼':'stock_code',?'股票簡稱':'stock_abbre',?'公司名稱':'company_name',?'省份':'province',?'城市':'city',?'主營業(yè)務(wù)收入(201712)':'main_bussiness_income',?'凈利潤(201712)':'net_profit',?'員工人數(shù)':'employees',?'上市日期':'listing_date',?'招股書':'zhaogushu',?'公司財(cái)報(bào)':'financial_report',?'行業(yè)分類':'industry_classification',?'產(chǎn)品類型':'industry_type',?'主營業(yè)務(wù)':'main_business'},inplace?=?True)
          ????return?tbl

          def?generate_mysql():
          ????conn?=?pymysql.connect(
          ????????host='localhost',
          ????????user='root',
          ????????password='',
          ????????port=3306,
          ????????charset?=?'utf8',??
          ????????db?=?'wade')
          ????cursor?=?conn.cursor()

          ????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))'
          ????cursor.execute(sql)
          ????conn.close()

          def?write_to_sql(tbl,?db?=?'wade'):
          ????engine?=?create_engine('mysql+pymysql://root:@localhost:3306/{0}?charset=utf8'.format(db))
          ????try:
          ????????tbl.to_sql('listed_company2',con?=?engine,if_exists='append',index=False)
          ????????#?append表示在原有表基礎(chǔ)上增加,但該表要有表頭
          ????except?Exception?as?e:
          ????????print(e)

          def?main(page):
          ????generate_mysql()
          ????for?i?in?range(1,page):??
          ????????html?=?get_one_page(i)
          ????????tbl?=?parse_one_page(html)
          ????????write_to_sql(tbl)

          #?#?單進(jìn)程
          if?__name__?==?'__main__':????
          ????main(178)
          ????endtime?=?time.time()-start_time
          ????print('程序運(yùn)行了%.2f秒'?%endtime)

          #?多進(jìn)程
          from?multiprocessing?import?Pool
          if?__name__?==?'__main__':
          ?????pool?=?Pool(4)
          ?????pool.map(main,?[i?for?i?in?range(1,178)])??#共有178頁
          ????endtime?=?time.time()-start_time
          ????print('程序運(yùn)行了%.2f秒'?%(time.time()-start_time))

          結(jié)語

          這個(gè)過程覺得很自然,因?yàn)槊看涡薷亩际轻槍σ粋€(gè)小點(diǎn),一點(diǎn)點(diǎn)去學(xué),搞懂后添加進(jìn)來,而如果讓你上來就直接寫出這幾十行的代碼,你很可能就放棄了。

          所以,你可以看到,入門爬蟲是有套路的,最重要的是給自己信心。

          以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對小編的支持。

          我的朋友圈更精彩


          推薦閱讀

          (點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)

          貝葉斯:沒有人比我更懂南京市長江大橋

          華為提出十大數(shù)學(xué)挑戰(zhàn)!解出一個(gè)就是年薪百萬!

          Numpy核心語法和代碼整理匯總!

          數(shù)學(xué)系的概率論和我們的不太一樣。。。

          機(jī)器學(xué)習(xí)模型調(diào)參指南(附代碼)

          老鐵,三連支持一下,好嗎?↓↓↓

          瀏覽 52
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产成年女人性爱视频 | 视频一区一区 | 翔田千里二区二区二区 | 黃色一级A片一級片 | 国产精品久久久久久欧 |