他爸對籃球真可是相當鍾愛,基本是每個賽季必追。我就不同了,自從高中畢業後,就再也沒怎麼看籃球了。於是,我就有感而發,是否可以爬取現役球員的一些信息,看看我還有幾個認識的。
1. 頁面分析 我爬取的頁面是騰訊體育,鏈接如下:https://nba.stats.qq.com/player/list.html觀察上圖:左邊展示的分別是NBA的30支球隊,右邊就是每隻球隊對應球員的詳細信息。此時思路就很清晰了,我們每點擊一支球員,右側就會出現該球隊的球員信息。那麼,現在要做的就是找到每支球員頁面的url,去發現它們的關聯。我們每點擊一支球隊,複製它的url,下面我複製了三支球隊的頁面url,如下所示:#76人https://nba.stats.qq.com/player/list.htm#teamId=20#火箭https://nba.stats.qq.com/player/list.htm#teamId=10#熱火https://nba.stats.qq.com/player/list.htm#teamId=14觀察上述url,可以發現:url基本一模一樣,除了參數teamId對應的數字不一樣,完全可以猜測出,這就是每支球隊對應的編號,30支球隊30個編號。只要是涉及到「騰訊」二字,基本都是動態網頁,我之前碰到過好多次。基礎方法根本獲取不到數據,不信可以查看網頁源碼試試:點擊鼠標右鍵——>點擊查看網頁源代碼。接着,將網頁中的某個數據(你要獲取的)複製,然後再源代碼頁面中,點擊crtl + f,調出「搜索框」,將複製的數據粘貼進去。如果和上圖一樣,出現0條記錄,則基本可以判斷該網頁屬於動態網頁,直接獲取源碼,一定找不到你要的數據。因此如果你想要獲取頁面中的數據,使用selenuim自動化爬蟲,是其中一種辦法。2. 數據爬取 關於selenium用配置,我在一篇文章中詳細講述過,貼上這個鏈接供大家參考:《手把手教你爬取淘寶的筆記本電腦數據,指導你如何選購電腦!》我喜歡用xpath,對於本文數據的獲取,我都將使用它。關於xpath的使用,那就是另一篇文章了,這裡就不詳細講述。
fromseleniumimportwebdriver#創建瀏覽器對象,該操作會自動幫我們打開Google瀏覽器窗口browser=webdriver.Chrome()#調用瀏覽器對象,向服務器發送請求。該操作會打開Google瀏覽器,並跳轉到「百度」首頁browser.get("https://nba.stats.qq.com/player/list.htm#teamId=20")#最大化窗口browser.maximize_window()#獲取球員中文名chinese_names=browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[2]/a')chinese_names_list=[i.textforiinchinese_names]#獲取球員英文名english_names=browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[3]/a')english_names_list=[i.get_attribute('title')foriinenglish_names]#獲取屬性#獲取球員號碼numbers=browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[4]')numbers_list=[i.textforiinnumbers_list]#獲取球員位置locations=browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[5]')locations_list=[i.textforiinlocations_list]#獲取球員身高heights=browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[6]')heights_list=[i.textforiinheights_list]#獲取球員體重weights=browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[7]')weights_list=[i.textforiinweights_list]#獲取球員年齡ages=browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[8]')ages_list=[i.textforiinages_list]#獲取球員球齡qiu_lings=browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[9]')qiu_lings_list=[i.textforiinqiu_lings_list]這裡只爬取了一支球隊,剩下29支球隊球員數據的爬取任務交給你們。整個代碼部分,基本上大同小異,我寫了一個,你們照葫蘆畫瓢。3. 存儲至txt 將數據保存到txt文本的操作非常簡單,txt幾乎兼容所有平台,唯一的缺點就是不方便檢索。要是對檢索和數據結構要求不高,追求方便第一的話,請採用txt文本存儲。txt文檔寫入數據的規則是這樣的:從頭開始,從左至右一直填充。當填充至最右邊後,會被擠到下一行。因此,如果你想存入的數據規整一點,可以自動填入制表符「\t」和換行符「\n」。foriinzip(chinese_names_list,english_names_list,numbers_list,locations_list,heights_list,weights_list,ages_list,qiu_lings_list):withopen("NBA.txt","a+",encoding="utf-8")asf:#zip函數,得到的是一個元組,我們需要將它轉換為一個字符串f.write(str(i)[1:-1])#自動換行,好寫入第2行數據f.write("\n")f.write("\n")4. 存儲至excel excel有兩種格式的文件,一種是csv格式,一種是xlsx格式。將數據保存至excel,當然是使用pandas庫更方便。importpandasaspd#一定要學會組織數據df=pd.DataFrame({"中文名":chinese_names_list,"英文名":english_names_list,"球員號碼":numbers_list,"位置":locations_list,"身高":heights_list,"體重":weights_list,"年齡":ages_list,"球齡":qiu_lings_list})#to_excel()函數df.to_excel("NBA.xlsx",encoding="utf-8",index=None)5. 存儲至mysql MySQL是一個關係型數據庫,數據是採用類excel的二維表來保存數據的,即行、列組成的表,每一行代表一條記錄,每一列代表一個字段。關於Python操作MySQL數據庫,我曾經寫了一篇博客,大家可以參考以下:http://blog.csdn.net/weixin_41261833/article/details/103832017① 創建一個表nba我們想要往數據庫中插入數據,首先需要建立一張表,這裡命名為nba。importpymysql#1.連接數據庫db=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='demo',charset='utf8')#2.創建一個表#創建一個游標對象;cursor=db.cursor()#建表語句;sql="""createtableNBA(chinese_names_listvarchar(20),english_names_listvarchar(20),numbers_listvarchar(20),locations_listvarchar(20),heights_listvarchar(20),weights_listvarchar(20),ages_listvarchar(20),qiu_lings_listvarchar(20))charset=utf8"""#執行sql語句;cursor.execute(sql)#斷開數據庫的連接;db.close()② 往表nba中插入數據importpymysql#1.組織數據data_list=[]foriinzip(chinese_names_list,english_names_list,numbers_list,locations_list,heights_list,weights_list,ages_list,qiu_lings_list):data_list.append(i)#2.連接數據庫db=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='demo',charset='utf8')#創建一個游標對象;cursor=db.cursor()#3.插入數據sql='insertintonba(chinese_names_list,english_names_list,numbers_list,locations_list,heights_list,weights_list,ages_list,qiu_lings_list)values(%s,%s,%s,%s,%s,%s,%s,%s)'try:cursor.executemany(sql,data_list)db.commit()print("插入成功")except:print("插入失敗")db.rollback()db.close()