<wbr id="juant"></wbr>
  • <wbr id="juant"></wbr>
    更多課程 選擇中心


    Python培訓

    400-111-8989

    Python爬蟲百度學術文獻--基于Python3.X

    • 發布: 楓葉
    • 來源:數量分析學習筆記
    • 時間:2017-11-20 17:19

    為快速了解是否有用,直接先給出最終能得到的效果:

    (如果沒有,看它作甚)

    這是我們得到的文獻信息文件。

    說明:

    每次查詢程序自動生成兩個文件,一個是xlsx格式文件(方便整理信息),一個是txt文件,方便查看文獻。

    txt文件內容:

    xlsx文件內容:

    2. 文件名稱是自動的生成的

    既然偷懶自然要偷懶到底,所以,程序會根據你設定的查詢文獻篇數,中文還是英文,查詢多少篇等等信心 自動生成對應的文件名稱。

    3. 能夠查詢什么內容呢。

    這個和“高級搜索”的方式差不多,只是這里使用修改參數,可以一次查詢任意篇文獻信息并保存下來。 當然可以自定義查中文文獻還是英文文獻。

    (說明:如果關鍵詞是 兩個以上中文詞 的時候,查英文文獻是查不到的,這個是學術百度自己的規則,這個“鍋”不該本程序背)

    另外,除了主題、起始頁和終止頁 必須填寫外,其他參數,可以是空值。

    (每頁對應10篇文章信息)

    4. 查詢失敗情況。

    在不同查詢的時候回存在少量的查詢失敗的情況,這個“鍋”該扔給誰呢,扔給百度一半吧, 這主要是因為,百度學術呈現的信息來源較多,信息呈現的規范性不足,這也是比較百度學術比較大的一個“坑”。

    例如:爬取 文章發表的文獻名稱時,有時候定義在“sc_journal”里面,但有時候又定義在"sc_conference"里面。

    還有很多種情況,我發現的問題,我都兼容過了,不過還是存在一些其他參數放置位置不一致的情況,如果去查找所有的不一致規則,去修改程序兼容,工作量太大,所以,沒有精力去完善,不過這樣的情況相對較少,所以,誰有興趣完善一下,那就太感謝了。

    為了彌補這種情況,我專門設定了如果查詢某一篇文獻失敗,就會顯示文獻信息對應的URL:

    復制這個URL,到瀏覽器中打開:

    雙擊-->檢查(或 審查元素)-->Network-->刷新頁面-->doc-->Preview

    就可以得到如下界面:

    查詢失敗文章的信息 就都在這個meta-di-info里面,可以點開補充。

    (實際上,查詢100篇信息,大概也就幾篇文章會出現規則不一致,所以,問題不算嚴重,不是太嚴格的話,忽略不計也沒有問題)

    想想,其他應該也沒什么了。

    -------------------------------------------

    利用Python3.6寫了如何爬取CNKI上的主題文獻信息,后來想想,似乎CNKI上的文獻資源相對局限,百度學術上的文獻資源更加豐富,因此,擴展了代碼,用于百度學術資源的快速獲取。

    百度學術上能獲取英文文獻資源,是一個較大的優勢,并且資料來源較為豐富。

    --------------------------------------

    完整代碼如下(如果有人基于此程序程序擴展或完善,歡迎交流):

    ------------------------------------

    #!/usr/bin/env python3

    # -*- coding: utf-8 -*-

    """

    Created on Sat Nov 18 22:10:28 2017

    @author: Liu Kuanbin

    """

    #----------------------------------加載將會使用到的函數庫

    import requests # 讀取網頁

    from lxml import etree # 用于解析網頁

    from openpyxl import Workbook # 創建表格并用于數據寫入

    import urllib

    #------------------定義獲取文章列表對應的鏈接的函數

    def get_data(urllist,headers,i):

    j=0 # 初始化j的取值

    for urli in urllist:

    try:

    j=j+1

    num=10*(i-pagestart)+j # 第多少篇

    test='http://xueshu.baidu.com'+str(urli) # 單篇文章對應的頁面網址

    code=requests.get(test)

    file=code.text.encode(code.encoding).decode('utf-8') # 對網頁信息進行轉化成為可以正常現實的 UTF-8格式

    r=etree.HTML(file) # 獲取網頁信息,并且解析 使用xpath

    #--- 因為存在不同的數據來源,有些來源無法獲取數據,因此循環獲取來源,直到可以獲取

    for k in range(0,8):

    p1=r.xpath('//div[@class="allversion_content"]/span/a/@data-url')[k] # 選擇不同的來源鏈接

    p2=r.xpath('//div[@class="abstract_wr"]/p[2]/@data-sign')[0]

    url_alli='http://xueshu.baidu.com/usercenter/data/schinfo?url='+p1+'&sign='+p2

    if len(urllib.request.urlopen(url_alli).read())>100:

    break

    #---------------------------------------------------------------------

    file=requests.get(url_alli).json()

    ws.cell(row=num+1,column=1).value='第'+str(num)+'篇文章信息'

    ws.cell(row=num+1,column=2).value=file["meta_di_info"]["sc_title"][0] # 獲取 文章標題

    ws.cell(row=num+1,column=3).value=file["meta_di_info"]["sc_author"][0]["sc_name"][0] # 獲取第一作者

    ws.cell(row=num+1,column=5).value=file["meta_di_info"]["sc_cited"][0] # 引用次數

    ws.cell(row=num+1,column=6).value=file["meta_di_info"]["sc_year"][0] # 發表刊物時間

    ws.cell(row=num+1,column=8).value=file["meta_di_info"]["sc_abstract"][0] # 獲取 文章摘要

    # 容易出問題的地方

    # 1. 獲取發表刊物

    try:

    journal=file["meta_di_info"]["sc_publish"][0]["sc_journal"][0] # 期刊

    except:

    journal=file["meta_di_info"]["sc_publish"][0]["sc_conference"][0]

    ws.cell(row=num+1,column=4).value=str(journal)

    # 3. 關鍵詞

    try:

    keyw=file["meta_di_info"]["sc_keyword"]

    key=''

    for item in range(len(keyw)):

    key=key+keyw[item]+','

    except:

    key=''

    ws.cell(row=num+1,column=7).value=key # 關鍵詞

    # print('爬蟲'+str(10*(pageend-pagestart+1))+'篇文章信息的第'+str(num)+'篇爬取成功!!')

    print('爬蟲第'+str(i)+'頁中的第'+str(j)+'篇爬蟲成功!!')

    with open('百度學術關于'+'”'+liu_key+'"''前'+str(10*(pageend-pagestart+1))+'篇'+lang+'文獻'+'按照'+paixu+'排序.txt','a',encoding='utf-8') as f: # 新建一個pinglun的txt文件,用二進制方式,編碼方式 UTF-8 ,句柄名為f

    f.write(file["meta_di_info"]["sc_title"][0]) # 文章題目

    f.write('\n')

    f.write(file["meta_di_info"]["sc_author"][0]["sc_name"][0]) # 作者

    f.write('-')

    f.write(file["meta_di_info"]["sc_year"][0]) # 年份

    f.write('-')

    f.write(file["meta_di_info"]["sc_cited"][0]) # 引用量

    f.write('-')

    f.write(str(journal)) # 文章發表刊物

    f.write('\n')

    f.write(file["meta_di_info"]["sc_abstract"][0]) # 獲得文章摘要

    f.write('\n\n')

    except:

    print('爬蟲第'+str(i)+'頁中的第'+str(j)+'篇爬蟲失敗')

    print(url_alli)

    #---創建表格,待接收數據信息---#---------------------------------------------------

    wb = Workbook() # 在內存中創建一個workbook對象,而且會至少創建一個 worksheet

    ws = wb.active #獲取當前活躍的worksheet,默認就是第一個worksheet

    ws.cell(row=1, column=1).value ="No"

    ws.cell(row=1, column=2).value ="Title"

    ws.cell(row=1, column=3).value ="Author"

    ws.cell(row=1, column=4).value ="Journal"

    ws.cell(row=1, column=5).value ="Cites"

    ws.cell(row=1, column=6).value ="Year"

    ws.cell(row=1, column=7).value ="Keywords"

    ws.cell(row=1, column=8).value ="Abstart"

    #-----------------------------------------------------------------------------參數設置區

    wd='互聯網' # 主題控制:此行設置搜索主題

    english=0 # 關鍵詞是 中文=0 英文=1

    pagestart=1 # 起始頁

    pageend=2 # 終止頁

    sort='' # 排序控制:sc_cited=引用量 sc_time=時間 默認為相關性排序 (空值的時候 就是相關性排序查詢了)

    sc_tr=6 # 希望搜索文章語言類型: 1=中文 6= 英文

    style='' # 類型: 1=期刊 ;2=學位論文; 3=會議論文; 4=圖書; 5=專利;

    autor='' # 作者姓名控制

    #-----------------------------------------------------------------------------文件名稱定義

    liu_key=wd

    if len(sort)>2:

    paixu=sort

    else:

    paixu='相關性'

    if sc_tr==1:

    lang='中文'

    elif sc_tr==6:

    lang='英文'

    #-----------------------------------------------------------------------------參數設置區

    #-----排序處理

    if len(sort)==0:

    sort=''

    else:

    sort='&sort='+sort

    #-----語言處理

    if len(str(sc_tr))==0:

    sc_tr=''

    else:

    sc_tr='&sc_tr='+str(sc_tr)

    #-----文章篩選處理處理

    if len(style)==0:

    style=''

    else:

    style='&filter=sc_type={'+style+'}'

    #-----文章類型篩選處理

    if len(autor)==0:

    autor=''

    else:

    autor='&tag_filter= authors:('+autor+')'

    # 生成 URL

    if english==0:

    url='http://xueshu.baidu.com/s?wd='+wd+'&ie=utf-8'+sort+sc_tr+style+autor

    elif english==1:

    url='http://xueshu.baidu.com/s?wd='+wd+'&ie=utf-8'+sort+style+autor

    #-----------------------------------------------------------------------------參數設置區

    urlip = 'http://www.xicidaili.com/nt/' # 提供代理IP的網站

    headers={

    'Referer':'http://#/hm.js?43115ae30293b511088d3cbe41ec09',

    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',

    'Cookie':'BAIDUID=D0CB679BEEF23F82EEDAF6DF18F4FEFF:FG=1; PSTM=1510625999; BIDUPSID=06E79C7EE33716F5BE38D223303FD8B2; HMACCOUNT=AF4DA2CBBA0B0EEC; pgv_pvi=8289640448; pgv_si=s5000054784; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDRCVFR[w2jhEs_Zudc]=mk3SLVN4HKm; PSINO=2; H_PS_PSSID=',

    }

    headers2={

    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'

    }

    #------------------------------------------------------------------------------數據收集和處理

    for i in range(pagestart,pageend+1):

    # print('獲得每一頁里面文章的 urllist')

    url_all=url+'&pn='+str(10*(i-1))

    print(url_all)

    #----------------------獲得每一頁的文章具體文章信息頁面的鏈接

    response=requests.get(url_all,headers=headers) # 獲得網頁源碼 ,proxies=proxies

    # print(utf16_response.decode('utf-16'))

    file=response.text.encode(response.encoding).decode('utf-8') # 對網頁信息進行轉化成為可以正常現實的 UTF-8格式

    r=etree.HTML(file) # 獲取網頁信息,并且解析 使用xpath

    urllist=r.xpath('//div[@class="sc_content"]/h3/a[1]/@href') # 獲得當前頁所有文章的進入鏈接

    # 獲得每頁urllist的文章信息,并且存到構建的表格中

    get_data(urllist,headers,i)

    wb.save('百度學術關于'+'”'+liu_key+'"'+'前'+str(10*(pageend-pagestart+1))+'篇'+lang+'文獻'+'按照'+paixu+'排序.xlsx') # 最后保存搜集到的數據

    本文內容轉載自網絡,本著分享與傳播的原則,版權歸原作者所有,如有侵權請聯系我們進行刪除!

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:Python爬蟲爬取百度指數的關鍵詞搜索指數教程
    下一篇:Python老司機給上路新手的3點忠告

    2021年Python面試題及答案匯總詳解

    python數據分析,你需要這些工具

    Python培訓講解二叉樹的三種深度

    Python培訓:如何實現窮舉搜索?

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    天天日天天射天天干天天伊|奇米电影|奇米网_奇米首页|奇米首页 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>