1. 首页 > 英语培训机构

知乎爬虫:爬取知乎公众收藏中的文字内容(视频和图片以链接的形式保存)

源代码在 Github:

留言需求

1) 如果您有任何问题,请在提问前阅读本文。您的问题可能已经在文章中提及。如果你没有看文章就问任何问题,我会直接屏蔽。

2) 注意评论区评论的简洁性。如果有我认为不必要的评论,我会删除它们,以节省以后的人的时间,这会消耗额外的时间和精力,所以如果你的评论没有,如果你需要做的太多,我可能会屏蔽你。

3) 我的程序的目的是编写可用的程序,而不是编写完美的程序。如果有人可以编写完美的程序,请明智。如果您有任何问题或建议,可以以“xxx 的问题”、“xxx 的建议”等形式提出。如果说“这个程序不够完善”之类的话,很有可能是它会引起我的厌恶,让你昏迷。

4) 我不接受私人信息或其他私人通信方式。有什么问题可以直接在评论区说出来。如果不能发图,可以在github的issue上提出。github,有问题可以在知乎评论区提醒我。

5) 正常而友好的交谈就足够了。不要称其为“大家伙”或“大神”。如果你必须有一个标题,就叫它“答案”、“作者”和“你”。

协议

本项目采用 GPLv3 协议。

项目指导

本项目使用Python3.10+编写,默认在Windows系统下运行,使用Edge浏览器。对于其他系统和浏览器,请参阅下面的“说明”。

本项目抓取知乎公众收藏中的内容,并保存为html文件,包括答案、文章、想法、视频等。保存位置默认为C:\__assets__\favorites的名字,文件名是Author:Title,思路是用前13个字符作为标题。图片和视频都是以链接的形式保存的,需要联网才能查看,所以本地保存的内容其实只是文字。

爬公共收藏的原因是私人收藏需要先登录知乎才能访问,但是我明白爬太多内容有被封号的风险,所以没有尝试登录。另外,如果不登录爬取知乎内容,也存在IP地址被封的风险,所以我做了一个选择页数的功能。可以进入起始页和结束页,减少每次爬取的次数。比如一个收藏有20个页面,可以一次次爬取1~5、6~10,中间有一段时间,防止IP被封。注意这里的页数只是我的例子,一次爬多少页和多次爬的间隔时间不会被阻塞,需要自己去尝试。

开始爬取内容后,会有百分比提示。本来想做一个连续的类型,结果竟然是离散的类型,就是如果有100个内容,5个页面,就是20%、40%、60%这样跳出来的,但是应该工作。

爬虫中有一些预估时间,但仅供参考,不一定准确。

另一个思路是用you-get把喜欢的图片和视频爬到本地,然后用html2text/turndown/sitdown转换成markdown格式,turndown/sitdown可能需要在Python中调用Javascript,不过我时间有限能量,有兴趣的可以自己试试。

我也试过用concurrent.future多线程加速,但是效果不明显,所以没有加这个功能。

本来想用pyinstaller打包一个exe文件方便使用,但由于知乎修改频繁,发布后可能很长一段时间都不可用,所以放弃了。

项目描述写在这里。如果您有任何问题和建议,可以在评论区提出。

依赖项和库

本项目的依赖和库如下,运行前需要下载安装本项目中的爬虫:

Python 3.10+(需要添加环境变量知乎爬虫:爬取知乎公众收藏中的文字内容(视频和图片以链接的形式保存),建议安装pip)

要求

美丽汤

跟谁学视频保存位置

边缘浏览器

Edge webdriver(需要添加环境变量)

请注意,浏览器和 webdriver 版本匹配。

使用说明

首先将项目下载到本地。

Linux和Mac用户需要把源码第22、290行的folder_path文件路径(selenium_get_url函数和save_html函数)改成你想要的路径,注意不要去掉r'',把路径换成引号就好了。如果需要,还可以在打印提示中更改保存路径的内容在第 417 和 441 行(主程序),注意使用两个斜杠 \\ 来表示 \。

如果要使用其他浏览器,例如火狐浏览器,需要将第16、17行(即导入行)中的“edge”改为“firefox”,并在第72行(selenium_get_url函数)中将“edge”改为“ Firefox”,注意大写。Chrome 和 Safari 也是如此。对应的webdriver下载链接在Drivers

修改完成后,右键ZhihuCollection.py - 打开方法 - Python,然后按照程序中的说明进行操作即可。首先是输入知乎公众收藏的地址。注意需要输入第一页的URL,没有?page=1这个词。然后,第一次运行需要输入浏览器主程序和webdriver的路径。注意这两个区别。如果输入反了,则输入起始页和结束页,等待爬取完成。

如果显示乱码,请下载安装VS Code并安装Python和Code Runner扩展,然后在VS Code中运行程序(可以自己尝试其他编辑器)。对于 Windows 用户,打开控制面板 - 时钟和区域 - 更改数据、时间或数字格式 - 管理 - 将非 Unicode 程序的语言更改为简体中文 - 重新启动计算机。

已知的问题

1.知乎改版后,内容无法爬取。可以先查看知乎上的值和程序中第262行和第281行class的值不一样(get_content_detail函数) RichText ztext CopyrightRichText-richText css-14bz7qe(方法在后面),如果不一样就改, 更改时注意不要去掉引号,只需更改引号内的内容即可。

如果更改值,请先打开收藏夹的 URL,然后选择答案的内容。

跟谁学视频保存位置

右键-Inspect(中文名字好像叫检查元素)

跟谁学视频保存位置

注意蓝色内容

跟谁学视频保存位置

点击打开

跟谁学视频保存位置

第一个标签中class的值是改变后的值。右键单击以复制它。RichText ztext CopyrightRichText-richText css-不变,后面的字符串变了。

2.运行多次后,会莫名其妙地import from tkinter.ttk import Progressbar,这会导致Selenium无法正常工作,表现为错误爬出的最大页面数或无法爬出的内容量被抓取。这时候在文件开头的导入处删除就行了。

写给想从零基础开始自学Python爬虫的人

推荐大家自己学写Python爬虫的原因有很多。比如知乎大规模改版,那项目应该没用了,我估计那个时候我已经停止维护项目了;或者你想爬知乎。最后一个用户下的所有答案,或者你想爬取其他网站的内容……这些可能需要你自己写一个爬虫。

选择Python编写爬虫的原因之一是因为它的语法比较简单,另外一个是因为有很多现成的库,可以直接调用。

跟谁学视频保存位置

从头开始,每天2到3个小时,大概一个半月到两个月,可以写一个300行左右的简单爬虫。(不包括书中的练习)

这是关于基本 Python 语法和爬虫知识的两本书和章节。如果需要,您可以阅读其他章节。

本文写于 2022 年 4 月,如果你看时间长了,书中可能有很多错误(比如写这篇文章时第二本书第 11 章提到的 PhantomJS 浏览器)。Selenium 不再支持),那么你可以看看这两本书有没有新版,然后再决定是买这两本书的新版还是文章中提到的第二版(如果没有新版)版)或其他书籍。.

1. PYTHON 速成课程,第 2 版,基于项目的实践编程介绍跟谁学视频保存位置,作者 Eric Matthes,No Starch Press。中文翻译版:《Python编程从入门到实践第2版》,人民邮电出版社,第2-10章,介绍了Python的基本语法。

2. Web Scraping with Python,第二版,从现代 Web 收集更多数据,作者:O'Reilly Media 的 Ryan Mitchell。中文译文:《Python网络爬虫权威指南第2版》,人民邮电出版社,第1、2、10、11章,BeautifulSoup、Requests、Selenium部分。

有问题可以在bing上搜索,有条件的可以google。如果不能用中文搜索,就不能用英文。应该可以解决大部分问题。如果找不到,请尝试在 stackoverflow 上询问。

这里是一个函数,使用前面提到的例子

跟谁学视频保存位置

<span class="RichText ztext CopyrightRichText-richText css-14bz7qe" options="[object Object]" itemprop="text">span>

这里的span是标签(label),=左侧的类是属性(attribute),=右侧是属性的值(value)。你可以使用 BeautifulSoup 中的 find 函数来定位这个标签。格式为:

.find('tag', {'attribute':'value'})

这个例子是:

.find('span', {'class':'RichText ztext CopyrightRichText-richText css-14bz7qe'})

注意定位前使用view source查看页面源代码或打印页面源代码,并确保有你要定位的标签,否则会显示找不到元素。

定位后跟谁学视频保存位置,可以使用get_text()或者get("attribute")来获取里面的文字或者获取某个属性的值,即:

.find('span', {'class':'RichText ztext CopyrightRichText-richText css-14bz7qe'}).get_text()

.find('span', {'class':'RichText ztext CopyrightRichText-richText css-14bz7qe'}).get("attribute")

如果使用 Requests 无法获取,可能是定位元素是 Javascript 或 CSS。这里需要使用 Selenium 获取内容,然后通过 find 函数定位。

注意页面中可能还有其他标签、属性和值与你要定位的标签相同,所以需要通过其他属性来定位。

另外,如果有需要模拟点击的地方,比如知乎收藏页面的“阅读全文”,可以使用Selenium中的click()方法,但是需要通过By来定位Selenium 中的方法。

最后说一下robots.txt跟谁学视频保存位置,如果一个网站的URL是

https://websites.com

, 后面加上 /robots.txt 即可

https://websites.com/robots.txt

, 爬取速度有限制,建议遵守这些限制,以免给服务器造成过大负担。

本文由佚名发布,不代表英语口语培训班_英语培训机构排名 - 学好英语立场,转载联系作者并注明出处:/cygs/6288.html

联系我们

在线咨询:点击这里给我发消息

微信号:weixin888

工作日:9:30-18:30,节假日休息