精华内容
下载资源
问答
  • python爬取pdf是空文件

    2021-05-25 10:45:09
    网页需要注册,我已经注册了,登录信息也带到参数... down_load_pdf(pdf_url, pdf_name, headers_pdf) else: print("pdf的url获取失败: " + pdf_url) time.sleep(3) if __name__ == "__main__": main()
  • 主要为大家详细介绍了python爬取网页转换为PDF文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了python爬取网页内容转换为PDF文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 利用Python爬取网页中的图片内容,并将其转换为pdf格式的文件。
  • python爬爬取取淘淘宝宝商商品品详详情情页页数数据据 这篇文章主要为大家详细介绍了python爬取淘宝商品详情页数据的相关资料具有一定的参考价值感兴 的小 伙伴们可以参考一下 在讲爬取淘宝详情页数据之前先来介绍一...
  • 本文是在学习了beautifulsoup之后,制作的一个爬取读者杂志并使用reportlab制作成pdfpython小工具,咱也文艺一下:),分享给大家,有需要的小伙伴参考下吧。
  • Python爬取百度文库付费文档(PDF

    万次阅读 多人点赞 2019-12-05 15:03:59
    Python爬取百度文库付费文档(PDF)@TOC PS:本文为本人学习python的一个小分享,仅供学习和参考使用,不可做商业利益的盗取! 工具准备 Python3.x; Python库:selenium、requests; 爬取页面及爬取分析 ...

    Python爬取百度文库付费文档(PDF)@TOC
    PS:本文为本人学习python的一个小分享,仅供学习和参考使用,不可做商业利益的盗取!

    工具准备

    Python3.x;
    Python库:selenium、requests;

    爬取页面及爬取分析

    https://wenku.baidu.com/view/9a5a21cf964bcf84b9d57bea?pn=50
    打开网址,鼠标置于第一页上,右键打开元素,可以看到图片来自于一个链接。
    鼠标置于第一页上,右键打开元素,可以看到图片来自于一个链接 我们打开这个链接。
    在这里插入图片描述可以很清楚的看到,这是一个图片的下载链接。所以我们需要爬取这个文档,有一个很清晰的思路就是把每一页的图片链接截取下来,然后再通过requests打开该链接来保存图片,最后将所有图片合成PDF即可。

    功能模块代码的实现

    实现图片链接的获取

    首先,先介绍下selenium库,Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。所以,你在人工操作浏览器时可以看到的东西,在selenium也可以看到。这里,我们就使用selenium来获取这个页面的源代码。

    from selenium import webdriver
    driver = webdriver.Firefox() #selenium支持火狐、谷歌等浏览器
    driver.get('https://wenku.baidu.com/view/9a5a21cf964bcf84b9d57bea?pn=50')
    print(driver.page_source)
    

    我们先打印下源码看看。由于源码太长,我只贴出跟我们需要爬取内容相关的部分。

    <div class="bd" id="pageNo-1" data-page-no="1" data-mate-width="892.83" data-mate-height="1263" style="height:1011.4411478109px;" data-scale="0.70691211401425" data-render="1"><div class="reader-parent-a929d320eefdc8d376ee3224 reader-parent " style="position:relative;top:0;left:0;-moz-transform:scale(0.99);-moz-transform-origin:left top;"><div class="reader-wrapa929d320eefdc8d376ee3224" style="position:absolute;top:0;left:0;width:100%;height:100%;"><div class="reader-main-a929d320eefdc8d376ee3224" style="position:relative;top:0;left:0;width:100%;height:100%;"><div class="reader-pic-layer" style="z-index:1"><div class="ie-fix"><div class="reader-pic-item" style="background-image: url(https://wkbjcloudbos.bdimg.com/v1/docconvert4643//wk/caae51448eb3233830370d1963fa165e/0.png?responseCacheControl=max-age%3D3888000&amp;responseExpires=Sun%2C%2019%20Jan%202020%2014%3A13%3A06%20%2B0800&amp;authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2019-12-05T06%3A13%3A06Z%2F3600%2Fhost%2Fc895ec975bc2d19dc54d3f80ffe35c865e469fdabcd3501ae7ad5af14af5896a&amp;x-bce-range=0-84983&amp;token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU3NTUyOTk4NiwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDYWNoZUNvbnRyb2wiLCJyZXNwb25zZUV4cGlyZXMiLCJ4LWJjZS1yYW5nZSJdfQ%3D%3D.15JLNbl07gJ1bGi0wBW6Jqm%2BPpuUyz7gJlsdIgf%2FdLc%3D.1575529986);background-position:0px 0px;width:812px;height:1179px;z-index:1360;left:73.7565px;top:86.32625000000002px;opacity:1;-moz-transform: scale(1.0685,1.0685);position:absolute;overflow:hidden;"></div></div></div></div></div></div></div>
    
    

    我们可以看到,该图片元素ID为“pageNo-1”,图片链接在style="background-image:中。通常我们爬取源码都是利用BeautifulSoup库与lxml配合解析的。但这里利用这两个库解析都打印的源码存在丢失现象,可能的原因是该源码编码中存在gb2312编码。我也尝试了不同的解析库,都不行。于是,这里我们可以另辟蹊径,将所有的网页源码存于一个字符串中,然后对字符串进行一系列的处理,得到我们需要的url连接。

    mystring = driver.page_source; #将源码赋值给一个字符串
    page = 'pageNo-1'
    idx1 = mystring.find('<div class="bd" id="' + page) #找出<div class="bd" id="pageNo-1的索引
    mystring = mystring[idx1:] #通过索引先将索引前面的所有字符串删除
    idx1 = mystring.find("https") #我们可以发现URL的链接都是已https开头的
    idx2 = mystring.find(");background-position") #URL的结尾后面都跟着“);background-position“
    mystring = mystring[idx1:idx2] #然后再根据这两个索引,截取URL连接。这里需要注意的是python前后缩影截取为左闭右开的区间,及[idx1:idx2)
    pringt(mystring)#输出处理后的字符串检查
    

    打印结果为:https://wkbjcloudbos.bdimg.com/v1/docconvert4643//wk/caae51448eb3233830370d1963fa165e/0.png?responseCacheControl=max-age%3D3888000&responseExpires=Sun%2C%2019%20Jan%202020%2014%3A13%3A06%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2019-12-05T06%3A13%3A06Z%2F3600%2Fhost%2Fc895ec975bc2d19dc54d3f80ffe35c865e469fdabcd3501ae7ad5af14af5896a&x-bce-range=0-84983&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU3NTUyOTk4NiwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDYWNoZUNvbnRyb2wiLCJyZXNwb25zZUV4cGlyZXMiLCJ4LWJjZS1yYW5nZSJdfQ%3D%3D.15JLNbl07gJ1bGi0wBW6Jqm%2BPpuUyz7gJlsdIgf%2FdLc%3D.1575529986
    我们打开这个链接,发现无法打开。回到我们手动打开的页面,复制一下正确的网址与之进行对比。
    正确的URL:https://wkbjcloudbos.bdimg.com/v1/docconvert4643//wk/caae51448eb3233830370d1963fa165e/0.png?responseCacheControl=max-age%3D3888000&responseExpires=Sun%2C%2019%20Jan%202020%2011%3A27%3A12%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2019-12-05T03%3A27%3A12Z%2F3600%2Fhost%2Faf0214c3c956c28ad864419c09c58541d9f6d00fd7a73c92624fc7aa69b484ed&x-bce-range=123043-197963&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU3NTUyMDAzMiwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDYWNoZUNvbnRyb2wiLCJyZXNwb25zZUV4cGlyZXMiLCJ4LWJjZS1yYW5nZSJdfQ%3D%3D.uGj%2F8Z9kAT4ldgOX62nSX2By9c7pOhNhA1g90oRH%2Bxg%3D.1575520032
    这里请忽略链接的不同,该图片链接本身就是动态链接,每次链接都不同,我们只需要关注格式。对比发现,我们打印的URL中多出了几个“amp;”
    https://wkbjcloudbos.bdimg.com/v1/docconvert4643//wk/caae51448eb3233830370d1963fa165e/0.png?responseCacheControl=max-age%3D3888000&amp;responseExpires=Sun%2C%2019%20Jan%202020%2014%3A13%3A06%20%2B0800&==amp;==authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2019-12-05T06%3A13%3A06Z%2F3600%2Fhost%2Fc895ec975bc2d19dc54d3f80ffe35c865e469fdabcd3501ae7ad5af14af5896a&amp;x-bce-range=0-84983&amp;token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU3NTUyOTk4NiwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDYWNoZUNvbnRyb2wiLCJyZXNwb25zZUV4cGlyZXMiLCJ4LWJjZS1yYW5nZSJdfQ%3D%3D.15JLNbl07gJ1bGi0wBW6Jqm%2BPpuUyz7gJlsdIgf%2FdLc%3D.1575529986
    我们把“amp;”删除了试试。mystring = mystring.replace('amp;', '')
    再次打印后打开链接就可以发现,可以正常下载了。到此,图片链接获取功能实现。

    实现图片的下载

    图片的下载我们可以使用requests.content来实现。

    r = requests.get(mystring)
    with open(page + '.png', 'wb') as png:
    	png.write(r.content)
    png.close()
    

    运行后就可以看到一个pageNo-1.png图片的生成。打开看看,果然就是我们刚刚看到的第一页。

    实现浏览器下滑及按钮的点击

    上面两个模块只是实现的第一页的图片的下载。百度文库中,第三页都免会有一个打开更多页的按钮,我们需要点击该按钮才可以获得更多的页面。我们先通过浏览器获得该按钮元素的ID或者class name。

    <div id="html-reader-go-more" class="banner-wrap more-btn-banner" style="height: auto;">
    <div class="banner-core-wrap super-vip"><div class="doc-banner-text">下载文档到电脑,使用更方便</div>    <div class="doc-banner-value"><div><span class="icon-ticket"></span>5下载券</div><div class="doc-banner-ticket-rights">(您持有<span>0</span>下载券,积分不足无法兑换)</div></div><div class="doc-banner-btns super-vip">                <div class="btn-pay-vip"><i></i>VIP免费下载</div></div><div class="doc-banner-tip super-vip"><div class="doc-banner-rights-wrap"><span class="icon-triangle" style="left: 221.5px;"></span><div class="download-pro-doc"><i></i>享VIP专享文档下载特权</div><div class="download-share-doc"><i></i>赠共享文档下载特权</div><div class="yuedu-vip"><i></i>赠百度阅读VIP精品版</div></div></div></div>
    <div class="continue-to-read">
    <div class="banner-more-btn">
    <span class="moreBtn goBtn">
    <span>还剩63页未读,</span>
    <span class="fc2e">继续阅读</span>
    </span>
    <p class="down-arrow goBtn"></p>
    </div>
    <div class="hengxian"></div>
    </div>
    <div class="wubai-wrap">
    <div class="wubai-title">
    <span class="wubai-icon"></span>
    

    很直观的就可以看到,该按钮class=“down-arrow goBtn”。通过xpath来定位该按钮,再进行click的动作即可实现点击按钮。

    button = driver.find_element_by_xpath("//p[@class='down-arrow goBtn']")
    button.click()
    time.sleep(2) #请在头文件加入 import time,单位秒
    

    这里我引入了time库的sleep函数,是考虑到网速问题,让浏览器缓冲一下。
    按钮的点击实现了。我们还会发现一个问题,那就是有时候后面几页的图片无法加载,这里我的处理方式是,没爬取一个页面就讲滑条滑动到该页,同时缓冲2S保证图片的加载成功。很可惜selenium没有关于浏览器滑条的操作,这里需要配合JS进行滑条的操作。

    target = driver.find_element_by_id(page)#page={pageNo-1,pageNo-2,....}是图片的ID,上文有提到
    driver.execute_script("arguments[0].scrollIntoView();", target)#上一句是找到该元素,这一句是运用JS滑动滑条到该元素
    time.sleep(2)
    

    代码的集合

    上面那个章节将我们需要的功能都实现了(其实还有一个功能模块我没有弄,那就是图片合成PDF。但是我比较懒,而且现在WORD直接一键插入所有图片,然后输出成PDF比较方便,所以这里我就没弄,只是保存了所有的图片),最后我们只需要进行整合即可。
    此处该文档共有两个链接。
    1-50页链接为:https://wenku.baidu.com/view/9a5a21cf964bcf84b9d57bea?pn=50
    50-66页链接为:https://wenku.baidu.com/view/9a5a21cf964bcf84b9d57bea?pn=51
    所以爬取的时候记得更换链接。
    代码集合如下:

    from selenium import webdriver
    import time
    import requests
    
    driver = webdriver.Firefox()
    driver.get('https://wenku.baidu.com/view/9a5a21cf964bcf84b9d57bea?pn=50')
    for i in range(50):
        if i == 3:
            target = driver.find_element_by_id('html-reader-go-more')
            driver.execute_script("arguments[0].scrollIntoView();", target)
            button = driver.find_element_by_xpath("//p[@class='down-arrow goBtn']")
            button.click()
            time.sleep(2)
        page = 'pageNo-' + str(i+1)
        print(page)
        target = driver.find_element_by_id(page)
        driver.execute_script("arguments[0].scrollIntoView();", target)
        time.sleep(2)
        mystring = driver.page_source;
        idx1 = mystring.find('<div class="bd" id="' + page)
        print(idx1)
        mystring = mystring[idx1:]
        idx1 = mystring.find("https")
        print(idx1)
        idx2 = mystring.find(");background-position")
        print(idx2)
        mystring = mystring[idx1:idx2]
        mystring = mystring.replace('amp;', '')
        if mystring.startswith('http') :
            r = requests.get(mystring)
            with open(page + '.png', 'wb') as png:
                png.write(r.content)
            png.close()
        else:
            print(mystring)
    
    driver.get('https://wenku.baidu.com/view/9a5a21cf964bcf84b9d57bea?pn=51')
    for i in range(50,66):
        page = 'pageNo-' + str(i + 1)
        print(page)
        target = driver.find_element_by_id(page)
        driver.execute_script("arguments[0].scrollIntoView();", target)
        time.sleep(2)
        mystring = driver.page_source;
        idx1 = mystring.find('<div class="bd" id="' + page)
        print(idx1)
        mystring = mystring[idx1:]
        idx1 = mystring.find("https")
        print(idx1)
        idx2 = mystring.find(");background-position")
        print(idx2)
        mystring = mystring[idx1:idx2]
        mystring = mystring.replace('amp;', '')
        if mystring.startswith('http'):
            r = requests.get(mystring)
            with open(page + '.png', 'wb') as png:
                png.write(r.content)
            png.close()
        else:
            print(mystring)
    driver.quit()
    

    总结

    1.selenium确实好用,运用好了可以做很多事情;
    2.BeautifulSoup与lxml无法解析网页时,多换种思路,也可以实现功能;
    3.新学python,若有错误,请大神们轻喷,也请指正,谢谢;
    4.本文仅供学习python的selenium库的学习参考,切勿用于商业利益,我们要尊重别人的知识产权。

    展开全文
  • Python爬取网页转为PDF

    2018-05-31 09:55:45
    爬虫的起因官方文档或... 全篇的实现思路分析网页学会使用BeautifulSoup库爬取并导出参考资料: * 把廖雪峰的教程转换为PDF电子书 * Requests文档 * Beautiful Soup文档配置在Ubuntu下使用Pycharm运行成功 ...

    爬虫的起因

    官方文档或手册虽然可以查阅,但是如果变成纸质版的岂不是更容易翻阅与记忆。如果简单的复制粘贴,不知道何时能够完成。于是便开始想着将Android的官方手册爬下来。 

    全篇的实现思路

    1. 分析网页
    2. 学会使用BeautifulSoup库
    3. 爬取并导出

    参考资料: 
    把廖雪峰的教程转换为PDF电子书 
    Requests文档 
    Beautiful Soup文档

    配置

    在Ubuntu下使用Pycharm运行成功 
    转PDF需要下载wkhtmltopdf

    具体过程

    网页分析

    这样一个网页https://developer.android.com/training/basics/supporting-devices/screens.html,要做的是获取该网页的正文和标题,以及左边导航条的所有网址 
    如下所示: 
    0423
    接下来的工作就是找到这些标签喽…

    关于Requests的使用

    详细参考文档,这里只是简单的使用Requests获取html以及使用代理翻墙(网站无法直接访问,需要VPN)

    proxies={
            "http":"http://vpn的IP:port",
            "https":"https://vpn的IP:port",
        }
    
    response=requests.get(url,proxies=proxies)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Beautiful Soup的使用

    参考资料里面有Beautiful Soup文档,将其看完后,可以知道就讲了两件事:一个是查找标签,一个是修改标签。 
    本文需要做的是: 
    1. 获取标题和所有的网址,涉及到的是查找标签

    #对标签进行判断,一个标签含有href而不含有description,则返回true
    #而我希望获取的是含有href属性而不含有description属性的<a>标签,(且只有a标签含有href)
    def has_href_but_no_des(tag):
        return tag.has_attr('href') and not tag.has_attr('description')
    
    #网页分析,获取网址和标题
    def parse_url_to_html(url):
    
        response=requests.get(url,proxies=proxies)
        soup=BeautifulSoup(response.content,"html.parser")
        s=[]#获取所有的网址
        title=[]#获取对应的标题
        tag=soup.find(id="nav")#获取第一个id为"nav"的标签,这个里面包含了网址和标题
        for i in tag.find_all(has_href_but_no_des):
            s.append(i['href'])
            title.append(i.text)
    
        #获取的只是标签集,需要加html前缀
        htmls = "<html><head><meta charset='UTF-8'></head><body>"
        with open("android_training_3.html",'a') as f:
            f.write(htmls)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    1. 对上面获取的网址分析,获取正文,并将图片取出存于本地;涉及到的是查找标签和修改属性
    #网页操作,获取正文及图片
    def get_htmls(urls,title):
    
        for i in range(len(urls)):
            response=requests.get(urls[i],proxies=proxies)
            soup=BeautifulSoup(response.content,"html.parser")
            htmls="<div><h1>"+str(i)+"."+title[i]+"</h1></div>"
            tag=soup.find(class_='jd-descr')
            #为image添加相对路径,并下载图片
            for img in tag.find_all('img'):
                im = requests.get(img['src'], proxies=proxies)
                filename = os.path.split(img['src'])[1]
                with open('image/' + filename, 'wb') as f:
                    f.write(im.content)
                img['src']='image/'+filename
            htmls=htmls+str(tag)
            with open("android_training_3.html",'a') as f:
                f.write(htmls)
            print("  (%s)  [%s] download end"%(i,title[i]))
        htmls="</body></html>"
        with open("android_training_3.html",'a') as f:
            f.write(htmls)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    1. 转为PDF 
      这一步需要下载wkhtmltopdf,在Windows下执行程序一直出错..Ubuntu下可以
    def save_pdf(html):
        """
        把所有html文件转换成pdf文件
        """
        options = {
            'page-size': 'Letter',
            'encoding': "UTF-8",
            'custom-header': [
                ('Accept-Encoding', 'gzip')
            ]
        }
        pdfkit.from_file(html, "android_training_3.pdf", options=options)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    最后的效果图

    这里写图片描述

    展开全文
  • Python爬爬取取知知乎乎图图片片代代码码实实现现解解析析 这篇文章主要介绍了Python爬取知乎图片代码实现解析,文中通过示例代码介绍的非常详细对大家的学习或者工 作具 一定的参考学习价值,需要的朋友可以参考下 ...
  • 如如何何使使用用python爬爬取取csdn博博客客访访问问量量 这篇文章主要介绍了如何使用python爬取csdn博客访问量的相关资料,需要的朋友可以参考下 最近学习了python 爬虫想写一个程序练练手所以我就想到了大家都比较...
  • Python爬爬取取十十篇篇新新闻闻统统计计TF-IDF 这篇文章主要为大家详细介绍了Python爬取十篇新闻统计TF-IDF的相关资料具有一定的参考价值感兴趣的小 伙伴们可 参考一下 统计十十篇篇新新闻TF-IDF 统计TF-IDF词频每...
  • 用用python爬爬取取历历史史天天气气数数据据的的方方法法示示例例 这篇文章主要介绍了用python爬取历史天气数据的方法示例文中通过示例代码介绍的非常详细对大家的学习 或者 作具有一定的参考学习价值需要的朋友们...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...

    工具准备

    安装 wkhtmltopdf

    https://wkhtmltopdf.org/downloads.html下载稳定版的 wkhtmltopdf 进行安装,安装完成之后把该程序的执行路径加入到系统环境 $PATH 变量中

    第三方安装

    pip install requests

    pip install beautifulsoup4

    pip install pdfkit

    pip install wkhtmltopdf

    实现分析

    获取html

    首先分析界面URL

    第一页:http://www.runoob.com/python/python-exercise-example1.html 第二页:http://www.runoob.com/python/python-exercise-example2.html 第三页:http://www.runoob.com/python/python-exercise-example3.html

    ...

    第一百页:http://www.runoob.com/python/python-exercise-example100.html 由此可以得出URL的规律

    url = 'http://www.runoob.com/python/python-exercise-example' + str(i) + '.html' 其中i为1到一百的整数

    分析页面的html获取爬取的内容

    image

    • 我们要获取到class =article-body,节点下的所有元素
    • 爬取的python示例中编码里面都含有样式,为了按原来的格式展示这里还需要使用一个html模板
    代码实现
    def get_learn_py_content():
        """
        解析URL,获取需要的html内容
        :return: htmls
        """
        htmls = []
    
        # 渲染的html模板
        html_template = """
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <link rel="stylesheet" href="style.css" type="text/css" media="all">
        </head>
        <body>
        {content}
        </body>
        </html>
        """
        for i in range(1,101):
            base_url = 'http://www.runoob.com/python/python-exercise-example' + str(i) + '.html'
            response = requests.get(base_url)
            soup = BeautifulSoup(response.content, 'html.parser')
            # 获取文档内容
            content = soup.find(class_='article-body')
            # 去除图片
            while soup.img:
                soup.img.decompose()
            html = html_template.format(content=content)
            html = html.encode("UTF-8")
            html_name = str(i)+".html"
            with open(html_name, 'wb') as f:
                f.write(html)
            htmls.append(html_name)
        return htmls
    

    将HTML转换成PDF

    将Html转换成PDF这里使用的是第三方的包pdfkit,直接将生成的HTML直接传入进来,在传入一个即将要用的PDF的文件名,就完成了

    def save_pdf(htmls,name):
        """
        把所有html文件转换成pdf文件
        """
        # views视图中可以加上options进行页面布局调试 
        options = {
            'page-size': 'Letter',
            'encoding': "UTF-8",
            'custom-header': [
                ('Accept-Encoding', 'gzip')
            ]
        }
    
        pdfkit.from_file(htmls, name, options=options)
    
    

    转载于:https://my.oschina.net/hellotest/blog/2046470

    展开全文
  • 这样就生成了包含所有教程的html文件(BeautifulSoup)2、将html转换成pdf(wkhtmltopdf)3、由于反爬做的比较好,在爬取的过程中还需要代理ip(免费 or 付费)推荐下我自己创建的Python学习交流群960410445,这是Python...

    想要把教程变成PDF有三步:

    1、先生成空html,爬取每一篇教程放进一个新生成的div,这样就生成了包含所有教程的html文件(BeautifulSoup)

    2、将html转换成pdf(wkhtmltopdf)

    3、由于反爬做的比较好,在爬取的过程中还需要代理ip(免费 or 付费)

    推荐下我自己创建的Python学习交流群960410445,这是Python学习交流的地方,不管你是小白还是大牛,小编都欢迎,不定期分享干货,包括我整理的一份适合零基础学习Python的资料和入门教程。

    开始使用

    将一段文档传入 BeautifulSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄.

    如下所示:



    首先,文档被转换成Unicode,并且HTML的实例都被转换成Unicode编码.

    然后,Beautiful Soup选择最合适的解析器来解析这段文档,如果手动指定解析器那么Beautiful Soup会选择指定的解析器来解析文档.

    对象的种类

    Beautiful Soup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为 4 种: Tag , NavigableString , BeautifulSoup , Comment .

    Tag:通俗点讲就是 HTML 中的一个个标签,类似 div,p。

    NavigableString:获取标签内部的文字,如,soup.p.string。

    BeautifulSoup:表示一个文档的全部内容。

    Comment:Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号.

    Tag

    Tag就是html中的一个标签,用BeautifulSoup就能解析出来Tag的具体内容,具体的格式为soup.name,其中name是html下的标签,具体实例如下:

    print soup.title输出title标签下的内容,包括此标签,这个将会输出

    print soup.head输出head标签下的内容

    如果 Tag 对象要获取的标签有多个的话,它只会返回所以内容中第一个符合要求的标签

    Tag 属性

    每个 Tag 有两个重要的属性 name 和 attrs:

    name:对于Tag,它的name就是其本身,如soup.p.name就是p

    attrs是一个字典类型的,对应的是属性-值,如print soup.p.attrs,输出的就是{'class': ['title'], 'name': 'dromouse'},当然你也可以得到具体的值,如print soup.p.attrs['class'],输出的就是[title]是一个列表的类型,因为一个属性可能对应多个值,当然你也可以通过get方法得到属性的,如:print soup.p.get('class')。还可以直接使用print soup.p['class']

    get

    get方法用于得到标签下的属性值,注意这是一个重要的方法,在许多场合都能用到,比如你要得到<img src="#">标签下的图像url,那么就可以用soup.img.get('src'),具体解析如下:

    # 得到第一个p标签下的src属性printsoup.p.get("class")

    string

    得到标签下的文本内容,只有在此标签下没有子标签,或者只有一个子标签的情况下才能返回其中的内容,否则返回的是None具体实例如下:

    # 在上面的一段文本中p标签没有子标签,因此能够正确返回文本的内容printsoup.p.string# 这里得到的就是None,因为这里的html中有很多的子标签printsoup.html.string

    get_text()

    可以获得一个标签中的所有文本内容,包括子孙节点的内容,这是最常用的方法

    搜索文档树

    BeautifulSoup 主要用来遍历子节点及子节点的属性,通过Tag取属性的方式只能获得当前文档中的第一个 tag,例如,soup.p。如果想要得到所有的<p> 标签,或是通过名字得到比一个 tag 更多的内容的时候,就需要用到 find_all()

    find_all(name, attrs, recursive, text, **kwargs )

    find_all是用于搜索节点中所有符合过滤条件的节点。

    name参数:是Tag的名字,如p,div,title

    # 1. 节点名print(soup.find_all('p'))# 2. 正则表达式print(soup.find_all(re.compile('^p')))# 3. 列表 print(soup.find_all(['p','a']))

    另外 attrs 参数可以也作为过滤条件来获取内容,而 limit 参数是限制返回的条数。

    CSS 选择器

    以 CSS 语法为匹配标准找到 Tag。同样也是使用到一个函数,该函数为select(),返回类型是 list。它的具体用法如下:

    # 1. 通过 tag 标签查找print(soup.select(head))# 2. 通过 id 查找print(soup.select('#link1'))# 3. 通过 class 查找print(soup.select('.sister'))# 4. 通过属性查找print(soup.select('p[name=dromouse]'))# 5. 组合查找print(soup.select("body p"))

    wkhtmltopdf

    wkhtmltopdf主要用于HTML生成PDF。

    pdfkit是基于wkhtmltopdf的python封装,支持URL,本地文件,文本内容到PDF的转换,其最终还是调用wkhtmltopdf命令。

    安装

    先安装wkhtmltopdf,再安装pdfkit。

    https://wkhtmltopdf.org/downloads.html

    pdfkit

    shell pip3 install pdfkit

    转换url/file/string

    importpdfkitpdfkit.from_url('http://google.com','out.pdf')pdfkit.from_file('index.html','out.pdf')pdfkit.from_string('Hello!','out.pdf')

    转换url或者文件名列表

    pdfkit.from_url(['google.com','baidu.com'],'out.pdf')pdfkit.from_file(['file1.html','file2.html'],'out.pdf')

    转换打开文件

    withopen('file.html')asf: pdfkit.from_file(f,'out.pdf')

    自定义设置



    使用代理ip

    爬取十几篇教程之后触发了这个错误:


    看来廖大的反爬虫做的很好,于是只好使用代理ip了,尝试了免费的西刺免费代理后,最后选择了付费的 阿布云 ,感觉响应速度和稳定性还OK。

    运行结果

    运行过程截图:


    运行过程

    生成的效果图:


    效果图

    代码如下:




    转载于:https://juejin.im/post/5c3805096fb9a04a0f656332

    展开全文
  • 当我学了廖大的Python教程后,感觉总得做点什么,正好自己想随时查阅,于是就开始有了制作PDF这个想法。 想要把教程变成PDF有三步: 先生成空html,爬取每一篇教程放进一个新生成的div,这样就生成了包含所有教程的...
  • 前言 文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 PS:如有需要Python学习资料的小...用 python 爬取你喜欢的 CSDN 的原创文章,制作成 P...
  • 用用Python 爬爬取取猫猫眼眼电电影影数数据据分分析析 无无名名之之辈辈 这篇文章主要介绍了用Python 爬取猫眼电影数据分析 无名之辈文中通过示例代码介绍的非常详细对 家 的学习或者工作具有一定的参考学习价值...
  • Python爬爬取取新新型型冠冠状状病病毒毒谣谣言言新新闻闻进进行行数数据据分分析析 这篇文章主要介绍了Python爬取新型冠状病毒谣言新闻进行数据分析本文通过实例代码给大家介绍的非常详 细 有一定的参考借鉴价值,...
  • ) 234567)8 ;=4@6ABCDECFEGHI6J9:K[\]^8@6K &9:c[,defghij8 opqrstuvwx7,d8yz6rstuvw{|)K}~& R5$a8&9:ABrstuvw/K P [,85NP&AB K&X/Ty58 @DL.K5$gK& EEEIBKyM89[R GitChat K&ABKrstuvwa& S
  • python-tutorial-pdf 当我学了廖大的Python教程后,感觉总得做点什么,正好自己想随时查阅,于是就开始有了制作PDF这个想法。 想要把教程变成PDF有三步: 先生成空html,爬取每一篇教程放进一个新生成的div,这样就...
  • 作为一名程序员,经常要搜一些教程,有的教程是在线的,不提供离线版本,这就有些局限了。...3、爬取内容 3.1 获取教程名称 3.2 获取目录及对应网址 3.3 获取章节内容 3.4 保存pdf 3.5 合并pdf 1、网站...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 378
精华内容 151
关键字:

python爬取pdf

python 订阅