本想着在双十一买点专业相关的书籍呢,但是被当当和淘宝的红包给套路了一下,所以就只能去一些网站来看博客教程来了……我主要选择了廖雪峰老师的博客和菜鸟教程的博客,这两个相对来说还是比较简单易懂的。但是……问题又来了,网页观看考虑到联网问题就有点不太方便了,所以我就想着利用以前的一点python知识来写个爬虫爬取下来保存到本地不就可以长久的观看了么。

  下面是具体实现代码:运行环境:win10 64位、python3.x

            需要用到的包:requests(进行网络请求)、BeautifulSoup(用来解析html文档)、codecs(用来打开文件)、time(用来延时)、pdfkit(用来生成pdf文档)

import requests
from bs4 import BeautifulSoup
import codecs
import time
import pdfkit
def getURLS(url):
    # 获取目录地址列表
    URLS = []
    # 获取协议头,进行伪装。PS:这个网站反爬虫较弱,可以尽情的爬取
    header = getHeader()
    # 获取网页信息并取出所需信息
    r = requests.get(url,headers = header)
    r.encoding = 'utf-8'
    soup = BeautifulSoup(r.text,"html.parser")
    _tops = soup.find_all('a',target='_top')
    for _top in _tops:
        URLS.append("http://www.runoob.com" + _top['href'])
    return URLS
def getPageHtml(url):
    # 获取具体代码段
    header = getHeader()
    try:
        # 这里由于取出来的地址有些地方不规则,需要判断一下
        r = requests.get(url,headers = header)
    except:
        print("打开链接失败!链接地址" + url)
        return "<h1>打开链接失败!链接地址" + url + "</h1>"
    r.encoding = 'utf-8'
    soup = BeautifulSoup(r.text,"html.parser")
    content = soup.find('div',id='content')
    return str(content)
def getHeader():
    # 构建协议头
    op = codecs.open('header.txt','r','utf-8')
    strings = op.read()
    strings = strings.split('\n')
    header = {}
    for string in strings:
        i = string.split(":")
        header[i[0].strip()]=i[1].strip()
    return header
if __name__ == '__main__':
    # 在这里修改生成的文件的名字
    file_name = '菜鸟教程Servlet.pdf'
    # 在这里修改要爬取的链接地址
    URL = "http://www.runoob.com/servlet/servlet-tutorial.html"
    # 开始获取目录链接地址列表
    urls = getURLS(URL)
    # 获取网页文件模板
    op = codecs.open('formwork.html','r','utf-8')
    html = op.read()
    # 用来存储代码段
    segment = ''
    for url in urls:
        # 获取目录列表代码段
        print("正在获取:" + url)
        segment = segment + '\n' + getPageHtml(url)
        time.sleep(5)
    # 把代码段添加到模板并保存到本地
    html = html = html.replace("formwork",segment)
    op = codecs.open('provisional.html','w','utf-8')
    op.write(html)
    # 生成pdf文件
    pdfkit.from_file('provisional.html',file_name)

 

posted on 2017-11-15 16:07  PaoMian007  阅读(137)  评论(0)    收藏  举报