Python selenium爬虫实战,文泉学堂电子书抓取实例

文泉学堂以清华大学出版社的特色内容为基础,聚合高等教育专业知识性内容,突出理工、计算机、经管等专业学科,引入知识图谱体系,将内容资源按知识点关联,为用户提供个性化的专业知识服务,包括知识内容的个性化搜索、订阅、推荐、阅读、学习,方便用户之间的交流和分享。

网址:

https://lib-nuanxin.wqxuetang.com/#/

pic_001.jpg

因新冠状病毒引发肺炎疫情影响,清华大学对外开放知识库,至开学前(2月16日)全国用户可免费免登陆进入“文泉学堂”网站,这是隶属于清华大学出版社的在线学习平台,高质量的教学内容资源可用于学生自主学习,教师也是通过该网站在线教学或进行辅助指导。


官网显示可免费阅读至2月29号,感谢!

pic_002.png

有不少2019年比较新的书籍,尤其适合计算机专业相关阅读!


请尊重版权!

代码仅供参考和学习!

切勿商用和广泛传播。-_- 利用python3自动下载温泉学堂的pdf书籍(仅供测试,请24小时内删除)


Python selenium 配置

第一步:安装  selenium

pip install selenium

第二步:Webdriver、geckodriver下载配置

Webdriver下载路径:

http://chromedriver.storage.googleapis.com/index.html

用于驱动打开Chrome;

geckodriver下载路径:

https://github.com/mozilla/geckodriver/releases

用于驱动打开Firefox;

下载后放在python.exe相同目录下:

pic_003.png

这里我用的谷歌浏览器!

pic_005.png

系统为win7 64位!

pic_004.png

百度云打包:

链接:

https://pan.baidu.com/s/1P3RlJkCRCCsVca3tzgQiig 

提取码: 

37bt


附完整源码:

#20200202
#文泉学堂电子书抓取 https://lib-nuanxin.wqxuetang.com/search?kw=Python
# -*- coding=utf-8 -*-

import requests,time,os
from fake_useragent import UserAgent
from selenium import webdriver
from lxml import etree

#下载图片
def bctp(img_url, img_name,pdfurl,path):
    ua = UserAgent()
    headers={
        'User-Agent': ua.random,
        'Referer': pdfurl
    }
    print("开始下载图片!")
    try:
        r = requests.get(img_url, timeout=5, headers=headers)
        with open(f'{path}{img_name}', 'wb') as f:
            f.write(r.content)
            print(f'下载{img_name}图片成功!')
            time.sleep(1)
    except Exception as e:
        if "port=443): Read timed out" in str(e):
            time.sleep(2)

#下载电子书图片
def xztp(imgreq,i,pdfurl,path):
    img = imgreq.xpath(f'//div[@index="{i}"]/img[@class="page-img"]/@src')[0]
    if 'http' not in img:
        img_url = f'https://lib-nuanxin.wqxuetang.com{img}'
    else:
        img_url = img
    print(img_url)
    img_name = f'{i}.jpg'
    bctp(img_url, img_name, pdfurl, path)

#下载电子书单页
def xz(browser,pdfurl,i,path):
    browser.get(f'{pdfurl},{i}')
    time.sleep(8)
    imghtml = browser.page_source
    imgreq = etree.HTML(imghtml)
    pagenum = imgreq.xpath('//div[@class="fl page-head-page"]/div[@class="page-head-tol"]/text()')[0]
    page = pagenum.split('/')[0]
    if str(i) in page:
        xztp(imgreq, i, pdfurl, path)
    else:
        time.sleep(2)
        browser.get(f'{pdfurl},{i}')
        time.sleep(8)
        imghtml = browser.page_source
        imgreq = etree.HTML(imghtml)
        pagenum = imgreq.xpath('//div[@class="fl page-head-page"]/div[@class="page-head-tol"]/text()')[0]
        page = pagenum.split('/')[0]
        if str(i) in page:
            xztp(imgreq, i, pdfurl, path)
        else:
            time.sleep(2)
            browser.get(f'{pdfurl},{i}')
            time.sleep(8)
            imghtml = browser.page_source
            imgreq = etree.HTML(imghtml)
            xztp(imgreq, i, pdfurl, path)



#下载电子书
def get_pagenum(browser,pdfurl,pdftitle):
    path = f'{pdftitle}/'
    os.makedirs(path, exist_ok=True)  # 创建目录
    browser.get(pdfurl)
    time.sleep(2)

    # 滚动页面
    js = "var q=document.documentElement.scrollTop=1000"
    browser.execute_script(js)
    time.sleep(5)

    pdfhtml = browser.page_source
    print(pdfhtml)
    pdfreq = etree.HTML(pdfhtml)
    pagenum = pdfreq.xpath('//div[@class="fl page-head-page"]/div[@class="page-head-tol"]/text()')[0]
    pagenum = pagenum.split('/')[1]
    pagenum = pagenum.replace(' ', '')
    pagenum = int(pagenum)
    print(pagenum)

    for i in range(1, pagenum + 1):
        print(i)
        xz(browser,pdfurl,i,path)
        time.sleep(1)

#获取电子书目录
def getpdf(browser,url):
    browser.get(url)

    # 将滚动条移动到页面的底部
    js = "var q=document.documentElement.scrollTop=100000"
    browser.execute_script(js)
    time.sleep(5)

    #获取当前网页源码
    html=browser.page_source

    #解析网页
    req=etree.HTML(html)
    h3s=req.xpath('//div[@class="in-r"]/h3/@title')
    imgs=req.xpath('//div[@class="item-cover fl"]/img/@src')
    for h3,img in zip(h3s,imgs):
        pdftitle=h3
        id=img.split('/')[-2]
        pdfurl=f'https://lib-nuanxin.wqxuetang.com/read/pdf/{id}'
        print(pdftitle,pdfurl)
        get_pagenum(browser, pdfurl, pdftitle)

#列表抓取
def main1():
    browser = webdriver.Chrome()
    url="https://lib-nuanxin.wqxuetang.com/search?kw=python%20gui"
    getpdf(browser, url)

#单本书抓取
def main2():
    browser = webdriver.Chrome()
    pdftitle="零基础入门学习Python(第2版)-微课视频版"
    pdfurl = "https://lib-nuanxin.wqxuetang.com/read/pdf/3207820"
    get_pagenum(browser, pdfurl, pdftitle)

#单页抓取
def main3(i):
    browser = webdriver.Chrome()
    pdfurl=""
    path=""
    xz(browser, pdfurl, i, path)

if __name__=='__main__':
    main2()


抓取效果:

bug:

1.可能存在小图抓取情况!

2.爬取速度过慢!!!

以上仅供参考和学习!


另附大佬的分享,不妨使用一下!

https://github.com/kajweb/wqxuetang_downloader

pic_008.png

喜欢的书籍,还是推荐购买,支持正版!