如何批量下载网站中的超链接(一次性下载网页中所有可能的PDF文件)

如何批量下载网站中的超链接(一次性下载网页中所有可能的PDF文件)

WebDownloader

闲来无事写的一个网页资源下载器,有时候一个网页中,含有很多超链接,其中有很多资源,比如:

视频/音频图片PDF文件表格其他超链接

那么怎么批量获取呢?如果需要编写一个高扩展、分布式的抓取框架,应该包含哪些架构呢,这个之后再慢慢完善吧。

首先,使用python中的requests库写一个简单的PDF获取器,下面是几个核心模块。

超链接获取

这部分就是常规的爬虫与正则内容,主要分为两个步骤:

抓取网页中所有的 href 元素,并提取其超链接下载相关网页中的PDF到本地中(以下代码暂时只下载后缀直接为.pdf的网址,其他类型的网址下面有讨论,待完善)

import re

from pprint import pprint

import requests

from bs4 import BeautifulSoup

def get_html(url):

try:

html = requests.get(url).text

except Exception as e:

print('web requests url error: {}\nlink: {}'.format(e, url))

return html

class WebDownloader(object):

def __init__(self, base_url):

self.url = base_url

self.links = set()

def parse_html(self, verbose=False):

html = get_html(self.url)

soup = BeautifulSoup(html, parser='lxml')

for link in soup.findAll('a'):

if link.has_attr('href'):

href = str(link.get('href'))

if href.startswith('http'):

self.links.add(href)

if verbose:

print(link.get('href'))

def download(self):

for link in self.links:

link = str(link)

if link.endswith('.pdf'): # handle direct pdf url link

file_name = link.split('/')[-1]

try:

r = requests.get(link)

# with open(os.path.join(path, file_name), 'wb+') as f:

with open(file_name, 'wb+') as f:

f.write(r.content)

except Exception as e:

print('Downloading error:{}\nlink:{}'.format(e, link))

url = 'https://cs231n.github.io/neural-networks-1/'

wd = WebDownloader(url)

wd.parse_html()

pprint(wd.links)

wd.download()

超链接类型

其实很多网址可能包含pdf文件,其中有很多情况,本文暂涵盖了小部分,之后再继续完善。

网址后缀为 .pdf

如 http://arxiv.org/pdf/1310.4546.pdf,这种网址可直接抓取并写入本地文件。

网址为预印本平台 arxiv.org

如 https://arxiv.org/abs/1502.01852,这种网址不是直接的pdf文件下载链接,将字符串中的*abs*替换成*.pdf*即可,如下

url = 'https://arxiv.org/abs/1502.01852'

print('before: {}'.format(url))

url = url.replace('abs','pdf')

print('after: {}'.format(url))

网址为康奈尔大学预印本平台 cornell.edu

如 http://arxiv-web3.library.cornell.edu/abs/1502.01852, 这是康奈尔大学预印本平台,但实际上网站会重定向到预印本平台arxiv.org https://arxiv.org/abs/1502.01852,所以有两种方法:(1)提取原网址中的编号*1502.01852*(2)将网址中的*abs*替换成pdf(同上)。

url = 'http://arxiv-web3.library.cornell.edu/abs/1502.01852'

print('before: {}'.format(url))

url = 'https://arxiv.org/pdf/' + url.split('/')[-1]

print('after method 1: {}'.format(url))

url = url.replace('abs','pdf')

print('after method 2: {}'.format(url))

网址为 sciencedirect 上的论文(非直接链接)

如 http://www.sciencedirect.com/science/article/pii/S0959438814000130,爬取方法待解决,之后再补充。

GitHub链接

等我把代码完善好再发布具体的链接 =。=,个人的GitHub网址如下:

https://github.com/LemuriaChen

相关创作

什么是网球? 怎么玩? 规则是什么?
365资讯下载安装

什么是网球? 怎么玩? 规则是什么?

07-15 👁 2044
苹果iPhone 7 Plus 充电很慢‘限制充电
365bet官网ribo88

苹果iPhone 7 Plus 充电很慢‘限制充电

07-13 👁 1552
跳帧是什么意思 电脑跳帧的解决方法
365bet官网ribo88

跳帧是什么意思 电脑跳帧的解决方法

07-05 👁 6588