在之前的文章 爬虫必备工具,掌握它就解决了一半的问题 中介绍过如何分析一个网页上的请求。按照其中的方法,我们可以通过开发者工具的 Network 功能找出专栏页面获取详细列表的请求:
https://www.逍遥.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.逍遥.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 转 PDF 的工具,需要单独安装,具体可参考它的官网介绍。