如何批量下载网站中的超链接(一次性下载网页中所有可能的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

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值