python抓取论文_使用python爬取NDSS官网的论文

1.问题背景

为了下载NDSS2019年的论文集,页面中有给出所有论文的链接,通过正则匹配来获取论文下载链接和论文名。

通过开发者模式,我们可以找到下载论文的页面(https://www.ndss-symposium.org/ndss-program/ndss-symposium-2019-program/)的html代码,然后分析我们需要的信息在html中有什么相似性,怎么样制定匹配规则。

1592476-20191025152730354-1713954455.png

我之前的想法是找到链接在对应html中的位置,然后下载所有html中对应位置的内容就好了,但是...这个页面也太复杂了,正则化匹配会来得更简单。

2.解决方案

import os

import re

import urllib

import requests

def get_context(url):

web_context=requests.get(url)returnweb_context.text

url= 'https://www.ndss-symposium.org/ndss-program/ndss-symposium-2019-program/'web_context=get_context(url)name_list=re.findall(r"(?<=/\">).+(?=)",web_context) #论文名,用来保存

link_list=re.findall(r"(?<=href=\").+(?=\">Paper)",web_context) #链接地址,用来下载

print(str(link_list))

print(str(name_list))

local_dir='D:\\nudt\\NDSS2019\\'

ifnot os.path.exists(local_dir):

os.makedirs(local_dir)cnt=0

while cnt

file_name= name_list[cnt+1] #这里加1是因为提取出来的name_list多了一个与论文名无关的name,加1才能使名字和论文链接对应起来。

download_url=link_list[cnt]

print(download_url)

#将标点符号和空格替换为'_',防止由于如:字符等不能保存文件file_name= re.sub('[:\?/]+',"_",file_name).replace(' ','_')

print(file_name)

file_path= local_dir + file_name + '.pdf'print(file_path)

print(download_url)

#download

print('['+str(cnt)+'/'+str(len(link_list))+'] Downloading' +file_path)try:

# urllib.urlretrieve(download_url, file_path)

r= requests.get(download_url)

with open(file_path,'wb+') asf:

f.write(r.content)

except Exception:

print('download Fail:'+file_path)

cnt+= 1print('Finished')

主要有以下几点需要解释一下:

1)我通过urllib.urlretrive()函数下载会失败,所以直接通过文件操作来保存了。

2)而且我这里爬取出来的结果,大家可以发现name_list的第一个值不是论文名,也就是name_list的第二个值才对应link_list的第一个值,所以在保存的时候要进行+1处理,这个大家可以根据自己爬取结果,各取所需啦。只要能对应上就好!

1592476-20191025162628048-818420779.png

3)但是我不知道是自己下载网速的问题还是啥,会出现下载着就中断的问题(不是直接停止运行,而是下载一篇论文的时候下很久都没有下完),这个时候修改cnt=你现在下到了哪一篇论文,就可以接着下载了,不需要重新又开始从头下。这种情况大概在我爬取89篇文章中出现了三次,所以我还是能接受这个实际效果。

Finally,贴上折腾好久终于有了的运行结果:(开心!)

1592476-20191025162106767-1568925071.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值