title: 国外最新高清pdf寻找以及实现迅雷自动下载【Python】
date: 2016-10-11 20:59:28
tags:
国外最新高清pdf寻找以及实现迅雷自动下载#
1、今天意外发现国外某站,提供非常近期,甚至国内亚马逊还没上市的最新高清pdf,所以测试爬虫,看是否能自动下载。
2、
《OReilly.Introduction.to.Machine.Learning.with.Python.A.Guide.for.Data.Scientists.1449369413》
一开始人工下载成功, 国内要月底才上线呢。
3、 随后测试程序是否可自动下载,第二本书的下载遇到了问题:总提示服务器维护,但更换了ip也这样的结果,后发现是对应网盘异常了。
4、代码:
# -*- coding: utf-8 -*-
# python 3.5.2
# 测试系统,Win10,Firefox V46
# Author:Van
# 实现自动下载高清最新pdf的实现
# V1.0 当前只针对效果还可以的国外zippyshare网盘
# 其他的网盘还没添加进判断语句,先共享如何迅雷下载等
# 如果您有经验优化,改进此脚本,请不吝指教
# QQ群: 206241755
# 简介:因下载最新高清pdf,正好发现www.foxebook.net提供
# 但是很多的广告,特烦人,所以尝试脚本,最后因下载需求,
# 加载了迅雷,这功能的实现小牛,不过也是网络别人共享的。。
from selenium import webdriver
import requests
from lxml import etree
import re
import os
from win32com.client import Dispatch
#test name of book : SciPy and NumPy
# book_name = input('Please input the book name in English:\n')
book_name = 'Introduction to Machine Learning with Python'
print ('begin to search book(s)...')
print ('---------------------------------')
# search link is :http://www.foxebook.nethttp://www.foxebook.net/search/SciPy%20and%20NumPySciPy%20and%20NumPy
PostUrl = "http://www.foxebook.net/search/" + book_name
# print(PostUrl)
# get the content of html
html = requests.get(PostUrl).content
# use etree selector
selector = etree.HTML(html)
# /html/body/div/div/main/div[2]/div[2]/h3/a
# /html/body/div/div/main/div[3]/div[2]/h3/a
# above is two books' xpath, so the right xpath for all book is :
# /html/body/div/div/main//div[2]/h3/a
# it can be confirmed by 'xpath checker'
total_books = selector.xpath("/html/body/div/div/main//div[2]/h3/a/text()")
# print('total books from searching are:', total_books)
num1 = 0
link_address = []
real_address = []
def find_link():
global num1
# find the right book, put all links in a list of : link_address
for i in total_books:
num1 += 1
if re.search(book_name,i):
print('Congrdulations, we find the book(s):\n')
print ('**********************************')
print(i)
print ('**********************************\n')
href = 'http://www.foxebook.net' + selector.xpath('//*[@id="content"]/div/main/div[%d]/div[2]/h3/a/@href'%num1)[0]
# print('the book link is :', href)
# print('will downloading...')
html_new = requests.get(href).content
selector_new = etree.HTML(html_new)
link_new = selector_new.xpath('//*[@id="download"]/div[2]/table/tbody/tr[1]/td[2]/a/@href')[0]
# split the next link
link_new = 'http:'+link_new.split(':')[-1]
link_address.append(link_new)
print('download link is :', link_address)
print('\n\n')
def real_book_link():
# print('link_address is :', link_address)
# dynamic on zippyshare
for j in link_address:
# 用浏览器实现访问
driver = webdriver.Firefox()
driver.maximize_window()
driver.get(j)
try:
# find the download button
title_list = driver.find_element_by_xpath('//*[@id="dlbutton"]')
film_link = title_list.get_attribute('href')
real_address.append(film_link)
except:
print('can not download the book')
print('real_book_link:', real_address)
return real_address
def addTasktoXunlei(down_url,course_infos):
flag = False
o = Dispatch("ThunderAgent.Agent.1")
if down_url:
course_path = os.getcwd()
try:
#AddTask("下载地址", "另存文件名", "保存目录","任务注释","引用地址","开始模式", "只从原始地址下载","从原始地址下载线程数")
o.AddTask(down_url, '', course_path, "", "", -1, 0, 5)
o.CommitTasks()
flag = True
except Exception:
print(Exception.message)
print(" AddTask is fail!")
return flag
if __name__ == '__main__':
find_link()
real_link = real_book_link()
for i in real_link:
addTasktoXunlei(i, course_infos=None)
5、第二天分析:
更换下载的书名为:《Introduction to Machine Learning with Python》
得到了2个有效的书籍目录,对比昨天的书籍名,发现提供的下载源是不同的国外网盘,而昨天的那个到今天一直打不开,而这本书的网址很快就打开了,网盘名字为: zippyshare.com
然后研究了下,此foxebook.net站点提供的一些网盘下载使用了多家国外网盘,并且各家的广告显示不尽相同,可靠性更是差别较大。
另外,发现,就SciPy and NumPy一书来说,他最后得到的地址有2个http,这应该是广告模式,而后者的http的内容是我们真实需要的,所以通过冒号:来切分a.split(':')[-1]。
In [10]: a = 'http://sh.st/st/7a45e8ed9f73a6a10e9a22b2d8783c44/http://www65.zippyshare.com/v/oFSWQWDk/file.html'
In [11]: a
Out[11]: 'http://sh.st/st/7a45e8ed9f73a6a10e9a22b2d8783c44/http://www65.zippyshare.com/v/oFSWQWDk/file.html'
In [12]: a.split(':')[-1]
Out[12]: '//www65.zippyshare.com/v/oFSWQWDk/file.html'
6、忘记说明下昨天的代码为何要用re.match (或者re.research), 这是因为网站的关键词搜索引擎所使用的算法,我们是不知道的,但从搜索结果看,某关键词下,可能有不同的书籍,而我们是需要精确搜索,下图中实际出现了16本书,但针对SciPy and NumPy,我们要找的是第三个图对应的。因此,我们可以把显示的书名做一个match对照的循环,来实现精确匹配。而另外一方面,网站提供的书名还可能多了冒号,后面附加书名,这样的也符合我们的要求。后来发现用关键词 if xxx in yyy的方式更简便。
7、昨天的代码一开始没有考虑到国外网盘下载异常失败的问题,并且有的搜索结果可能有多个网盘地址,而我只取了默认的第一个,考虑到下载的失败可能性,最好把所有下载地址都获取。所以代码需要修改。
由于:SciPy and NumPy 对应的网盘当机,选用:《Introduction to Machine Learning with Python》为例
经过对照,在最后的下载界面,是动态的,因为调用selenium+Firefox组合。最后终于得到了完整pdf队中的链接,但速度明显比较慢了,在本例中,是rar后缀的压缩包格式,里面含有pdf。
download link is : ['http://www78.zippyshare.com/v/hBU7JYZp/file.html', 'http://www65.zippyshare.com/v/oFSWQWDk/file.html']
content:
book link: http://www78.zippyshare.com/d/hBU7JYZp/2248094/OReilly.Introduction.to.Machine.Learning.with.Python.A.Guide.for.Data.Scientists.1449369413.rar
content:
book link: http://www65.zippyshare.com/d/oFSWQWDk/1124867/OReilly.Introduction.to.Machine.Learning.with.Python.1449369413_Early.Release.rar
Process finished with exit code 0
8、接下来的一个问题,怎么让程序自动下载这2个链接?群里有人推荐了一些别的软件,但是我想来想去因为以后总要面对下载速度的问题,还是选定了迅雷破解版吧,除非将来有其他更好的方案,好在有人共享了一个方案,还特别简单,不过据说只能支持http格式,BT格式的以后再想办法。
9:补充说明,在正文代码的第2个下载地址,是有问题的,差别在于地址点击后,前者可在浏览器或者迅雷直接下载,而后者浏览器没反映,迅雷里下载的是一个html。尽管2个链接的提取方法完全一样,但一个好使,一个异常,由于是同一本书的前后2个小版本,我也不管他了,但为了验证迅雷是否能同时下载5个(代码里设定同时下载的最大值,也是一般默认值) 我用额外的测试脚本加载了一个新的链接,是证明可同时下载的,如图:
9、参考:
10、github对应仓库: