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+ 上市公司的信息

        共 6779字,需瀏覽 14分鐘

         ·

        2022-12-07 16:24



        來源:python 研究者


        今天分析一個爬蟲小案例,小白或者爬蟲入門的小伙伴推薦閱讀。


        前言
        入門爬蟲很容易,幾行代碼就可以,可以說是學習 Python 最簡單的途徑。
        剛開始動手寫爬蟲,你只需要關注最核心的部分,也就是先成功抓到數(shù)據(jù),其他的諸如:下載速度、存儲方式、代碼條理性等先不管,這樣的代碼簡短易懂、容易上手,能夠增強信心。
        基本環(huán)境配置
        • 版本:Python3
        • 系統(tǒng): Windows
        • 相關模塊: pandas、csv

        爬取目標網(wǎng)站

        c2690813c5686cadda95eab884410cd5.webp


        實現(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 中:
        0447783520edccb42029578aebe7519a.webp


        有了上面的信心后,我開始繼續(xù)完善代碼,因為 5 行代碼太單薄,功能也太簡單,大致從以下幾個方面進行了完善:
        • 增加異常處理

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

        初版代碼由于固定了 URL 參數(shù),所以只能爬取固定的內(nèi)容,但是人的想法是多變的,一會兒想爬這個一會兒可能又需要那個,所以可以通過修改 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))

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

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        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>
            香蕉A片| 亚洲中文字幕观看 | 羽月希哺乳复出2023年最新消息 | 插插插插插插插插插 | 丰满少妇被猛烈进入高清在线 | 成人区人妻精品久久 | 国产精品视频www | 欧美老妇人性视频 | 成年女人毛片 | 国产黄色在线观看网站 |