Python簡易爬蟲

常常須要下載論文,每次都須要去網頁上搜索,而後點擊下載,實在麻煩,正好最近剛入門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

相關文章
相關標籤/搜索