知乎话题爬虫干货

1. 多进程

当爬虫的数据量越来越大时,除需要考虑存储方式外,还需考虑爬虫时的速度问题。串行爬取只有当一次爬取完之后才可进行下一次爬取,极大地限制了爬取的速度和效率。
当计算机运行程序时,会创建进程,包含代码和状态。而计算机的一个或多个CPU将会执行这些进程。同一时刻每个CPU只会执行一个进程,然后在不同进程之间快速切换。在一个进程中,程序的执行也是在不同线程之间进行切换的,每个线程将会执行程序的不同部分。
Python进行多进程爬虫使用了multiprocessing库,利用进程池进行多进程爬虫。多进程爬虫速度要远优于串行爬虫。

2. 代码

#多进程运行
def now_run(num,func,list_u):
    try:
        start=time.time()
        pool=Pool(processes=num)
        pool.map(func,list_u)
        end=time.time()
        print("共用时",end-start)
    except:
        pass

num:进程个数,一般为4
func:需要运行的函数,例如前几个博客的爬虫页面函数
list_u::需要爬虫的网页

3. 相关博客

3.1 子话题网页爬取

第一篇爬虫博客,爬取“心理学”话题的所有层次的子话题网址、以及名称
地址:https://blog.csdn.net/qq_35159009/article/details/90516414

3.2 话题页面动态加载,模拟下滚

知乎界面采用动态加载技术,只有浏览器下滚,才能刷新出数据
第二篇爬虫博客,利用Selenium与PhantomJS模拟浏览器下滚
地址:https://blog.csdn.net/qq_35159009/article/details/90522384

3.3 进入内容页面爬虫

爬取知乎内容页面的标题、标签、以及文本内容(模拟点击事件)
地址:https://blog.csdn.net/qq_35159009/article/details/90522910

4. 运行注意事项

一定保存.py文件,然后在相应文件夹下,shift+右键,选择运行命令行窗口,
输入 python 文件名称.py
这样才不会弹出弹窗,不然烦不胜烦
不要直接用编译器运行

爬虫全部代码

from selenium import webdriver
import time
import pymongo
import pandas as pd
from pandas import Series,DataFrame
from multiprocessing import Pool
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
client = pymongo.MongoClient('localhost',27017)
mydb=client['zhihu_100000']
psy=mydb['psy']
cont=mydb['cont']
topic=mydb['topic']

url_root=['https://www.zhihu.com/topic/19642170/top-answers',#心理现象
          'https://www.zhihu.com/topic/19562796/top-answers',#人格
          'https://www.zhihu.com/topic/19556937/top-answers',#情绪
          'https://www.zhihu.com/topic/19615158/top-answers',#心理阴影
          'https://www.zhihu.com/topic/19568143/top-answers',#心理健康
          'https://www.zhihu.com/topic/19554945/top-answers',#心理
          'https://www.zhihu.com/topic/19676436/top-answers',#心理分析
          'https://www.zhihu.com/topic/19551432/top-answers',#心理学
          'https://www.zhihu.com/topic/19566667/top-answers',#社会心理       
          'https://www.zhihu.com/topic/19764326/top-answers'#心理状态
          ]

topic.insert_one({'key':'心理现象','url':url_root[0]})
topic.insert_one({'key':'人格','url':url_root[1]})
topic.insert_one({'key':'情绪','url':url_root[2]})
topic.insert_one({'key':'心理阴影','url':url_root[3]})
topic.insert_one({'key':'心理健康','url':url_root[4]})
topic.insert_one({'key':'心理','url':url_root[5]})
topic.insert_one({'key':'心理分析','url':url_root[6]})
topic.insert_one({'key':'心理学','url':url_root[7]})
topic.insert_one({'key':'社会心理','url':url_root[8]})

#界面下滚
def scroll_foot(driver):
    if driver.name == "chrome" or driver.name == 'phantomjs':
       js = "var q=document.body.scrollTop=100000"
    elif driver.name == 'internet explorer':
       js = "var q=document.documentElement.scrollTop=100000"
    return driver.execute_script(js)
#获取topic
def topic_select(url):
    #class="TopicLink TopicTag"
    topics=DataFrame(list(topic.find()))['key']
    driver = webdriver.PhantomJS()
    driver.get(url)
    #//*[@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()
#获取子页面网址   
def get_info(url):
    driver = webdriver.PhantomJS()
    #driver.keep_alive = False
    driver.get(url)
    #driver.implicitly_wait(1)
    for i in range(500):
        scroll_foot(driver)
        time.sleep(2)
    #//*[@id="TopicMain"]/div[3]/div/div/div/div[1]
    infos = driver.find_elements_by_xpath('//*[@id="TopicMain"]/div[3]/div/div/div/div')
    for info in infos:
        try:
            #//*[@id="TopicMain"]/div[3]/div/div/div/div[1]/div/h2/div/a
            questions=info.find_elements_by_xpath('div/h2/div/a')
            for question in questions:
                question=question.get_attribute('href')
                #print(question)
                #full_question='https://www.zhihu.com'+question
                #print(full_question)  自动加
                psy.insert_one({'url':question})
                #get_question_info(question)
                driver.close
        except IndexError :
            pass  
    driver.quit()
#获取子页面内容
def get_question_info(url):
    driver = webdriver.PhantomJS()
    #driver.keep_alive = False
    driver.get(url)
    driver.implicitly_wait(1)
    try:
        topic=driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div[1]/div[2]/div[1]/div[1]/h1').text
        #print("题目是",topic)
        try:
            more=driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div[1]/div[2]/div[1]/div[1]/div[2]/div/div/div/button').click()
            #content=driver.find_element_by_xpath('//*[@class="RichText ztext"]').text
            #//*[@id="root"]/div/main/div/div[1]/div[2]/div[1]/div[1]/div[2]/div/div/div/span
            content=driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div[1]/div[2]/div[1]/div[1]/div[2]/div/div/div/span').text
        except:
            try:
                content=driver.find_element_by_xpath('//*[@class="RichText ztext"]').text
            except:
                content='无'
        #print("内容是",content)
        f_label=driver.find_element_by_xpath('//*[@id="root"]/div/main/div/meta[3]').get_attribute('content')
        #print(f_label)
        
        labels=driver.find_elements_by_xpath('//*[@class="Tag QuestionTopic"]')
        label_x=[]
        for label in labels:
            try:
                label_x.append(label.find_element_by_xpath('span/a/div/div').text)
            except IndexError:
                pass
        #print(label_x)
     
        driver.close()
        cont.insert_one({'topic':topic,'content':content,'labels':f_label})
    except :
        pass
    driver.quit()
#多进程运行
def now_run(num,func,list_u):
    try:
        start=time.time()
        pool=Pool(processes=num)
        pool.map(func,list_u)
        end=time.time()
        print("共用时",end-start)
    except:
        pass
def get_true_topic():
    #获取话题
    now_run(4,topic_select,url_root)
    #获取话题网址
    data = DataFrame(list(topic.find()))
    data.pop('_id')
    print(len(data))   #917
    data2=data.drop_duplicates()
    print(len(data2))   #462
    urls_top=list(data2['url'])
    for i in range(len(urls_top)):
        if len(urls_top[i])==36:
           urls_top[i]=urls_top[i]+'/top-answers'
    data2['url']=urls_top
    data2.to_csv('topic.csv')
def get_true_url():
    #获取问题网址
    data = DataFrame(list(psy.find()))
    data.pop('_id')
    print(len(data))   #11939
    data2=data.drop_duplicates()
    print(len(data2))   #3261
    urls_ture=list(data2['url'])
    data2['url']=urls_ture
    data2.to_csv('url2.csv')  
if __name__ == '__main__':
    '''
    #get_true_topic()
    data=pd.read_csv('topic.csv',encoding='gbk')
    urls_top=list(data['url'])
    
    #获取子网页
    now_run(4,get_info,urls_top)
    
    
    get_true_url()
    '''
    data=pd.read_csv('url2.csv',encoding='gbk')
    urls_cont=list(data['url'])
    #获取子网页网址
    
    #获取子网页内容
    now_run(4,get_question_info,urls_cont)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬取知乎网站问题、回答的相关字段信息,问题的标题、内容、发布时间、话题、回答数量、评论数、点击数、关注数等字段,及对该问题回答的内容,作者、点赞数、评论数、回答时间等等字段信息。可用于对社会话题、热点进行数据分析。 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
### 回答1: Python爬虫源代码,是指使用Python编写的用于抓取互联网信息的程序代码。知乎是一个知识问答社区,许多人想要在知乎上抓取数据,因此有许多人编写了Python爬虫源代码用于抓取知乎的内容。 为了编写一个能够抓取知乎内容的Python爬虫,首先需要导入相应的库,例如requests库用于发送HTTP请求、BeautifulSoup库用于解析HTML页面等。然后,需要编写一系列函数来实现抓取知乎内容的具体功能。 首先,需要编写一个发送HTTP请求的函数,用于获取页面的原始HTML代码。利用requests库发送GET请求获取知乎页面的HTML代码。 接下来,需要利用BeautifulSoup库解析HTML代码,提取出需要的数据。可以使用BeautifulSoup提供的各种方法来定位和提取特定的标签、类名或其他属性的内容,如问题的标题、问题的描述、回答的内容等。 然后,可以编写一个保存数据的函数,将抓取到的知乎内容存储到本地文件或数据库中,以便后续的数据处理和分析。 另外,还可以编写一个循环函数,用于自动翻页并抓取更多的数据。通过观察知乎页面的URL结构,可以发现一个规律,根据这个规律来修改URL,实现翻页的功能。 最后,可以编写一个主函数,用于调用各个函数,实现整个爬虫的流程控制。 总结起来,知乎Python爬虫源代码就是用Python编写的用于抓取知乎内容的程序代码。这些代码包括发送HTTP请求、解析HTML页面、提取数据、保存数据以及实现翻页等功能。编写一个高效、稳定的爬虫源代码需要对Python编程基础和相关库的使用有一定的掌握程度,同时还需要了解HTML的基本结构和知乎页面的规律。 ### 回答2: 知乎是一个知识分享社区,而Python爬虫是一种通过编写代码自动从网页上提取信息的技术。因此,知乎的Python爬虫源代码可以理解为使用Python编写的用于从知乎上获取信息的代码。 一般来说,编写知乎爬虫源代码需要以下步骤: 1. 导入所需的库:首先,我们需要导入Python的相应库,比如requests用于发送HTTP请求,BeautifulSoup用于解析网页等。 2. 发送HTTP请求获取网页内容:使用requests库发送HTTP请求,获取知乎网页的内容。 3. 解析网页内容:使用BeautifulSoup库解析网页内容,提取出我们需要的信息。可以通过查看网页源代码确定需要提取的信息所处的位置,并使用相应的标签和属性来进行定位和提取。 4. 存储提取的信息:将提取出的信息存储到合适的数据结构中,比如列表或字典,便于后续的处理和分析。 5. 处理分页:如果需要获取多页的信息,可以编写代码实现自动翻页,继续发送HTTP请求获取下一页的内容,并将提取出的信息追加到之前的数据结构中。 6. 数据持久化:将提取出的信息保存到文件或数据库中,以便后续的使用和分析。 需要注意的是,由于知乎爬虫有一定的限制,我们在编写知乎爬虫时需要遵守相关的法律法规和知乎的使用规则,避免对知乎服务器造成过大的负担或侵犯他人的隐私。同时,为了增加程序的稳定性和可靠性,我们还可以添加异常处理机制,防止因网络问题或网页结构变化导致的程序崩溃。 总之,知乎的Python爬虫源代码主要包括导入库、发送HTTP请求、解析网页内容、存储提取的信息、处理分页和数据持久化等步骤。通过编写这样的代码,我们可以方便地从知乎上获取所需的信息,并进行分析、研究和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值