常常須要下載論文,每次都須要去網頁上搜索,而後點擊下載,實在麻煩,正好最近剛入門Python,心血來潮,想着寫一個爬蟲app
通過一天查閱資料,基本算是完成了,可是仍是不足,好比對知網和萬方暫時還不行,可是對於英文文獻是基本上沒有問題的,思路就是在百度學術上進行搜索,拿到它搜索結果的第一個頁面,而後把裏面的下載連接所有爬下來,循環,進行判斷,只要下載成功,就退出。可是對於少部分的外國文獻庫,知網和萬方,他們是的下載連接是須要拿到百度學術搜索鏈接後,在把這個頁面下的下載連接爬下來,這一點寫個遞歸最好了,時間有限,這個問題等過幾天再進行補充。編碼
下面直接上代碼:url
import urllib import urllib.request import re import os #得到百度學術的第一個搜索結果 def baidusearch(key): #百度中的用是gbk編碼,像Google中則是utf8編碼,所以這裏 #須要先編碼 key=urllib.request.quote(key.encode('gbk')) url='''http://xueshu.baidu.com/s?wd={}'''.format(key) response=urllib.request.urlopen(url) str1=response.read().decode(encoding='utf8') #匹配百度學術中的全部搜索結果 mat=re.compile(r'href="/s\?wd=paperuri\S+"') str1=mat.findall(str1) #取出第一個搜索結果 #將先後的href和引號去掉 str1=str1[0][6:-1] #拼接爲完整的路徑 str1=r'http://xueshu.baidu.com'+str1 return str1 #得到搜索結果頁面中的可用的下載連接 def getLink(key): response=urllib.request.urlopen(baidusearch(key)) str1=response.read().decode(encoding='utf8') #匹配真正的下載地址 mat=re.compile(r'<a class="dl_item" \S+ \S+"') str1=mat.findall(str1) #去掉地址的先後多餘信息 if str1: for i in range(len(str1)): str1[i]=str1[i][41:-1] #爲了防止連接失效,這裏返回全部可下載地址 return str1 #獲得下載連接的響應報文頭 def filesize(url): request=urllib.request.Request(url) response=urllib.request.urlopen(request) return dict(response.info()) #下載文件 def dFile(key,path='d:\\'): li=getLink(key) if len(li): for dowpath in li: name=dowpath.split('/')[-1] try: if filesize(dowpath)['Content-Type']=='application/pdf': print('將要從',dowpath,'下載') #輸出下載進度 def abk(a,b,c): per=a*b/c*100.0 if per>100: per=100 print('已完成:%.2f%%' %per) #開始下載 print(name) urllib.request.urlretrieve(dowpath,os.path.join(path,name),abk) break except: continue def main(): while True: key=input('請輸入論文名,支持模糊搜索\n') path=input('請輸入下載路徑,例如:c:\,默認爲D盤根目錄\n') if len(path)==0: path='D:\\' print('開始下載\n') dFile(key,path) yn=input('下載完成,是否繼續:y/n:') if yn=='y': continue else: break #調試模塊 if __name__=='__main__': main()
這只是一個試驗品。等過幾天完善一下 在詳細說明spa