Python网络爬虫笔记(三):下载博客园随笔到Word文档

(一)   说明

在上一篇的基础上修改了下,使用lxml提取博客园随笔正文内容,并保存到Word文档中。

操作Word文档会用到下面的模块:

pip install python-docx

修改的代码(主要是在link_crawler()的while循环中增加了下面这段)

 1         tree = lxml.html.fromstring(html) #解析HTML为统一的格式
 2         title = tree.xpath('//a[@id="cb_post_title_url"]') #获取标题
 3         the_file = tree.xpath('//div[@id="cnblogs_post_body"]/p') #获取正文内容
 4         pre = tree.xpath('//pre') #获取随笔代码部分(使用博客园自带插入代码功能插入的)
 5         img = tree.xpath('//div[@id="cnblogs_post_body"]/p/img/@src') #获取图片
 6         #修改工作目录
 7         os.chdir('F:\Python\worm\博客园文件')
 8         #创建一个空白新的Word文档
 9         doc = docx.Document()
10         #添加标题
11         doc.add_heading(title[0].text_content(), 0)
12         for i in the_file:
13             #将每一段的内容添加到Word文档(p标签的内容)
14             doc.add_paragraph(i.text_content())
15         # 将代码部分添加到文档中
16         for p in pre:
17             doc.add_paragraph(p.text_content())
18         #将图片添加到Word文档中
19         for i in img:
20             ure.urlretrieve(i, '0.jpg')
21             doc.add_picture('0.jpg')
22         #截取标题的前8位作为Word文件名
23         filename = title[0].text_content()[:8] + '.docx'
24         #保存Word文档
25         #如果文件名已经存在,将文件名设置为title[0].text_content()[:8]+ str(x).docx,否则将文件名设置为filename
26         if str(filename) in os.listdir('F:\Python\worm\博客园文件'):
27             doc.save(title[0].text_content()[:8] + str(x) + '.docx')
28             x += 1
29         else:
30             doc.save(filename)

(二)   完整代码(delayed.py的代码就不贴出来了,和上一篇一样)

限速最好设置大一些 ,下面这句,以秒为单位。

waitFor = WaitFor(2)
 1 import urllib.request as ure
 2 import re
 3 import urllib.parse
 4 from delayed import WaitFor
 5 import lxml.html
 6 import os
 7 import docx
 8 #下载网页并返回HTML(动态加载的部分下载不了)
 9 def download(url,user_agent='FireDrich',num=2):
10     print('下载:'+url)
11     #设置用户代理
12     headers = {'user_agent':user_agent}
13     request = ure.Request(url,headers=headers)
14     try:
15         #下载网页
16         html = ure.urlopen(request).read()
17     except ure.URLError as e:
18         print('下载失败'+e.reason)
19         html=None
20         if num>0:
21             #遇到5XX错误时,递归调用自身重试下载,最多重复2次
22             if hasattr(e,'code') and 500<=e.code<600:
23                 return download(url,num-1)
24     return html
25 #seed_url传入一个url,例如https://www.cnblogs.com/
26 #link_regex传入一个正则表达式
27 #函数功能:提取和link_regex匹配的所有网页链接并下载
28 def link_crawler(seed_url, link_regex):
29     html = download(seed_url)
30     crawl_queue = []
31     #迭代get_links()返回的列表,将匹配正则表达式link_regex的链接添加到列表中
32     for link in get_links(html):
33         if re.match(link_regex, link):
34             #拼接https://www.cnblogs.com/ 和 /cate/...
35             link = urllib.parse.urljoin(seed_url, link)
36             #不在列表中才添加
37             if link not in crawl_queue:
38                 crawl_queue.append(link)
39     x = 0
40     #调用WaitFor的wait()函数,下载限速,间隔小于2秒则等待,直到间隔等于2秒才继续下载(大于5秒则直接继续下载)
41     waitFor = WaitFor(2)
42     #下载crawl_queue中的所有网页
43     while crawl_queue:
44         #删除列表末尾的数据
45         url = crawl_queue.pop()
46         waitFor.wait(url)
47         html = download(url)
48         tree = lxml.html.fromstring(html) #解析HTML为统一的格式
49         title = tree.xpath('//a[@id="cb_post_title_url"]') #获取标题
50         the_file = tree.xpath('//div[@id="cnblogs_post_body"]/p') #获取正文内容
51         pre = tree.xpath('//pre') #获取随笔代码部分(使用博客园自带插入代码功能插入的)
52         img = tree.xpath('//div[@id="cnblogs_post_body"]/p/img/@src') #获取图片
53         #修改工作目录
54         os.chdir('F:\Python\worm\博客园文件')
55         #创建一个空白新的Word文档
56         doc = docx.Document()
57         #添加标题
58         doc.add_heading(title[0].text_content(), 0)
59         for i in the_file:
60             #将每一段的内容添加到Word文档(p标签的内容)
61             doc.add_paragraph(i.text_content())
62         # 将代码部分添加到文档中
63         for p in pre:
64             doc.add_paragraph(p.text_content())
65         #将图片添加到Word文档中
66         for i in img:
67             ure.urlretrieve(i, '0.jpg')
68             doc.add_picture('0.jpg')
69         #截取标题的前8位作为Word文件名
70         filename = title[0].text_content()[:8] + '.docx'
71         #保存Word文档
72         #如果文件名已经存在,将文件名设置为title[0].text_content()[:8]+ str(x).docx,否则将文件名设置为filename
73         if str(filename) in os.listdir('F:\Python\worm\博客园文件'):
74             doc.save(title[0].text_content()[:8] + str(x) + '.docx')
75             x += 1
76         else:
77             doc.save(filename)
78 #传入html对象,以列表形式返回所有链接
79 def get_links(html):
80     #使用正则表达式提取html中所有网页链接
81     webpage_regex = re.compile('<a[^>]+href=["\'](.*?)["\']',re.IGNORECASE)
82     html = html.decode('utf-8')
83     # 以列表形式返回所有网页链接
84     return webpage_regex.findall(html)
85 
86 link_crawler('https://www.cnblogs.com/cate/python/','.*/www.cnblogs.com/.*?\.html$')

(三)结果

(四)存在的问题

 (1)代码部分是添加到正文内容后面的。(使用过博客园插入代码功能的随笔,排版会不一致)

(2)图片是直接插入到代码部分后面的。(随笔有插入图片的,排版会不一致)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DannyHoo的专栏

加载图片的两个方法:imageName: imageWithContentOfFile:

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

27910
来自专栏Debian社区

Tmux 快速教程:快捷键和配置

Tmux 简单来说就是终端里的『窗口管理器』,如果我使用终端登录到远程主机并运行前台程序,那么这个窗口等于就被占用了,想要看一下 CPU 的使用率,就得再连接一...

48820
来自专栏文武兼修ing——机器学习与IC设计

selenium初探selenium初探

selenium初探 selenium简介与安装 简介 selenium是一个网站的自动化测试库,但由于其具有大量的自动化库而且可以调用浏览器,常常被用于爬虫技...

32060
来自专栏Core Net

C# 处理Word自动生成报告 一、概述

50370
来自专栏河湾欢儿的专栏

vuex(2)如何传值

第四步 (将发送来的‘me’事件来处理 将vuex里的state里的good来改变值) mutations.js

51730
来自专栏极乐技术社区

极乐问答No.2 | 微信小程序开发40问

导语 微信小程序开发者和开发需求者必读,内容涵盖小程序开发实战需要注意的40个技术点,供大家参考: ? 问答 Q Q1:为什么脚本内不能使用window等对象 ...

32580
来自专栏coding

vue.js进行数据监听

13530
来自专栏Youngxj

SweetAlert-js超酷消息警告框插件

27230
来自专栏Jerry的SAP技术分享

在Windows笔记本上调试运行在iOS设备上的前端应用

我在每天工作中需要在不同的移动设备上测试我们开发的前端应用是否正常工作,比如iOS设备和Android设备。我用的工作笔记本电脑又是Lenovo的,安装的是Wi...

19910
来自专栏河湾欢儿的专栏

性能优化

11810

扫码关注云+社区

领取腾讯云代金券