Python爬蟲——用BeautifulSoup、python-docx爬取廖雪峰大大的教程為word文檔


版權聲明:本文為博主原創文章,歡迎轉載,並請注明出處。聯系方式:460356155@qq.com

廖雪峰大大貢獻的教程寫的不錯,寫了個爬蟲把教程保存為word文件,供大家方便下載學習:http://pan.baidu.com/s/1o7InnQE

運行環境:python 2.7、beautifulsoup4、python-docx 0.8.6,Python爬蟲源代碼如下:

# -*- coding:utf-8 -*-

__author__ = 'zhengbiqing 460356155@qq.com'

from bs4 import BeautifulSoup
from urllib import urlopen,urlretrieve
import re
from collections import OrderedDict
from docx import Document
from docx.shared import Inches
import docx
import os
import time
import sys
from PIL import Image

baseUrl = 'http://www.liaoxuefeng.com'
#python
#firstPageUrl = '/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000'
#git
#firstPageUrl = '/wiki/0013739516305929606dd18361248578c67b8067c8c017b000'
#javascript
firstPageUrl = '/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000'

INDENT = 8
TMP_IMG_NAME = 'tmpimg.jpg'
A4_WIDTH = 590
A4_WIDTH_INCH = 6
PAGE_OPEN_DELAY = 1

#保存目錄信息的有序字典
content = OrderedDict()

def writePage( url, indentNum, doc ):
    '''
    保存一個html頁面
    :param url: 頁面地址
    :param indentNum: 目錄項縮進量,形成層次性的目錄結構
    :param doc: 指向保存到的word文件
    :return:
    '''
    bsObj = BeautifulSoup( urlopen( url ), 'lxml' )
    #找到章節標題,並保存
    title = bsObj.find( 'div', class_="x-content" ).find( 'h4' )
    doc.add_heading( title.get_text(), int(indentNum) )
    #找到文章內容主體,得到每一個p標簽,遍歷每個p標簽
    pageContent = bsObj.find( 'div', class_="x-wiki-content" )
    pages = pageContent.findAll( 'p' )

    for page in pages:
        #對img標簽,得到圖片並保存到word文件
        imgs = page.findAll( 'img' )
        for img in imgs:
            imgUrl = baseUrl + img['src'] if img['src'].startswith( '/') else img['src']
            urlretrieve( imgUrl, TMP_IMG_NAME )
            pic = Image.open( TMP_IMG_NAME )
            if (pic.size)[0] > A4_WIDTH:
                doc.add_picture( TMP_IMG_NAME, width = Inches(A4_WIDTH_INCH) )
            else:
                doc.add_picture( TMP_IMG_NAME )
        #保存文字
        doc.add_paragraph( page.get_text() )
    #添加分頁
    doc.add_page_break()

def writeContent( url, doc ):
    '''
    得到目錄信息,並保存為word文件目錄,但未實現鏈接跳轉功能,python-docx的該功能在開發中
    :param url: 目錄信息業html頁面地址
    :param doc: 指向保存到的word文件
    :return:
    '''
    html = urlopen( url )
    bsObj = BeautifulSoup( html, 'lxml' )
    #找到符合一定特征的目錄項
    contentList = bsObj.findAll( 'li', { 'style': re.compile( '^margin-left.*' ), 'id': not None } )

    for contentItem in contentList:
        contentLink = contentItem.find( 'a' )
        #得到目錄項的縮進數,表征了目錄項的層次
        indent = re.findall( '\d+', contentItem['style'] )
        contentStr =  ' '* INDENT * int( indent[0] ) + contentLink.string
        #避免重復的目錄項
        if contentStr not in content:
            #目錄信息,包括標題、鏈接、縮進
            content[contentStr] = [contentLink['href'], indent[0]]

    doc.add_heading( u'目錄', 0 )
    for item,value in content.items():
        #print item, value
        #保存目錄到word文檔
        doc.add_paragraph( item )

    doc.add_page_break()

def fileName( url ):
    '''
    從html中得到word文件名
    '''
    html = urlopen( url )
    bsObj = BeautifulSoup( html, 'lxml' )
    return bsObj.title.string

fileName = fileName( baseUrl + firstPageUrl ) + '.doc'
document = docx.Document( fileName ) if os.path.exists( fileName ) else docx.Document()

writeContent( baseUrl + firstPageUrl, document )
writePage( baseUrl + firstPageUrl, '1', document )

for page in content.values():
    #調試信息
    print baseUrl + page[0]
    writePage( baseUrl + page[0], page[1], document )
    time.sleep( PAGE_OPEN_DELAY )

#調試時采用,只讀幾個頁面
'''
for i in range( 1 ):
    #調試信息
    print baseUrl + content.values()[i][0]
    writePage( baseUrl + content.values()[i][0], content.values()[i][1], document )
    time.sleep( PAGE_OPEN_DELAY )
'''

document.save( fileName )

#刪除圖片臨時文件
try:
    os.remove( TMP_IMG_NAME )
except:
    print 'remove file fail'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM