1.从知乎话题入手,避免登录
从话题入手,避免知乎登录,比如我们需要的是“心理学”话题数据,只要输入网址
https://www.zhihu.com/topic/19551432/top-answers,就能进入,阅读话题,而不需要登录知乎。
2.话题界面研究
进入话题,看到下图所示界面。我们需要爬取的是,“心理学”话题的所有多层子话题、所有精华内容的题目、详细内容、以及所有标签
注意,页面只展示了部分子话题,需要全部,还需登录。
在Chrome浏览器中,在想了解的页面或段落上右键,点击“检查”,使用开发者工具,可以了解页面结构。
我们首先想要爬取展示的所有子话题,所以,要了解子话题的网页地址在哪,以及名称在哪。这里选中元素——点击右键——copy——Xpath,可以直接使用xpath来找到页面元素,准则为“先抓大,后抓小,寻找循环点”。
也可以自己构造xpath语句。
通过分析可知,所有的a(子话题)都在
网址都在herf中,名称都在div中
3.正式爬虫获取子话题
def topic_select(url):
topics=DataFrame(list(topic.find()))['key'] #mongodb数据库的存储内容,可以不使用
driver = webdriver.PhantomJS()
driver.get(url) #url就是https://www.zhihu.com/topic/19551432/top-answers
#//*[@id="root"]/div/main/div/div[2]/div/div/div/div[2]/div
#//*[@id="root"]/div/main/div/div[2]/div/div/div/div[2]/div/div[2]/div[2]/a[1]
infos = driver.find_elements_by_xpath('//*[@class="Card-section"]/div[2]/div[2]/a')
for info in infos:
url_c=info.get_attribute('href') #子话题网址
key=info.find_element_by_xpath('div/div/div/span').text #子话题名称
#topic.update({'key':key},{'$set':{"url":url}})
if key not in str(topics): #防止重复
topic.insert_one({'key':key,'url':url})
try:
topic_select(url_c) #循环,获取所有层次的子话题
except:
pass
driver.quit()
未完待续