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网址如下: