如何批量爬取知乎用户信息

首先声明,这次爬虫只做为测试使用。拿知乎练练手而已,不会做为其它用途。

正文开始,假如我要拿到用户如下的信息。

通过request请求其实还是比较容易的。直接 request.get 用户主页url 。返回的源码里面就有用户的详细资料信息,内容均到JavaScript代码里面。如下图。
在这里插入图片描述

通过正则表达式就能轻易的得到了。
在这里插入图片描述

问题来了,如何批量获取知乎用户呢?

我们第一反应肯定是,通过一个页面里面存在的其它用户的主页地址来获取多个页面。这样下去就能批量获取了。通过关注者或者被关注者?

在这里插入图片描述

想法是很好的,但是我发现 请求 被关注者信息的request请求头里面有一个参数,一直都是随机的。需要逆向分析js代码,找到规律,才能成功提交。但是这是很难的(至少我不会)

知乎在反爬方面做得好就是在这里。之前还是没有的。

下面到了解决问题的方案。
我采用的是selenium,我们第一反应肯定是,控制浏览器直接获取页面来得到关注者或者被关注者的信息。

但是你在知乎未登录的情况下,用selenium页面上根本就没有其它用户的信息。
在这里插入图片描述

回答里面没有,提问,文章,专栏想法,全部都是为空(因为知乎检测到了你是测试浏览器)。最后只能从动态入手。

有了这个想法,我写出了如下代码。

from concurrent.futures.thread import ThreadPoolExecutor
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import Chrome
from lxml import etree


opt=Options()
opt.add_argument("--headless")
wait_data = set()
old_data=set()



#获取新的url
def get_moreUrl(url):
    web = Chrome("D:\chromedriver.exe", options=opt)
    web.get(url)
    html = etree.HTML(web.page_source)
    web.close()
    divs=html.xpath('//*[@id="Profile-activities"]/div[2]/div')
    for div in divs:
        href=div.xpath('./div[2]/div/div[1]/div[1]/div/div/div[1]/span/div/div/a/@href')
        if href :
            new_href = "https:" + href[0]
            if not old_data.__contains__(new_href):
                wait_data.add(new_href)
                print(new_href)  
 
#获取页面详细信息
def get_data(url):
    web = Chrome("D:\chromedriver.exe", options=opt)
    web.get(url)
    web.find_element_by_xpath("/html/body/div[4]/div/div/div/div[2]/button").click()
    html = etree.HTML(web.page_source)
    name=html.xpath('//*[@id="ProfileHeader"]/div/div[2]/div/div[2]/div[1]/h1/span/text()')[0]
    num = html.xpath('//*[@id="root"]/div/main/div/meta[6]/@content')[0]
    answer_num=html.xpath('//*[@id="root"]/div/div[2]/header/div[2]/div/div/ul/li[2]/a/span/text()')[0]
    agree_num=html.xpath('//*[@id="root"]/div/main/div/meta[4]/@content')[0]
    like_num=html.xpath('//*[@id="root"]/div/main/div/meta[5]/@content')[0]
    web.close()
    list=[url,name,num,answer_num,agree_num,like_num]
    print(list)

if __name__ == '__main__':
    
    wait_data.add("https://www.zhihu.com/people/system-out-99")
    with ThreadPoolExecutor(10) as t:
        while True:
            if wait_data.__len__()>0:
                url = wait_data.pop()
                old_data.add(url)
                t.submit(get_moreUrl,url)
                t.sumbmit(get_data,url)
               

其实代码并不难,我觉得这个思路过程还是最重要的。虽然selenium效率并不高。但是加上线程池效率也是很客观了。1分钟几十条还是可行叭。

如果有大佬在代码上能有什么提高效率的建议。欢迎和我交流一下。

最后我的公众号: 爬虫代写

欢迎关注。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python 模拟爬虫抓取知乎用户信息以及人际拓扑关系,使用scrapy爬虫框架,数据存储使用mongo数据库。   本地运行请注意:爬虫依赖mongo和rabbitmq,因此这两个服务必须正常运行和配置。为了加快下载效率,图片下载是异步任务,因此在启动爬虫进程执行需要启动异步worker,启动方式是进入zhihu_spider/zhihu目录后执行下面命令:   celery -A zhihu.tools.async worker --loglevel=info   爬虫项目部署:   进入zhihu_spider后执行```docker-compose up``` ,进入container后和本地运行方法相同,依次启动mongo、rabbitmq、异步任务、爬虫进程即可。   其它需要说明的问题:   爬虫框架从start\_requests开始执行,此部分会提交知乎主页的访问请求给引擎,并设置回调函数为post_login.   post\_login解析主页获取\_xsrf保存为成员变量中,并提交登陆的POST请求,设置回调函数为after\_login.   after\_login拿到登陆后的cookie,提交一个start\_url的GET请求给爬虫引擎,设置回调函数parse\_people.   parse\_people解析个人主页,一次提交关注人和粉丝列表页面到爬虫引擎,回调函数是parse\_follow, 并把解析好的个人数据提交爬虫引擎写入mongo。   parse\_follow会解析用户列表,同时把动态的人员列表POST请求发送只引擎,回调函数是parse\_post\_follow,把解析好的用户主页链接请求也发送到引擎,人员关系写入mongo。   parse\_post\_follow单纯解析用户列表,提交用户主页请求至引擎。
要使用Python爬取知乎用户信息,你可以按照以下步骤进行操作: 1. 安装必要的库:使用`pip`命令安装`requests`和`beautifulsoup4`库。 2. 发送请求获取页面:使用`requests`库发送HTTP请求,获取知乎用户信息页面的HTML内容。 3. 解析页面内容:使用`beautifulsoup4`库解析页面内容,提取所需的用户信息。 下面是一个简单的示例代码,展示如何爬取知乎用户信息: ```python import requests from bs4 import BeautifulSoup def get_user_info(user_url): # 发送请求获取页面内容 response = requests.get(user_url) html_content = response.text # 解析页面内容 soup = BeautifulSoup(html_content, 'html.parser') user_name = soup.select_one('.ProfileHeader-name').text.strip() user_bio = soup.select_one('.ProfileHeader-headline').text.strip() user_location = soup.select_one('.ProfileHeader-infoItem.ProfileHeader-location').text.strip() # 返回用户信息 return { 'name': user_name, 'bio': user_bio, 'location': user_location } # 示例:爬取知乎用户「知乎小助手」的信息 user_url = 'https://www.zhihu.com/people/zhihuassistant' user_info = get_user_info(user_url) print(user_info) ``` 请注意,该示例仅爬取了用户的名称、个人简介和所在地信息。你可以根据自己的需求修改代码,提取其他感兴趣的用户信息。此外,为了遵守网站的使用规则,请确保在爬取数据时尊重知乎的限制,并遵守相关的法律法规。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小梁说代码

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值