抓取网页生成电子书(通过Python和爬虫,可以完成怎样的小工具?|知乎)

优采云 发布时间: 2021-09-11 20:00

  抓取网页生成电子书(通过Python和爬虫,可以完成怎样的小工具?|知乎)

  总有同学问,在学习了Python基础之后,我不知道自己可以做些什么来提高。今天就用一个小例子来告诉大家通过Python和爬虫可以完成什么样的小工具。

  在知乎上,你一定关注了一些不错的专栏(比如Crossin的编程课堂)。但如果有一天,你最喜欢的受访者在网上被喷,你一怒之下删帖,停止更新,你就看不到这些好内容了。虽然这是小概率事件(以前没有发生过),但你可以准备下雨天。您可以将您关注的专栏导出到电子书,这样您就可以离线阅读,而不必担心误删帖子。

  如果只需要工具和源码,可以拉到文章底部获取代码。

  【最终效果】

  运行程序,输入栏目id,即网页地址上的路径:

  

  

  之后程序会自动抓取栏目中的文章,并根据发布时间合并导出为pdf文件。

  

  [实现思路]

  本程序主要分为三部分:

  抓取栏目文章地址列表抓取每个文章导出PDF1.抓取列表的详细内容

  在之前的文章爬虫必备工具中,掌握了它就解决了一半的问题,我介绍了如何分析网页上的请求。按照方法,我们可以使用开发者工具的Network功能,找出栏目页面的请求,获取详细列表:

  https://www.zhihu.com/api/v4/columns/crossin/articles

  

  观察返回的结果,我们发现通过next和is_end的值,可以得到下一个列表请求的地址(相当于页面向下滚动的触发效果),判断是否得到了全部文章。

  data中的id、title、url就是我们需要的数据。因为url可以用id拼写,所以没有保存在我们的代码中。

  

  使用while循环直到文章的所有id和title都被捕获并保存在文件中。

  while True:

resp = requests.get(url, headers=headers)

j = resp.json()

data = j['data']

for article in data:

# 保存id和title(略)

if j['paging']['is_end']:

break

url = j['paging']['next']

# 按 id 排序(略)

# 导入文件(略)

  

  2. 抢文章

  有了文章的所有id/url,后面的爬取就很简单了。 文章主要内容在Post-RichText标签中。

  处理一些文字需要一点功夫,比如原页面的图片效果,会添加noscript标签和data-actual、src="data:image等属性,我们需要正常显示删除。

  url = 'https://zhuanlan.zhihu.com/p/' + id

html = requests.get(url, headers=headers).text

soup = BeautifulSoup(html, 'lxml')

content = soup.find(class_='Post-RichText').prettify()

# 对content做处理(略)

with open(file_name, 'w') as f:

f.write(content)

  

  到这一步,所有的内容都已经抓取完毕,可以在本地读取了。

  3. 导出 PDF

  为了方便阅读,我们使用 wkhtmltopdf + pdfkit 将这些 HTML 文件打包成 PDF。

  wkhtmltopdf 是一个 HTML-to-PDF 工具,需要单独安装。详情请参考其官网。

  pdfkit 是本工具打包的 Python 库,可以从 pip 安装:

  pip install pdfkit

  易于使用:

  # 获取htmls文件名列表(略)

pdfkit.from_file(sorted(htmls), 'zhihu.pdf')

  

  这样就完成了整列的导出。

  不止知乎columns,几乎所有的信息网站都使用1.Grab List 2.Grab Details to 采集data 两步。所以这段代码只要稍加修改,就可以在许多其他网站中使用。只是有些网站需要登录访问,所以需要在headers中设置cookie信息。另外,不同的网站请求接口、参数、限制都不一样,具体问题还是要具体问题具体分析。

  这些爬虫的开发技巧可以在我们的爬虫实战课中学习。如有需要,请在公众号回复。爬虫实战

  [源码下载]

  获取知乎专栏下载器源码,请在公众号(Crossin的编程课堂)回复关键词知乎。

  除了代码,还有本专栏打包好的PDF,欢迎阅读分享。

  ====

  其他文章和回答:

  欢迎搜索关注:Crossin的编程课堂

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线