<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 行代碼爬取 3000+ 上市公司信息!

          共 7849字,需瀏覽 16分鐘

           ·

          2020-09-21 06:51

          公眾號關(guān)注杰哥的IT之旅”,

          選擇“星標”,重磅干貨,第一時間送達!


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

          前言

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

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

          基本環(huán)境配置

          • 版本:Python3

          • 系統(tǒng):Windows

          • 相關(guān)模塊: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)頁,中途很可能由于各種問題導(dǎo)致爬取失敗,所以增加了 try except 、if 等語句,來處理可能出現(xiàn)的異常,讓代碼更健壯。

          • 增加代碼靈活性

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

          • 修改存儲方式

          初版代碼我選擇了存儲到 Excel 這種最為熟悉簡單的方式,人是一種惰性動物,很難離開自己的舒適區(qū)。但是為了學(xué)習(xí)新知識,所以我選擇將數(shù)據(jù)存儲到 MySQL 中,以便練習(xí) 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è)務(wù)收入(201712)':'main_bussiness_income''凈利潤(201712)':'net_profit''員工人數(shù)':'employees''上市日期':'listing_date''招股書':'zhaogushu''公司財報':'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)

          # # 單進程
          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))

          結(jié)語

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

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

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


          本公眾號全部博文已整理成一個目錄,請在公眾號后臺回復(fù)「m」獲??!

          推薦閱讀:

          1、總說手機沒有“好壁紙”,Python一次性抓取500張“美女”圖片,夠不夠用!
          2、利用 Python 爬取了 37483 條上海二手房信息,我得出的結(jié)論是?
          3、利用 Python 爬取了 13966 條運維招聘信息,我得出了哪些結(jié)論?
          4、不懂送女朋友什么牌子的口紅?沒關(guān)系!Python 數(shù)據(jù)分析告訴你。
          5、“羅永浩抖音首秀”銷售數(shù)據(jù)的可視化大屏是怎么做出來的呢?
          6、數(shù)據(jù)分析之AB testing實戰(zhàn)(附Python代碼)
          7、Python 自動化辦公之"你還在手動操作“文件”或“文件夾”嗎?"
          8、利用 Python 進行多 Sheet 表合并、多工作簿合并、一表按列拆分

                
                  
          點個[在看],是對杰哥最大的支持!
          瀏覽 63
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  一级片观看| 淫色一级 | 操比视频在线观看 | 影音先锋av资源在线 | 亚洲免费看片 |