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

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

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

通过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爬取知乎用户信息,你可以按照以下步骤进行操作: 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、付费专栏及课程。

余额充值