文章目錄
-
- 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中。
在得到每個期刊每年的路徑接口後,我們就可以得到該網址的URL,下面我們将示範對三個期刊的爬取。
2.分析ECCV期刊頁面
ECCV中羅列出2020年和2018年份論文接口,我們選擇一個檢視頁面。
網站的的URL為:https://openaccess.thecvf.com/ECCV2018
是以當需要爬取2020年份的論文隻需要把位址改從:
https://openaccess.thecvf.com/ECCV2018
改為:
https://openaccess.thecvf.com/ECCV2020
點選網頁上PDF按鈕,浏覽器自動下載下傳對應的論文,我們的目的是自動下載下傳論文,是以隻需要提取出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即可
ICCV中多了一個go back按鈕,是以将提取的URL索引從1開始,剔除go back連結。
下面是完整的代碼
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時,可以添加字元串判斷語句,隻對自己感興趣的論文下載下傳,這樣就可以提取自己想要的檔案,例如圖像去噪,超分辨率,圖像分割等。
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)