1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 4197字,需瀏覽 9分鐘

         ·

        2020-09-20 02:28

        點擊上方數(shù)據(jù)管道”,選擇“置頂星標”公眾號

        干貨福利,第一時間送達

        作者:蘇克?
        源自:https://www.makcyun.top/web_scraping_withpython18.html

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

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

        基本環(huán)境配置

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

        爬取目標網(wǎng)站

        實現(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ù)完善代碼,因為 5 行代碼太單薄,功能也太簡單,大致從以下幾個方面進行了完善:

        增加異常處理

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

        增加代碼靈活性

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

        修改存儲方式

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

        加快爬取速度

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

        經(jīng)過以上這幾點的完善,代碼量從原先的 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()??#計算程序運行時間
        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',
        ????????#可以改報告日期,比如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?=?{'序號':'serial_number',?'股票代碼':'stock_code',?'股票簡稱':'stock_abbre',?'公司名稱':'company_name',?'省份':'province',?'城市':'city',?'主營業(yè)務收入(201712)':'main_bussiness_income',?'凈利潤(201712)':'net_profit',?'員工人數(shù)':'employees',?'上市日期':'listing_date',?'招股書':'zhaogushu',?'公司財報':'financial_report',?'行業(yè)分類':'industry_classification',?'產(chǎn)品類型':'industry_type',?'主營業(yè)務':'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表示在原有表基礎上增加,但該表要有表頭
        ????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)

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

        #?多進程
        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('程序運行了%.2f秒'?%(time.time()-start_time))

        結語

        這個過程覺得很自然,因為每次修改都是針對一個小點,一點點去學,搞懂后添加進來,而如果讓你上來就直接寫出這幾十行的代碼,你很可能就放棄了。

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

        以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對小編的支持。

        瀏覽 53
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91搞黄视频 | 我被两个男人躁了一天小说 | AV自拍偷拍 | 亚洲AV成人片在线观看 | 男男性h免费观看 | 91红桃视频在线观看 | 脱光干x| xxnx国产麻豆 | 色天天网 | 福利一区二区在线 |