【python2.7】爬取知網(wǎng)論文

# -*- coding: utf-8 -*-
import time
import urllib
import urllib2
import cookielib
from lxml import etree
import random


'''
爬取第一頁咸灿,獲取共頁數(shù)
爬取第二頁至最后一頁
'''

# 下載當(dāng)前頁所有文章的pdf或caj
def download_paper(treedata, opener, localdir):
    '''
    傳入?yún)?shù):
        treedata:當(dāng)前列表頁的treedata數(shù)據(jù)
        opener: referer已修改為當(dāng)前頁
        localdir: 保存目錄
    '''
    tr_node = treedata.xpath("http://tr[@bgcolor='#f6f7fb']|//tr[@bgcolor='#ffffff']")

    for item in tr_node:
        paper_title = item.xpath("string(td/a[@class='fz14'])")
        paper_link = item.xpath("td/a[@class='fz14']/@href")
        paper_author = item.xpath("td[@class='author_flag']/a/text()")
        paper_source = item.xpath("td[4]/a/text()")
        paper_pub_date = item.xpath("td[5]/text()")
        paper_db = item.xpath("td[6]/text()")
        paper_cited = item.xpath("td[7]//a/text()")
        paper_download_count = item.xpath("td[8]/span/a/text()")
        print paper_title
        print paper_link

        # 獲取paper詳情頁面鏈接瓦灶,訪問詳情頁前吼畏,要設(shè)置referer
        paper_detail_url_fake = "http://kns.cnki.net" + paper_link[0]
        response = opener.open(paper_detail_url_fake)
        paper_detail_page_treedata = etree.HTML(response.read())
        # 下載前要設(shè)置referer為詳情頁
        opener.addheaders = [("Referer", response.url)]

        # 碩士論文并沒有【pdf下載】的鏈接
        pdf_download_url = paper_detail_page_treedata.xpath('//*[@id="pdfDown"]/@href')
        if len(pdf_download_url) == 0:
            whole_book_download_url = paper_detail_page_treedata.xpath('//*[@id="DownLoadParts"]/a[1]/@href')
            download_url = whole_book_download_url[0]
            filename = localdir + paper_title + ".caj"
        else:
            download_url = pdf_download_url[0]
            filename = localdir + paper_title + ".pdf"
        filename.replace("\\", "").replace("/","").replace(":", "").replace("*", "").replace("?", "").replace("\"","").replace("<","").replace(">","").replace("|","")
        response_file = opener.open(download_url)
        down_file = open(filename, 'wb')
        down_file.write(response_file.read())
        down_file.close()


# 構(gòu)建第一次請(qǐng)求時(shí)使用的URL
url = 'http://kns.cnki.net/kns/request/SearchHandler.ashx?action=&NaviCode=*&'
parameter={'ua':'1.11'}
parameter['formDefaultResult']=''
parameter['PageName']='ASP.brief_default_result_aspx'
parameter['DbPrefix']='SCDB'
parameter['DbCatalog']='中國學(xué)術(shù)文獻(xiàn)網(wǎng)絡(luò)出版總庫'
parameter['ConfigFile']='SCDBINDEX.xml'
parameter['db_opt']='CJFQ'
parameter['db_opt']='CJFQ,CJRF,CDFD,CMFD,CPFD,IPFD,CCND,CCJD'
parameter['txt_1_sel']='SU$%=|'
parameter['txt_1_value1']='爬蟲'
parameter['txt_1_special1']='%'
parameter['his']='0'
parameter['parentdb']='SCDB'
parameter['__']='Sun Nov 05 2017 20:09:05 GMT+0800 (中國標(biāo)準(zhǔn)時(shí)間) HTTP/1.1'
times = time.strftime('%a %b %d %Y %H:%M:%S')+' GMT+0800 (中國標(biāo)準(zhǔn)時(shí)間)'
parameter['__']=times

getdata = urllib.urlencode(parameter)

uapools = [
    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0",
    "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10",
    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0",
    "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11"
]




headers = {'Connection': 'Keep-Alive','Accept': 'text/html,*/*','User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36'}
headers['Referer']='http://kns.cnki.net/kns/brief/default_result.aspx'
#headers['User-Agent'] = random.choice(uapools)
req = urllib2.Request(url + getdata, headers=headers)

cookie = cookielib.CookieJar()

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie), urllib2.HTTPHandler)
html = opener.open(req).read()

with open('C:/code/test3/web1.html', 'w') as e:
    e.write(html)

# 構(gòu)建第二次請(qǐng)求時(shí)使用的URL
query_string = urllib.urlencode({'pagename': 'ASP.brief_default_result_aspx','dbPrefix':'SCDB', 'dbCatalog': '中國學(xué)術(shù)文獻(xiàn)網(wǎng)絡(luò)出版總庫',
                                 'ConfigFile': 'SCDBINDEX.xml', 'research':'off', 't': int(time.time()), 'keyValue': '爬蟲', 'S': '1'})

url2 = 'http://kns.cnki.net/kns/brief/brief.aspx'
req2 = urllib2.Request(url2 + '?' + query_string, headers=headers)
# 返回的是搜索結(jié)果列表頁,第一頁
result2 = opener.open(req2)
#opener.addheaders = [("Referer", req2.get_full_url())]
html2 = result2.read()
with open('C:/code/test3/web2.html', 'w') as e:
    e.write(html2)

treedata = etree.HTML(html2)

# 請(qǐng)求詳情頁之前把引用地址改成列表頁
opener.addheaders = [("Referer", req2.get_full_url())]
localdir = "C:/code/test3/pdf/"
download_paper(treedata, opener, localdir)

#獲取總頁數(shù)total_page_count
current_page_node = treedata.xpath('//span[@class="countPageMark"]/text()')
print "current_page_node:", current_page_node
total_page_count = current_page_node[0].split('/')[1]
print "total_page_count:", total_page_count

current_url = result2.url
for page_num in range(2, int(total_page_count)+1):
    #獲取下一頁的鏈接
    print "準(zhǔn)備爬取第", str(page_num), "頁"
    next_page_node = treedata.xpath('//div[@class="TitleLeftCell"]/a[last()]/@href')
    next_page_url = next_page_node[0]
    next_page_url_full = url2 + next_page_url
    opener.addheaders = [("Referer", current_url)]
    # 返回的是搜索結(jié)果下一頁的列表頁
    next_page_response = opener.open(next_page_url_full)
    opener.addheaders = [("Referer", next_page_response.url)]
    #file_next_page = open('C:/code/test3/web4' + str(page_num) + '.html', 'w')
    html = next_page_response.read()
    #file_next_page.write(html)
    #file_next_page.close()
    
    
    #print "current_url:", current_url
    #print "next_page_url:", next_page_response.url
    # 修改上一頁堵漱,以供請(qǐng)求下頁時(shí)引用
    #result2 = next_page_response
    treedata = etree.HTML(html)
    current_url = next_page_response.url

    localdir = "C:/code/test3/pdf/"
    download_paper(treedata, opener, localdir)

最新代碼
https://github.com/tom523/crawlCnki.git
爬蟲夾故障

  • 服務(wù)器響應(yīng)超時(shí)
  • 驗(yàn)證碼輸入
image.png

不只一次的在第17頁,需要輸入驗(yàn)證碼


image.png

處理方法:重新更換User-Agent后坦敌,直接從第17頁開始爬取

20171110日志
image.png

20171109晚上爬取結(jié)果,搜索關(guān)鍵字“爬蟲”碉碉,看起來像是給了假數(shù)據(jù),可能知網(wǎng)檢測出來了爬蟲淮韭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末垢粮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子靠粪,更是在濱河造成了極大的恐慌蜡吧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庇配,死亡現(xiàn)場離奇詭異斩跌,居然都是意外死亡绍些,警方通過查閱死者的電腦和手機(jī)捞慌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柬批,“玉大人啸澡,你說我怎么就攤上這事〉剩” “怎么了嗅虏?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長上沐。 經(jīng)常有香客問我皮服,道長,這世上最難降的妖魔是什么参咙? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任龄广,我火速辦了婚禮,結(jié)果婚禮上蕴侧,老公的妹妹穿的比我還像新娘择同。我一直安慰自己,他們只是感情好净宵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布敲才。 她就那樣靜靜地躺著,像睡著了一般择葡。 火紅的嫁衣襯著肌膚如雪紧武。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天敏储,我揣著相機(jī)與錄音脏里,去河邊找鬼。 笑死虹曙,一個(gè)胖子當(dāng)著我的面吹牛迫横,可吹牛的內(nèi)容都是我干的番舆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼矾踱,長吁一口氣:“原來是場噩夢啊……” “哼恨狈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呛讲,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤禾怠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后贝搁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吗氏,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年雷逆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弦讽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膀哲,死狀恐怖往产,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情某宪,我是刑警寧澤仿村,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站兴喂,受9級(jí)特大地震影響蔼囊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衣迷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一畏鼓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蘑险,春花似錦滴肿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至呵俏,卻和暖如春堆缘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背普碎。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工吼肥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓缀皱,卻偏偏與公主長得像斗这,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子啤斗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,777評(píng)論 25 707
  • 簡介: 為了你我可以放棄我的全部表箭,只是,你卻不給我放棄的機(jī)會(huì)钮莲,我踏過千山萬水只為換你回眸一笑免钻,然而,最終你還...
    穿越深海來愛你閱讀 513評(píng)論 0 1
  • 至今我依然無法融入到人群之中崔拥,不論我如何的努力极舔。 在人群之中時(shí),我會(huì)帶著一個(gè)面具链瓦。但是無人能夠看出面具之下的我是多...
    蜉蝣的蜉蝣閱讀 149評(píng)論 0 0
  • 傍晚在街邊的公交站臺(tái)那個(gè)日日都停留的地方日日和不同的人接踵把萬事都磨碎了裝在垃圾桶里把煩惱都逼瘋了附在擁擠的車廂里...
    流虻閱讀 262評(píng)論 0 0
  • 01 昨天澡绩,大學(xué)閨蜜找我聊天稽揭,無意中和我提到她的一個(gè)好閨蜜最近分手了贾铝,分手的原因是男方出軌吼拥。 事情經(jīng)過是這樣的:女...
    蘇草Chen閱讀 449評(píng)論 0 2