对标八爪鱼!知乎爬虫集成代码实现!(2020年7月29日)

Author Warning:
The data obtained by crawlers should only be used for academic research.
At the same time, you should pay attention to the crawl frequency, not to cause excessive pressure on other people’s servers.

看知乎这里的各种问题还挺有趣的,心血来潮想研究一下。

在这里插入图片描述

听朋友说八爪鱼这款软件挺好用的,想着瞅一下看看。在这里插入图片描述

然而然而!!!
在这里插入图片描述

看到这里我们郁闷了,旗舰版???
在这里插入图片描述

接着我就去官网瞅了瞅价格,一年1999???

在这里插入图片描述

@八爪鱼采集器
@刘宝强(八爪鱼CEO)

二位大爷,我想想哔哩哔哩会员一年+爱奇艺会员一年+知乎live一年不过585人民币,不到这个的1/3。。。

没有体验版的,对一般群众实在很难说很友好/哭

看了看自己日渐消瘦的钱包,还是自己爬吧!

接下来我将实现八爪鱼上关于知乎爬虫模版的所有功能。

在这里插入图片描述

在这里插入图片描述
导包

import os
import pandas as pd
from selenium import webdriver
from lxml import etree
import time
import jieba
import re
import numpy as np
url1 = input("请输入您所需要爬取的网页(知乎)")

例如我在这里爬取问题(https://www.zhihu.com/question/22164041/answer/148128347)
《排名在前 1% 的高中生是靠天赋还是靠努力?》

browser = webdriver.Chrome("/Users/apple/Downloads/chromedrivermac")  #这里写上你的ChromeDriver的路径
browser.get(url1)

接着就开始模拟爬虫啦~!

让浏览器模拟人去点击“显示全部”,进而得到问题全部的描述
在这里插入图片描述

同时考虑到有些问题本身就比较简短,没有“显示全部”这个按钮,所以使用try-except语句进行规避。

在这里插入图片描述

try:
    #点击问题全部内容
    button1 = browser.find_elements_by_xpath("""//div[@class= "QuestionHeader-detail"]
    //button[contains(@class,"Button") and contains(@class,"QuestionRichText-more") 
    and contains(@class , "Button--plain")
    ]""")[0]
    button1.click()
except:
    print('这个问题比较简单,并没有问题的全部内容哦!')

对于广大的知乎er,都知道知乎是下拉之后才能得到更多的回答的。所以,我接下来就开始模拟人下拉的动作。

#此网页就属于异步加载的情况
#那么我们就需要多次下滑
for i in range(20):
    browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    time.sleep(0.5)
    print(i)

同时考虑到会有这个登陆弹窗出现:
在这里插入图片描述
所以我们模拟人去点那个X

#点掉知乎的登陆弹窗
button2 = browser.find_elements_by_xpath("""//button[@aria-label = '关闭']""")[0]
button2.click()    

点掉之后,我们就可以放心地下滑爬取啦!
不过在这里我们同时还需要考虑何时停止下滑,需要找一个停止的标志,不然一直下滑,会浪费计算机的资源!
我最终找到当所有回答出现后,会出现“写回答”这个按钮,所以我们就以这个为结束的标志!
在这里插入图片描述

我们可以用Xpath定位到这个按钮:

final_end_it = browser.find_elements_by_xpath("""//button[contains(@class,"Button") 
and contains(@class ,'QuestionAnswers-answerButton')
and contains(@class ,'Button--blue')
and contains(@class ,'Button--spread')

接下来就是自由自在爬取的时候啦!

while final_end_it == []:
    final_end_it = browser.find_elements_by_xpath("""//button[contains(@class,"Button") 
and contains(@class ,'QuestionAnswers-answerButton')
and contains(@class ,'Button--blue')

and contains(@class ,'Button--spread')
]""")
    js="var q=document.documentElement.scrollTop=0"  
    browser.execute_script(js)
    for i in range(30):
        browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
        time.sleep(0.5)
        print(i)

直到爬取到最后一条回答才会自动结束。

接下来我们开始从网页中提取我们所需要的数据啦(把八爪鱼知乎模版的所有功能实现!!!)

dom = etree.HTML(browser.page_source)

对于问题本身的数据

Followers_number_first = dom.xpath("""//div[@class="QuestionFollowStatus"]//div[@class = "NumberBoard-itemInner"]/strong/text()""")[0]
Browsed_number_first = dom.xpath("""//div[@class="QuestionFollowStatus"]//div[@class = "NumberBoard-itemInner"]/strong/text()""")[1]


#关注者数量
Followers_number_final = re.sub(",","",Followers_number_first)
#浏览数量
Browsed_number_final = re.sub(",","",Browsed_number_first)


#问题链接
problem_url =  url1

#问题ID

problem_id = re.findall(r"\d+\.?\d*",url1)

#问题标题
problem_title =  dom.xpath("""//div[@class = 'QuestionHeader']//h1[@class = "QuestionHeader-title"]/text()""")

#问题点赞数
problem_endorse = dom.xpath("""//div[@class = 'QuestionHeader']//div[@class = "GoodQuestionAction"]/button/text()""")
#问题评论数
problem_Comment = dom.xpath("""//div[@class = 'QuestionHeader']//div[@class = "QuestionHeader-Comment"]/button/text()""")

#问题回答数
answer_number = dom.xpath("""//div[@class = 'Question-main']//h4[@class = "List-headerText"]/span/text()""")

#问题标签
problem_tags_list = dom.xpath("""//div[@class = 'QuestionHeader-topics']//a[@class = "TopicLink"]/div/div/text()""")

对于回答本身的数据

#具体内容
comment_list = dom.xpath("""//div[@class = 'List-item']//div[@class = "RichContent-inner"]""")
comment_list_text = []
for comment in comment_list:
    comment_list_text.append(comment.xpath("string(.)"))
    
#发表时间

time_list = dom.xpath("""//div[@class = 'List-item']//div[@class = "ContentItem-time"]//span/@data-tooltip""")

edit_time_list = dom.xpath("""//div[@class = 'List-item']//div[@class = "ContentItem-time"]//span/text()""")


#点赞数

endorse_list = dom.xpath("""//div[@class = 'List-item']//button[contains(@class,"Button") and contains(@class,"VoteButton") and contains(@class , "VoteButton--up")]/@aria-label""")
#评论人数
number_of_endorse_list = dom.xpath("""//div[@class = 'List-item']//svg[contains(@class,"Zi")   and contains(@class,"Zi--Comment") 
and contains(@class,"Button-zi")]/../../text()""")




#回答链接
answers_url_list = dom.xpath("""//div[@class = 'List-item']//div[contains(@class,"ContentItem") and contains(@class,"AnswerItem")]
/meta[@itemprop = "url"]/@content""")


authors_list = dom.xpath("""//div[@class = 'List-item']//div[contains(@class,"ContentItem") and contains(@class,"AnswerItem")]
/@data-zop""")

#作者姓名
authorName_list = []
#作者id
authorid_list = []
for i in authors_list:
    authorName_list.append(eval(i)['authorName'])
    authorid_list.append(eval(i)["itemId"])
接下来合成数据框:
data = pd.DataFrame()

data['具体内容'] = comment_list_text
data["发表时间"] = time_list
data["点赞数"] = endorse_list
data["评论人数"] = number_of_endorse_list
data["回答链接"] = answers_url_list
data["作者姓名"]  = authorName_list
data['作者id'] = authorid_list


data["关注者数量"] = Followers_number_final
data["浏览数量"] = Browsed_number_final
data["问题链接"] = problem_url
data["问题ID"]  = problem_id[0]
data["问题标题"] = problem_title[0]
data["问题点赞数"] = problem_endorse[0]
data["问题评论数"] = problem_Comment[0]
data["问题回答数"] = answer_number[0]
data["问题标签"] = "&".join(problem_tags_list)

这里简单看一下data。
在这里插入图片描述

到这里爬取数据的工作就结束啦!我们成功实现了八爪鱼知乎模版的所有功能!哈哈哈~~~
有问题的朋友可以私信我哦~~~

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页