目录
前言
一、下载工具包、安装模块
二、写bug
1.引入库模块
2.取博客在页面源代码中的信息
2.1 访问网站,拿到页面源代码。
2.2把页面源代码中的博客内容转成字符串格式?
3.转为pdf和ipg格式
4.其它的获取
5.完整的代码及执行截图?
总结
前言
当我们在CSDN这个优秀的博客上浏览学习内容时,比如在看hq的爬虫博客,可能没办法在一下子看得懂或者突然有事看不完,那么我们就想把它保存下来以后再看,但是每次再看的时候经常要登录网站,非常难受。于是,我就想能不能把想看的CSDN上的博客,诶,爬取下来,私底下再慢慢欣赏。九牛二虎之力之后发现,可以实现。下面呢,就以hq的博客为例,我们把他的博客爬取下来并转成pdf和jpg格式保存。
如果只想要这个程序,直接到最后的百度网盘链接即可。
提示:以下是本篇文章正文内容,下面案例可供参考
一、下载工具包、安装模块
1. 需要下载wkhtmltopdf工具包,地址:https://wkhtmltopdf.org/downloads.html,根据自己的需要,下载相应的版本,例如,我是windows10-64位操作系统,那么我就下载下图中我圈中的部分。
?点击下载好的工具包并安装,可以指定安装路径为C盘以外的盘,安装完成后这个文件夹的bin文件夹下会有这两个exe文件。比如我的安装在D盘,如下图所示。
?至此我们的工具包下载完毕。
2.安装python的imgkit模块、pdfkit模块、requests模块、re模块、lxml模块。非常简单!只需要在pycharm中的终端命令中依次输入以下五个命令,就会自动安装,如果你安装过就没必要重复安装了。(重复安装他会提示你已经有了,就不进行安装了。)安装成功会提示,如下图所示。
pip install imgkit
pip install pdfkit
pip install requests
pip install re
pip install lxml
?可能会像我一样报个warning,没关系,它的意思就是说有更新的版本可以去更新。我们不需要新版本,这个版本稳定。当然你也可以去更新。非常好用。
至此我们就完成了对一个工具包和五个库模块的安装,下面,我们正式开始写bug。
二、写bug
1.引入库模块
import requests #访问网站并拿到页面源代码
import pdfkit #转成pdf
import imgkit #转成jpg
from lxml import etree #提取网页主要内容
import re #拿到文章标题作为文件的命名
?这个没什么好说的,就是类似于咱们写C或者C++程序,把要用的“头文件”“include”进来。
2.取博客在页面源代码中的信息
2.1 访问网站,拿到页面源代码。
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55'
}
url = input("请输入一个CSDN网址\n")
resp = requests.get(url, headers=headers)
headers是我们所需要的做的一个小小的反爬手段,这个可以右键点击博客空白处,点击“检查”,进“网络”里,再刷新一下网页,随便一个访问里就有这个信息。这个信息就是在告诉对面的服务器大哥,这次的访问不是爬虫发出的,而是这个“user-agent”,即正常用户发出的。
??
url是我们需要爬取博客的网站。
resp是一个requests这个“类”调用自身的“类函数”所返回来的一个“对象”。你可以认为得到的是一个类似于C++语言里面的对象,这个方便我们理解。我们从对象中就可以访问我们想要的内容。比如:resp.text就是这个博客网页的页面源代码。
2.2把页面源代码中的博客内容转成字符串格式?
为什么需要转成字符串格式呢,一开始又是什么格式呢,我们一个一个回答。
因为这两个库模块imgkit、pdfkit支持将string类型的数据转换为相对应的pdf和jpg格式,所以我们得把它转为字符串格式。一开始我们爬取的页面源代码格式是html格式,是一种写前端的语言也是一种文件格式。
HeadHtml='''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{}
</body>
</html>'''
page_html = etree.HTML(resp.text)
page_content = page_html.xpath("//*[@id='mainBox']/main/div[1]")[0]
page_string = etree.tostring(page_content, encoding='utf-8').decode('utf-8')
page_good = HeadHtml.format(page_string)
?我们先看下面四行。
第一行是利用lxml里面的etree对resp.text创建一个page_html对象的“指针”,该“指针”指向原始页面源代码html。
之后第二行调用xpath函数,xpath解析来获取我们想要的博客页面内容的html。xpath地址可以右键“检查”,通过点击左上角选择整个博客页面,右键相应的源代码选择复制xpath值,来获得参数,这个值就写到括号里面。如下图所示。
?
?第三行就是把博客页面所对应的html内容转为string形式。调用etree的tosrtring函数,可以对html信息转为string形式。参数encoding可以不要,但是外面的decode必须为页面对应的编码格式(因为我们要解码,所以必须要编码格式),这里我们通过源代码可以找到格式为“utf-8”。源代码可以右击页面空白处,选择“查看页面源代码”,在里面就可以看得到。如下图所示。
?
第四行就是把上面“HeadHtml”(格式为string)和现有的博客html(格式为string)合并为完整的html(string格式)。
至此我们对博客的页面源代码处理结束,得到了page_good:博客内容这块对应的html(string格式)。
3.转为pdf和ipg格式
path1 = r'D:\pythonthird\python-pdf-png\wkhtmltopdf\bin\wkhtmltopdf.exe'
path2 = r'D:\pythonthird\python-pdf-png\wkhtmltopdf\bin\wkhtmltoimage.exe'
file_name1 = '{}/{}.pdf'.format(address, title)
config1 = pdfkit.configuration(wkhtmltopdf=path1)
pdfkit.from_string(page_good, file_name1, configuration=config1)
file_name2 = '{}/{}.jpg'.format(address, title)
config2=imgkit.config(wkhtmltoimage=path2)
imgkit.from_string(page_good,file_name2,config=config2)
?path1和path2就是咱们安装工具包的位置,给它位置,就相当于把python和这个工具包链接起来了。
format可以使两个大括号里分别放置address和title,这样我们就能有输出文件的位置,以及输出文件的名字了。address和title的获取我们一会儿再说。
下面固定的两行就是固定的写法,就是来把我们拿到的page_good(也就是博客所对应的string格式的源代码)进行转换。
4.其它的获取
address = input("请输入一个要存放的地方\n例如你想存在D盘里的空文件夹gx:D:\gx\n")
obj = re.compile(r'<h1 class="title-article" id="articleContentId">(.*?)</h1>', re.S)
title = obj.findall(resp.text)[0]
address当然需要你预先指定了,好说。
利用正则表达式,对页面源代码进行提取,提取出title,这个应该不难吧。好了,那我简单说一下。先调用re生成一个obj对象,这个对象会对传进去的参数进行查找,有符合引号里面的内容,就把它提取出来。返回的就是(.*?)所代表的内容。
5.完整的代码及执行截图?
?这里我把网站的输入及之后的处理放在了while中,这样,我们就可以输入多个网址进行爬取了。还加了一点提示性语句,这样会使程序更加好看。
import requests
import pdfkit
import imgkit
from lxml import etree
import re
address = input("请输入一个要存放的地方\n例如你想存在D盘里的空文件夹gx:D:\gx\n")
HeadHtml='''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{}
</body>
</html>'''
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55'
}
i = 0
while i == 0:
#获取响应
url = input("请输入一个CSDN网址\n")
resp = requests.get(url, headers=headers)
#获取博客页面的html(string格式)
page_html = etree.HTML(resp.text)
page_content = page_html.xpath("//*[@id='mainBox']/main/div[1]")[0]
page_string = etree.tostring(page_content, encoding='utf-8').decode('utf-8')
page_good = HeadHtml.format(page_string)
#利用正则表达式提取出文章标题
obj = re.compile(r'<h1 class="title-article" id="articleContentId">(.*?)</h1>', re.S)
title = obj.findall(resp.text)[0]
#导入两个工具包路径
path1 = r'D:\pythonthird\python-pdf-png\wkhtmltopdf\bin\wkhtmltopdf.exe'
path2 = r'D:\pythonthird\python-pdf-png\wkhtmltopdf\bin\wkhtmltoimage.exe'
#进行pdf和jpg转换
print('---正在转换为pdf---\n')
file_name1 = '{}/{}.pdf'.format(address, title)
config1 = pdfkit.configuration(wkhtmltopdf=path1)
pdfkit.from_string(page_good, file_name1, configuration=config1)
print('---正在转换为图片---\n')
file_name2 = '{}/{}.jpg'.format(address, title)
config2=imgkit.config(wkhtmltoimage=path2)
imgkit.from_string(page_good, file_name2, config=config2)
?
?
?
?
?
?
总结
最后,感谢你能看到这里,你也应该感谢你自己,听我白话那么多。到这里我们就完成了对hq文章的爬取,当然其它文章也可以。这样我们就可以不用联网,来私底下欣赏CSDN博客了。
最后的最后,我知道,大家都“没有装python”,运行不了,没关系。我已经把它打包成了一个windows下的.exe可执行程序,有没有python,没关系,有这个exe就可以爬取。我把它放在了这个链接里,欢迎下载。感谢您的支持。
百度网盘:
链接:https://pan.baidu.com/s/1b0seSrndfux6Hw_3oSJ5cg? 提取码:gx66
|