天天看點

爬蟲(13)-爬蟲爬取CVPR+ICCV+ECCV期刊論文自動下載下傳PDF儲存檔案中(科研黨福利)

文章目錄

    • 1.分析網頁
    • 2.分析ECCV期刊頁面
    • 3.爬取ECCV期刊代碼
    • 4.爬取ICCV期刊代碼
    • 5.爬取CVPR期刊代碼
    • 6.結果展示
    • 7.存儲PDF添加時間限制

最近導師叫我下載下傳CVPR,ICCV,ECCV會議論文,發現每個期刊都有好幾百篇論文。一個一個點選非常耗費時間,正好在學習爬蟲,利用爬蟲抓取一下網頁。

完成老師配置設定的任務之後将這個代碼分享出來,供大家使用和學習,解決下載下傳論文的煩惱。畢竟科技的進步就是使人懶惰,哈哈哈

運作速度和每個人的網速有關,可以先在浏覽器中下載下傳一個論文,測一下網速,網速慢的話建議搭載VPN,也有部分論文記憶體很大,可以中斷程式,for循環跳過即可。

我們将提取的PDF連結自動下載下傳論文,然後儲存在檔案夾中。

認為有用的話請點贊,碼字不易,謝謝。

其他爬蟲實戰請檢視:https://blog.csdn.net/qq_42754919/category_10354544.html

1.分析網頁

首先打開三個會議期刊的接口:https://openaccess.thecvf.com/menu

我們可以清楚的看到期刊按照年份進行排序,其中ECCV在Other Computer Vision Conferences and Workshops中。

爬蟲(13)-爬蟲爬取CVPR+ICCV+ECCV期刊論文自動下載下傳PDF儲存檔案中(科研黨福利)
爬蟲(13)-爬蟲爬取CVPR+ICCV+ECCV期刊論文自動下載下傳PDF儲存檔案中(科研黨福利)
爬蟲(13)-爬蟲爬取CVPR+ICCV+ECCV期刊論文自動下載下傳PDF儲存檔案中(科研黨福利)

在得到每個期刊每年的路徑接口後,我們就可以得到該網址的URL,下面我們将示範對三個期刊的爬取。

2.分析ECCV期刊頁面

ECCV中羅列出2020年和2018年份論文接口,我們選擇一個檢視頁面。

網站的的URL為:https://openaccess.thecvf.com/ECCV2018

是以當需要爬取2020年份的論文隻需要把位址改從:

https://openaccess.thecvf.com/ECCV2018

改為:

https://openaccess.thecvf.com/ECCV2020
爬蟲(13)-爬蟲爬取CVPR+ICCV+ECCV期刊論文自動下載下傳PDF儲存檔案中(科研黨福利)

點選網頁上PDF按鈕,浏覽器自動下載下傳對應的論文,我們的目的是自動下載下傳論文,是以隻需要提取出PDF對應的下載下傳連結即可。順便把論文的标題爬取下來,當做儲存檔案的名稱友善檢視

爬蟲(13)-爬蟲爬取CVPR+ICCV+ECCV期刊論文自動下載下傳PDF儲存檔案中(科研黨福利)

3.爬取ECCV期刊代碼

在上一部中我們分析了網頁,可以得到網頁的URL和title。

在此基礎上,網頁的加載是JS渲染,是以我們不能簡單的通過request.get()擷取網頁的HTML代碼。需要使用selenium驅動浏覽器獲得page_source。

在代碼的編寫上,使用for循環周遊讀取的URL,友善論文記憶體大時,跳過該論文。

此外爬取的連結是不完整的,我們 還需要加上:

https://openaccess.thecvf.com/
import requests,re,os,json
from pyquery import PyQuery as pq
from lxml import etree 
import time
from selenium import webdriver

def gethtml(url):
    brower = webdriver.Firefox()
    brower.get(url)
    html = brower.page_source
    return html
def getpdf(html):
    html=etree.HTML(html)
    indexs=html.xpath('//dl/dd/a[1]/@href')
    base_url='https://openaccess.thecvf.com/'
    title=html.xpath('//dl/dt/a/text()')
    print(len(title))
    for i in range(0,len(title)):
        url=base_url+indexs[i]
        print(url)
        #print(title[i])
        writepdf(url,title[i])

def writepdf(url,title):
    response=requests.get(url)
    file_path='C:/Users/10043/Desktop/ECCV2018'
    PDF_path=file_path+os.path.sep+'{0}.{1}'.format(title.replace(':','').replace('?',''),'pdf')
    if not os.path.exists(PDF_path):
        with open(PDF_path,'wb') as f:
            print('正在抓取:'+title)
            f.write(response.content)
            #time.sleep(1)
            f.close()
    else:
        print('已下載下傳: '+title)
if __name__=='__main__':
    url='https://openaccess.thecvf.com/ECCV2018'
    html=gethtml(url)
    getpdf(html)
           

4.爬取ICCV期刊代碼

ICCV是按照日期索引的,是以改變URL即可

爬蟲(13)-爬蟲爬取CVPR+ICCV+ECCV期刊論文自動下載下傳PDF儲存檔案中(科研黨福利)

ICCV中多了一個go back按鈕,是以将提取的URL索引從1開始,剔除go back連結。

爬蟲(13)-爬蟲爬取CVPR+ICCV+ECCV期刊論文自動下載下傳PDF儲存檔案中(科研黨福利)

下面是完整的代碼

import requests,re,os,json
from pyquery import PyQuery as pq
from lxml import etree 
import time
from selenium import webdriver

def gethtml(url):
    brower = webdriver.Firefox()
    brower.get(url)
    html = brower.page_source
    return html
def getpdf(html):
    html=etree.HTML(html)
    indexs=html.xpath('//dl/dd/a[1]/@href')
    base_url='https://openaccess.thecvf.com/'
    title=html.xpath('//dl/dt/a/text()')
    print(len(title))
    for i in range(0,len(title)):
        url=base_url+indexs[i+1]
        print(url)
        #print(title[i])
        writepdf(url,title[i])

def writepdf(url,title):
    response=requests.get(url)
    file_path='C:/Users/10043/Desktop/ICCV2018'
    PDF_path=file_path+os.path.sep+'{0}.{1}'.format(title.replace(':','').replace('?',''),'pdf')
    if not os.path.exists(PDF_path):
        with open(PDF_path,'wb') as f:
            print('正在抓取:'+title)
            f.write(response.content)
            #time.sleep(1)
            f.close()
    else:
        print('已下載下傳: '+title)
if __name__=='__main__':
    url='https://openaccess.thecvf.com/ICCV2019?day=2019-10-30'
    html=gethtml(url)
    getpdf(html)
           

5.爬取CVPR期刊代碼

CVPR和ICCV網頁分布相同,隻需要更改URL,可以把ICCV的代碼用在抓取CVPR上

https://openaccess.thecvf.com/ICCV2019?day=2019-10-30

改為:

https://openaccess.thecvf.com/CVPR2019?day=2019-06-18

其實隻需要将ICCV2019和day=2019-10-30改為CVPR對應的格式即可。

6.結果展示

其實在提取title時,可以添加字元串判斷語句,隻對自己感興趣的論文下載下傳,這樣就可以提取自己想要的檔案,例如圖像去噪,超分辨率,圖像分割等。

爬蟲(13)-爬蟲爬取CVPR+ICCV+ECCV期刊論文自動下載下傳PDF儲存檔案中(科研黨福利)
爬蟲(13)-爬蟲爬取CVPR+ICCV+ECCV期刊論文自動下載下傳PDF儲存檔案中(科研黨福利)

7.存儲PDF添加時間限制

import eventlet
def writepdf(url,title):
    eventlet.monkey_patch()
    #設定300秒,超過300跳出異常
    with eventlet.Timeout(300,False):
    	try:
    		response=requests.get(url)
    		file_path='C:/Users/10043/Desktop/XIE/ECCV2018'
    		PDF_path=file_path+os.path.sep+'{0}.{1}'.format(title.replace(':','').replace('?',''),'pdf')
    		if not os.path.exists(PDF_path):
        		with open(PDF_path,'wb') as f:
            		print('正在抓取:'+title)
            		f.write(response.content)
            		#time.sleep(1)
            		f.close()
    		else:
        		print('已下載下傳: '+title)
        except eventlet.timeout.Timeout as e:
        	print('逾時下載下傳: '+title)