Python 如何利用selenium爬取同花順網上市公司2020一季度利潤報表

       寫這篇文章之前我用python爬取了東方財富網上市公司的利潤報表,閒來蛋疼我又寫了一個爬同花順官網上面的上市公司利潤報表,這次我用的是requests包,下面碰到一些問題記錄一下,發送請求前要構造請求頭部信息:

url = 'http://data.10jqka.com.cn/ajax/yjgg/date/2020-03-31/board/ALL/field/DECLAREDATE/order/desc/page/'+str(page)+'/ajax/1/free/1/'

 headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding':'gzip, deflate',
        'Cookie':'Hm_lvt_60bad21af9c824a4a0530d5dbf4357ca=1593051856,1593077609; Hm_lpvt_60bad21af9c824a4a0530d5dbf4357ca=1593077609; Hm_lvt_78c58f01938e4d85eaf619eae71b4ed1=1593051856,1593077610; Hm_lpvt_78c58f01938e4d85eaf619eae71b4ed1=1593077610; Hm_lvt_f79b64788a4e377c608617fba4c736e2=1593051856,1593077610; Hm_lpvt_f79b64788a4e377c608617fba4c736e2=1593077610; v=AuqykmjLQFHqYsy92WH2_hWNO1uPW340YP3iL3SilITJoITNXOu-xTBvMkpH',
        'Accept-Language':'zh-CN,zh;q=0.9', 
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
        'Connection':'keep-alive',
        'Host': 'data.10jqka.com.cn',
        'If-None-Match':'5ef343c9-1362d',
        'Upgrade-Insecure-Requests':'1',
    }

response  = requests.get(url,headers=headers)

  接着調用:requests.get(url,headers=headers) 發送請求中附帶頭部信息,同花順官網首先判斷你是不是有個爬蟲機器人,重要的信息是User-Agent  沒有的話,會判斷是一個機器人,我這裏設置的是谷歌瀏覽器,加上頭部信息後,可以獲取到返回信息了,但是最多隻能爬取5,6頁的數據,之後IP就被拉黑,過幾分鐘才能繼續爬取,顯然這是同花順對爬蟲第二層限制,網上查詢了一些大神用代理IP的方式還是隻能爬取5,6頁數據,通過我的觀察同花順的每次訪問的請求中必帶一個Cookie和If-None-Match字段,而且你點擊每一頁的時候Cookie和If-None-Match都會變化一次,我懷疑同花順在後臺會判斷Cookie的值,同一個Cookie的值最多隻能訪問5次左右,如果可以獲取到頁面的Cookie的值和If-None-Match的值應該就可以無限爬取,這裏我還是換回原來的包號稱只要頁面可以訪問到的頁面都能爬的selenium包,這是一個模擬人類自動點擊瀏覽器然後爬取瀏覽器頁面數據的包,代碼如下: 

#新建一個谷歌瀏覽器
chrome_options = webdriver.ChromeOptions()
#打開瀏覽器
#chrome_options.add_argument('--headless')
chrome_options.add_argument("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36")
browser = webdriver.Chrome(options=chrome_options)
wait = WebDriverWait(browser, 20)

url = "http://data.10jqka.com.cn/ajax/yjgg/date/2020-03-31/board/ALL/field/DECLAREDATE/order/desc/page/1/ajax/1/free/1/"

response = bowser.get(url)

同樣用這個包也是要設置User-Agent,不然還是會爬不到數據,最後經過不懈努力我爬取了同花順官網所有上市公司一季度利潤表並且存儲到Oracle中,怎麼樣是不是很簡單?關鍵是設置User-Agent信息,然後強大的selenium包會模擬人類訪問瀏覽器,所以不用構造Cookie和If-None-Match現在我是體會到Python強大的地方。

def main():
    con = conn_Db("XXXXX","XXXXXX","127.0.0.1:1521/XE")
    cur = con.cursor()

    dir=r'D:\測試python\同花順上市公司利潤表.xls'
    # 此處獲取目錄中所有的文件名稱
    book = xlrd.open_workbook(dir)

    for i in range(len(book.sheets())):
        table = book.sheet_by_index(i)
        rows_num = table.nrows #獲取行數
        cols_num = table.ncols #獲取列數

        list = {}
        for j in range(1,table.nrows):
            Database_SHARESLRB.CODE = int(table.cell(j,1).value)
            Database_SHARESLRB.NAME = table.cell(j,2).value
            #處理時間格式
            date = datetime(*xldate_as_tuple(table.cell_value(j,3),0))
            data_time = date.strftime('%Y-%m-%d') #('%Y/%m/%d %H:%M:%S')
            Database_SHARESLRB.NOTE_DATE = data_time

            Database_SHARESLRB.YYSR = getAllMoney(table.cell(j,4).value)
            Database_SHARESLRB.YYSR_TB = table.cell(j,5).value
            Database_SHARESLRB.YYSR_JDHB = table.cell(j,6).value
            Database_SHARESLRB.JLR = getAllMoney(table.cell(j,7).value)
            Database_SHARESLRB.JLR_TB = table.cell(j,8).value
            Database_SHARESLRB.JLR_JDHB = table.cell(j,9).value
            Database_SHARESLRB.MGSY = table.cell(j,10).value
            Database_SHARESLRB.MGJZC = table.cell(j,11).value
            Database_SHARESLRB.JZCSY = table.cell(j,12).value
            Database_SHARESLRB.XJLL = table.cell(j,13).value
            Database_SHARESLRB.XSMLL = table.cell(j,14).value
            Database_SHARESLRB.GD = table.cell(j,15).value
            data = {
                'CODE':''+str(Database_SHARESLRB.CODE )+'',
                'NAME':"'"+str(Database_SHARESLRB.NAME)+"'",
                'NOTE_DATE':"to_date('"+Database_SHARESLRB.NOTE_DATE+"','yyyy-MM-dd')",
                'YYSR':''+str(Database_SHARESLRB.YYSR)+'',
                'YYSR_TB':''+str(Database_SHARESLRB.YYSR_TB)+'',
                'YYSR_JDHB':"'"+str(Database_SHARESLRB.YYSR_JDHB)+"'",
                'JLR':''+str(Database_SHARESLRB.JLR)+'',
                'JLR_TB':''+str(Database_SHARESLRB.JLR_TB)+'',
                'JLR_JDHB':"'"+str(Database_SHARESLRB.JLR_JDHB)+"'",
                'MGSY':''+str(Database_SHARESLRB.MGSY)+'',
                'MGJZC':''+str(Database_SHARESLRB.MGJZC)+'',
                'JZCSY':''+str(Database_SHARESLRB.JZCSY)+'',
                'XJLL':''+str(Database_SHARESLRB.XJLL)+'',
                'XSMLL':''+str(Database_SHARESLRB.XSMLL)+'',
                'GD':"'"+str(Database_SHARESLRB.GD)+"'",
            }

            tableName = "SHARES_LRB"
            keys = ", ".join(data.keys())
            values = ', '.join(data.values())
            #values = tuple(data.values()) 轉化成元組
            check_sql = "select code from SHARES_LRB where code = '"+str(Database_SHARESLRB.CODE)+"'"
            count = cx_query(cur,check_sql)
            count = count.fetchone()
            if count is None:
                sql = "INSERT INTO {table}({key}) values({value})".format(table=tableName,key=keys,value=values)
                print(sql)
                cx_excueSql(cur,sql)
                #提交事務
                exe_commit(cur)
            else:
                pass

            #獲取每列的字段存到字典中
            # for k in range(1,cols_num):
            #     list[k] = str(table.cell(j,k).value)

        # for j in range(1,table.nrows):
        #     id = int(table.cell(j,0).value)
        #     shares_code = str(table.cell(j,2).value)
        #     shares_name = str(table.cell(j,3).value)
        #     print(shares_code)
    conn_close(con,cur)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章