爬虫-将网页数据写入word中

        不知不觉已经毕业一年多了,在这一年的时间里主要从事数据分析与挖掘方面工作,突然想把之前研究的技术做个总结整理进行分享。

        之前公司项目有个很奇葩的需求,希望能将网页数据爬取下来并保存到word中,要求与网页上一模一样,包括网页上图表内容。

这里以静态网页为例。首先展示下最终结果:

原网页部分截图内容:

通过爬虫写入word效果:

以上展示了单个网页数据写入word中的简单效果,其中图表相关信息爬取工作较为繁琐些。

单个网页数据爬取思路:首先解析网页,然后定位网页信息,接着判断所定位网页信息中的每段内容是否为表格或者图片。若为表格,则需要分析表格结构。

如下图所示可发现,tr表示表格的行,td表示表格的列。第一个tr下有4个td对应表中第一行4列,以此类推。图表的绘制主要用到python第三方包python_docx,通过该包中add_table函数绘制表格,add_picture函数用于绘制图片。

 

Python使用python_docx包方法可参考网页:

http://www.cnblogs.com/ontheway703/p/5266041.html

该部分代码如下:

def get_article(url_body,filename,html):
    content_total = ""
    text = url_body.xpath('.//td[@class="b12c"]/p|.//td[@class="b12c"]/div|.//td[@class="b12c"]/span|.//td[@class="b12c"]/font')
    doc = Document()
    for x in text:
        row = x.xpath('.//tbody//tr')
        try:
            if row:  #判断是否为表格
                for col in row:
                    table = doc.add_table(rows=1, cols=int(len(col)), style='Table Grid')
                    hdr_cells = table.rows[0].cells
                    td = col.xpath('./td')
                    td_list = []
                    for t in td:
                        ins_data = t.xpath('.//text()') #爬取网页表格中的数据
                        ins_data = filter(lambda x: x != '\r\n      ', ins_data)
                        tmp = ""
                        for i in range(len(ins_data)):
                            tmp += ins_data[i]
                        td_list.append(tmp)
                    length = len(td_list)
                    for i in range(length):
                        hdr_cells[i].text = td_list[i] #数据写入创建的表格中
            else:
                img_ads = x.xpath('.//@src')
                imglist = ""
                if img_ads: #判断爬取的是否为图片数据
                    for h in img_ads:
                        if h.startswith('http://'):
                            try:
                                img = cStringIO.StringIO(urllib2.urlopen(h).read())
                            except:
                                img = cStringIO.StringIO(req.get(h).content)
                        else: #有些图片网页不是http:开头需要重新修改
                            ind = html.rfind('/') + 1
                            h = html.replace(html[ind:], h)
                            try:
                                img = cStringIO.StringIO(urllib2.urlopen(h).read())
                            except:
                                img = cStringIO.StringIO(req.get(h).content)
                        doc.add_picture(img, width=Inches(4.25))#设置写入的图片大小
                        imglist = imglist + h + " "
                paragraph = x.xpath('.//text()') #爬取文字段落信息
                str_ = ""
                for j in paragraph:
                    str_ = str_ + j
                doc.add_paragraph(str_)
                content_total = content_total + imglist + str_ + "\n"
        except:
            pass
    doc.save(filename)
    return content_total

本文简单介绍单个网页数据的爬取写入方法,爬取的目标网页为静态网页。若为动态网页还需要查找出网页的跳转文件。对多个网页爬取则需要进行分页处理,可使用MongoDB将爬取的网页地址存入MongoDB中,每次爬取网页可进行判断MongoDB中是否存在以免重复爬取。

本文实例源码:

https://github.com/liangjunAI/Spider/blob/master/spider_into_word/spider_in_word.py

猜你喜欢

转载自blog.csdn.net/qq_26535271/article/details/84500885
今日推荐