您的位置:首页 > 其它

斯巴鲁汽车 技术文档下载方法

2016-01-25 17:16 211 查看
昨天深夜,突然朋友找我帮忙,下载斯巴鲁的技术文档。原本以为是因为某些原因他访问不到国外的网站,结果却让我惊呆了!妈蛋,这pdf有1000多个啊···

朋友在国外的论坛上找到有人可以下载,而且已经贴上了源码,只是他不懂。

论坛地址为:http://www.subaruoutback.org/forums/138-gen-5-2015-present/280682-2016-owner-s-service-manuals-posted.html

这是文档下载的网站:http://techinfo.subaru.com/index.html

其中账号是要钱买的,好新颖的设定:

72 Hours (3 days) @ $34.95

30 Days @ $299.95

365 Days (1 year) @ $2499.95

另:他们规定,账号下载pdf,不得超过每小时50个文件···坑爹啊···

我借用他们的代码(二楼的代码,用python写的那个;十五楼的时间机制,用来防止超过1小时50次的限制),结合现在的情况改动了部分。

现在分享给各位需要的人。

我的python环境是Python 2.7.10的。使用3.4版本的需要改部分代码,修改的只是包名和部分包名下面的方法名,都是简单的操作。

下面上代码~

# Pip install required packages and import them
import lxml.html, urllib2, urlparse, os, requests, natsort, time
from PyPDF2 import PdfFileMerger, PdfFileReader

# File Downloader
def download_file(url, url_splitter='/'):
local_filename = url.split(url_splitter)[-1]
# 这里是cookie的模拟方法,需要模拟登录
headers = {
"Host": "techinfo.subaru.com",
"User-Agent": "lol",
"Cookie": "JSESSIONID=F3CB4654BFC47A6A8E9A1859F0445123"
}
r = requests.get(url, stream=True, headers=headers)
with open(local_filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
f.flush()
return local_filename

# Grab all the PDFs
def grab_files(base_url):
res = urllib2.urlopen(base_url)
tree = lxml.html.fromstring(res.read())
ns = {'re': 'http://exslt.org/regular-expressions'}
for node in tree.xpath('//a[re:test(@href, "\.pdf$", "i")]', namespaces=ns):
pdflink = urlparse.urljoin(base_url, node.attrib['href'])
print pdflink
filename = download_file(pdflink)
print("Downloading " + filename + " complete\n")
print("sleep 72")
time.sleep(72)
return(0)

# Merge the PDFs
def merge_pdfs(merged_filename,files_dir=os.getcwd()):
pdf_files = natsort.natsorted([f for f in os.listdir(files_dir) if f.endswith("pdf")])
merger = PdfFileMerger()
for filename in pdf_files:
print("Merging " + filename)
merger.append(PdfFileReader(os.path.join(files_dir, filename), "rb"))
merger.write(os.path.join(files_dir, merged_filename))
print("Merge Completed - " + merged_filename)
return(merged_filename)

#这里是下载pdf的网页列表
grab_files('http://techinfo.subaru.com/search/listResults.html?searchLit=Search&litNum=G2520BE')
merge_pdfs('2016_Outback_Legacy_Manual.pdf')


解析一下:

1. 第12行的cookie,需要借用浏览器,然后找到cookie来做。简单的就是用chrome浏览器。如下图:



2. 第48行,其中的连接地址就是你需要下载的pdf文档的地址。斯巴鲁的pdf下载好像是在搜索页面中才能出现的。略奇葩啊···

3. 第49行,是合并pdf的代码,毕竟1000+个文档,分开放着够乱啊···(当然也可以选择不合并)

好啦,至此就可以运行代码跑跑跑啦~

如果使用python 3.4,代码修改的时候,请注意:

1. 引用urllib2应该是需要改为引用urllib,官网可以查到urblib2被改为了urllib3,但是在实际使用的时候,我记得后面有个方法又需要把他改为urllib;

2. lxml在引用的时候可能会出现比较大的问题,可以直接下载已经编译好的包。http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml

有问题欢迎留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: