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

8a65a37fca96452d77c8202b69533122.png

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.

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

275202bd5eafa9b40fbfc25fb65de432.png

听朋友说八爪鱼这款软件挺好用的,想着瞅一下看看。

96f4468eff9da45a443942a9c9baf3dc.png

然而然而!!!

8c59e895bd25efdbeae66d157208b69f.png

看到这里我们郁闷了,旗舰版???

c658182e30788a973fbdc64feab66cd1.png

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

6cf6055ea98bbabe7a31abaf47ebc8d2.png

@八爪鱼采集器
@刘宝强

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

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

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

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

af76000f5ebbe5fd8d11bc09e0f15a40.png

8d544a50458f28c2d89905fb64d8c109.png


导包

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)

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

让浏览器模拟人去点击“显示全部”,进而得到问题全部的描述

7c0383b994aa241f46d42602d8f521da.png

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

eb45b5dc4c029a436f20cbf961f945df.png
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)

同时考虑到会有这个登陆弹窗出现:

7bf6c1ddfb26817cc258ea85df51d388.png


所以我们模拟人去点那个X

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

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

1e41bd0c1a083216b1892793118be8c5.png

我们可以用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。

b51ce6091e56ab416ed16e0587e60e81.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值