# ZhiHuSpider **Repository Path**: yangwulve/ZhiHuSpider ## Basic Information - **Project Name**: ZhiHuSpider - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-03-24 - **Last Updated**: 2022-03-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ZhiHuSpider 自写爬虫爬取知乎问题及回答 for python v 3.7 安装说明 一、安装scrapy 1、安装wheel pip install wheel 2、安装lxml https://pypi.python.org/pypi/lxml/4.1.0 3、安装pyopenssl https://pypi.python.org/pypi/pyOpenSSL/17.5.0 4、安装Twisted https://www.lfd.uci.edu/~gohlke/pythonlibs/ 5、安装pywin32 https://sourceforge.net/projects/pywin32/files/ 6、安装scrapy pip install scrapy 二、安装其它依赖 pip install pyquery pip install pymysql pip install selenium 三、运行 cd ZhihuSpider/zhihu scrapy crawl zhihu --nolog 四、mysql表结构 问题及答案存储表 CREATE TABLE `zhihu_question` ( `id` int(11) NOT NULL AUTO_INCREMENT, `question_id` int(11) NOT NULL, `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL, `url` varchar(255) DEFAULT NULL, `keywords` varchar(255) DEFAULT NULL, `answer_count` int(255) DEFAULT NULL, `flower_count` int(255) DEFAULT NULL, `comment_count` int(255) DEFAULT NULL, `date_created` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=210 DEFAULT CHARSET=utf8; CREATE TABLE `zhihu_answer` ( `id` int(11) NOT NULL AUTO_INCREMENT, `question_id` int(11) DEFAULT NULL, `answer_id` int(11) DEFAULT NULL, `author` varchar(255) DEFAULT NULL, `ans_url` varchar(255) DEFAULT NULL, `upvote_count` int(11) DEFAULT NULL, `comment_count` int(11) DEFAULT NULL, `excerpt` text CHARACTER SET utf8mb4, `content` text CHARACTER SET utf8mb4, `is_post` tinyint(1) DEFAULT '0' COMMENT '0未发表 1 已发表', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5697 DEFAULT CHARSET=utf8; 备注: 下载chrome版本对应的chromedriver http://npm.taobao.org/mirrors/chromedriver/ 放置于 F:\chromedriver\chromedriver.exe 常用库下载:https://www.lfd.uci.edu/~gohlke/pythonlibs 破解知乎加密方式的尝试: 这几天卡在破解知乎的加密上,昨天终于把这个地方卡过去了 ^_^!! 累 总共试了以下n种方式 1、首先放弃把知乎的js加密函数通过python实现一遍,因为js代码都经过了混淆工具混淆,很难还原,直接放弃 2、使用网上流传比较广的版本,也看到网上很多人推荐的,估计以前这种方法是可以的,即通过 pyexecjs 直接运行js代码,获取加密后的值, 通过简单的修改之后,pyexecjs即可运行此js文件不报错,得到加密后的密文,然而很遗憾的是得到的密文与浏览器上运行的js密文不一致, 经过一天调试无果吗,宣布放弃 3、还是按照执行js脚本的思路,换了一个工具,使用 js2py 来运行js脚本,运行后发现直接报错,运行修改之前的js,发现不支持js中的 atob 函数,改成node版本的buff后,发现也不支持,宣告放弃 4、使用selenium,使用谷歌助手打开本地网页文件的方式,获取js中的返回值,和2中一样,可以得到结果,但是chromedriver始终获取的 结果与chrome不一致,本来以为是chromedriver只有32位版本的缘故,换用geckoxdriver(firefox) 64位版本重试,发现也是始终与 直接通过firefox打开的结果不一致,放弃 5、沿着4的思路,寻找直接调用浏览器的方法,使用webbrowser直接调用浏览器,然而很遗憾,这个api只提供打开网页,不能获取返回值, 放弃 6、返回使用selenium,发现直接通过chromedriver访问知乎网站也是不能登录的,即不是程序原因,而是知乎对driver做了限制,经过查 找资料发现,通过driver打开的浏览器全局对象navigator会多一个属性webdriver的属性值,坑!网上的解决办法是在js中修改navigator 的webdriver属性值,我相信这种办法之前是奏效的,因为很多人都有提到这种办法,Object.defineProperty(navigator, 'webdriver' , {get: () => undefined})); 很不幸的是这种方法已经不奏效的,大概是之前的判断条件是 navigator.webdriver != undefined 现在是 'webdriver' in navigator,也就是说不管把这个值修改成undefined或者是false或者是null,都没有用了,in条件是都成 立的,奈何本人js造诣太低,试了很多种办法都没办法重置这个内置对象navigator,然而原因是已经找到了,通过不断的百度,终于找到了 解决方法,在调用selenium时候,加上几句代码即可以了(这里不得不吐槽一下,百度千篇一律的答案都是没有用的,真正有用的这个答案我是翻 了七八页翻到的,逐条查看真是绝望!!!) 至此终于把这个加密搞定了,后续可能打算把整个程序改一下,改成selenium直接调用知乎页面,登录之后再由python程序接管爬虫