Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

rayzgithub/ZhiHuSpider

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

31 Commits

Repository files navigation

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程序接管爬虫

About

自写爬虫爬取知乎问题及回答

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

AltStyle によって変換されたページ (->オリジナル) /