我們在處理一些網站數據的時候,有時候我們需要的數據很多都是動態加載的,而不都是靜態的,以下以一個實例來介紹簡單的獲取動態數據,首先申明本人小白,還在學習python中,這個方法還是比較笨拙的,但是對於初學者還是需要知道的。
首先我們的要求是獲取下面文章的參考文獻:
剛剛開始,我的想法是使用lxml、BeatifulSoup、正則表達式來處理,這幾個是處理靜態網站的常用方法,查看網頁源碼我們會發現相應的div里面是空,也就是說上面的數據不是靜態的,而是后面動態加載的,利用googl瀏覽器可以看到:
標記的三個對應了網站里面的相似文獻、參考文獻、引證文獻,我們需要的是參考文獻,所以點擊第二個:
我們可以看到數據就在里面,然后點擊Header,復制里面的URL:
利用下面的代碼就可以獲取相應的數據了:
#-*- coding:utf-8 -*-
import requests url='http://xueshu.baidu.com/usercenter/data/schpaper?callback=jQuery110208239584223582068_1502539053728&wd=citepaperuri%3A(17d24f9533609a132a16703fde60ce19)&req_url=http%3A%2F%2Fwww.oalib.com%2Fpaper%2F4015889&type=reference&rn=10&page_no=1' data=requests.get(url) print data
但是如果要獲取所有的參考文獻怎么辦,我們不能一個鏈接一個鏈接的復制,那不就特別麻煩,下面是代碼的改進,首先我們要知道總共有多少頁參考文獻,也就是URL里面的page_no的·值,以下為改進的代碼:(其實我們也可以直接估計有50頁參考文獻,然后使用try。。。except。。。來獲取異常也是可以的)
#-*- coding:utf-8 -*-
import requests n=相關頁數 url='http://xueshu.baidu.com/usercenter/data/schpaper?callback=jQuery110208239584223582068_1502539053728&wd=citepaperuri%3A(17d24f9533609a132a16703fde60ce19)&req_url=http%3A%2F%2Fwww.oalib.com%2Fpaper%2F4015889&type=reference&rn=10&page_no='
for i in range(1,n+1): data=requests.get(url+str(i)) print data
返回值是json格式的,剩下的就是處理json格式了(記得除去返回的多余數據),參見:http://www.cnblogs.com/ybf-yyj/articles/7351580.html。
以下貼上所有代碼:
#-*- coding:utf-8 -*- import requests import re import json def get_reference(url): data=requests.get(url) json_datas=data.content #使用貪婪算法的正則表達式獲取json類型的字符串 json_data = re.compile(r"{.*}") json_data = json_data.search(json_datas).group() # 將獲取的json字符串轉化為字典 title_data=json.loads(json_data) n=title_data.get('data').get("resultList") for i in range(0,len(n)): try: print 'reference:', print n[i].get('meta_di_info').get('sc_title')[0] for i in n[i].get('meta_di_info').get('sc_author'): print i.get('sc_name')[1]+u',', print '\n' except: print i n=4 url='http://xueshu.baidu.com/usercenter/data/schpaper?callback=jQuery110204974031490917943_1502604841329&wd=citepaperuri%3A(0689fe98fd34a1aac82d41225ad9ceca)&req_url=http%3A%2F%2Feuropepmc.org%2Fabstract%2Fmed%2F24235252&type=reference&rn=10&page_no=' for i in range(1,n+1): get_reference(url+str(i))