国外最新高清pdf寻找以及实现迅雷自动下载【Python】


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、参考:

http://neue.v2ex.com/t/275703

10、github对应仓库:

https://github.com/vansnowpea/download-pdf-with-Xunlei

推荐阅读更多精彩内容