抓取网页生成电子书( 全篇的实现思路分析网页学会使用BeautifulSoup库爬取并导出参考资料)
优采云 发布时间: 2022-03-31 16:00抓取网页生成电子书(
全篇的实现思路分析网页学会使用BeautifulSoup库爬取并导出参考资料)
Python 抓取网页并将其转换为 PDF 文件
爬行动物的成因
虽然可以查阅官方文件或手册,但如果是纸质的,是不是更容易阅读和记忆。如果是简单的复制粘贴,不知道什么时候能完成。于是我开始考虑爬下安卓官方手册。
整篇文章的实现思路
分析网页,学习使用BeautifulSoup库爬取导出
参考:
* 将廖雪峰的教程转换成PDF电子书
* 请求文件
* 美丽的汤文档
配置
Ubuntu下使用Pycharm成功运行
要转换PDF,您需要下载wkhtmltopdf
具体流程
网页分析
如下图的一个网页,要做的就是获取网页的body和title,以及左侧导航栏的所有url
接下来的工作是找到这些标签......
关于请求的使用
详细参考文档,这里只是简单的使用Requests获取html并使用代理翻墙(网站不能直接访问,需要VPN)
proxies={
"http":"http://vpn的IP:port",
"https":"https://vpn的IP:port",
}
response=requests.get(url,proxies=proxies)
美汤的使用
参考资料中有一个 Beautiful Soup 文档。看完可以知道有两件事:一是找标签,二是修改标签。
这篇文章需要做的是:
1. 获取标题和所有url,这涉及到查找标签
#对标签进行判断,一个标签含有href而不含有description,则返回true
#而我希望获取的是含有href属性而不含有description属性的<a>标签,(且只有a标签含有href)
def has_href_but_no_des(tag):
return tag.has_attr('href') and not tag.has_attr('description')
#网页分析,获取网址和标题
def parse_url_to_html(url):
response=requests.get(url,proxies=proxies)
soup=BeautifulSoup(response.content,"html.parser")
s=[]#获取所有的网址
title=[]#获取对应的标题
tag=soup.find(id="nav")#获取第一个id为"nav"的标签,这个里面包含了网址和标题
for i in tag.find_all(has_href_but_no_des):
s.append(i['href'])
title.append(i.text)
#获取的只是标签集,需要加html前缀
htmls = ""
with open("android_training_3.html",'a') as f:
f.write(htmls)
解析上面得到的URL,获取文本,取出图片保存在本地;它涉及查找标签和修改属性
#网页操作,获取正文及图片
def get_htmls(urls,title):
for i in range(len(urls)):
response=requests.get(urls[i],proxies=proxies)
soup=BeautifulSoup(response.content,"html.parser")
htmls=""+str(i)+"."+title[i]+""
tag=soup.find(class_='jd-descr')
#为image添加相对路径,并下载图片
for img in tag.find_all('img'):
im = requests.get(img['src'], proxies=proxies)
filename = os.path.split(img['src'])[1]
with open('image/' + filename, 'wb') as f:
f.write(im.content)
img['src']='image/'+filename
htmls=htmls+str(tag)
with open("android_training_3.html",'a') as f:
f.write(htmls)
print(" (%s) [%s] download end"%(i,title[i]))
htmls=""
with open("android_training_3.html",'a') as f:
f.write(htmls)
2.转换为PDF
这一步需要下载wkhtmltopdf,在Windows下执行程序总是报错。你可以在 Ubuntu 下完成
def save_pdf(html):
"""
把所有html文件转换成pdf文件
"""
options = {
'page-size': 'Letter',
'encoding': "UTF-8",
'custom-header': [
('Accept-Encoding', 'gzip')
]
}
pdfkit.from_file(html, "android_training_3.pdf", options=options)
最终效果图
以上就是本文的全部内容。希望对大家的学习有所帮助,也希望大家多多支持来客网。