0

0

对知乎内容使用爬虫爬取数据,为什么会遇到403问题?

php中文网

php中文网

发布时间:2016-08-17 10:01:25

|

4717人浏览过

|

来源于php中文网

原创

我想抓取知乎上用户的关注信息,如查看a关注了哪些人,通过www.zhihu.com/people/xxx/followees这个页面来获得followee的列表,但是在抓取中遇到了403问题。
1.爬虫仅仅是为了搜集用户关注信息,用于学术研究,绝非商业或其他目的
2.使用php,利用curl构造请求,使用simple_html_dom来解析文档
3.在用户的关注者(followees)列表,应该是使用ajax进行动态加载更多的followees,于是我想直接爬接口的数据,通过firebug查看到,加载更多的关注者似乎是通过zhihu.com/node/profilef 进行的,并且post的数据有_xsrf,method,parmas,于是我在模拟保持登录的情况下,对这个链接提交请求,并带有post过去的所需要的参数,但是返回的是403。
4.但是我同样模拟登录的情况下,可以解析到如赞同数、感谢数这些不需要ajax的数据
5.我使用curl_setopt($ch, curlopt_httpheader, $header );来设置请求头,使其与我在浏览器中提交的请求的请求头一致,但是这样任然导致403错误
6.我尝试打印出curl的请求头与浏览器发出的请求头进行比较,但是没有找到正确的方式(百度出的curl_getinfo()似乎打印出的相应报文)
7.有许多人曾因为没有设置user-agent或者x-requested-with遭遇403,但是我在5中描述设置请求头时都设置了
8.如果叙述不详需要贴出代码,我可以贴出代码
9.这个爬虫是我毕设的一部分,需要获取数据来进行接下来的工作,如1所说,爬取数据纯粹是为了学术研究

AI脑图
AI脑图

AI一键生成思维导图

下载

回复内容:

如果带有防火墙功能的服务器,连续抓取可能被干掉,除非你有很多代理服务器。或者最简单用adsl不断重新拨号更换ip 你先找个浏览器,研究一下request的HTTP Header再来抓 这两天刚好做了一个抓取用户的关注着和追随者的的爬虫在抓数据,使用的是Python。这里给你一段python的代码,你可以对着代码看一下你的代码问题。
403应该就是请求的时候一些数据发错了,下面的代码中涉及到一个打开的文本,文本中的内容是用户的id,文本里面的内容样式我截了图放在最后面。

#encoding=utf8
import urllib2
import json
import requests
from bs4 import BeautifulSoup

Default_Header = {'X-Requested-With': 'XMLHttpRequest',
                  'Referer': 'http://www.zhihu.com',
                  'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; '
                                'rv:39.0) Gecko/20100101 Firefox/39.0',
                  'Host': 'www.zhihu.com'}
_session = requests.session()
_session.headers.update(Default_Header) 
resourceFile = open('/root/Desktop/UserId.text','r')
resourceLines = resourceFile.readlines()
resultFollowerFile = open('/root/Desktop/userIdFollowees.text','a+')
resultFolloweeFile = open('/root/Desktop/userIdFollowers.text','a+')

BASE_URL = 'https://www.zhihu.com/'
CAPTURE_URL = BASE_URL+'captcha.gif?r=1466595391805&type=login'
PHONE_LOGIN = BASE_URL + 'login/phone_num'

def login():
    '''登录知乎'''
    username = ''#用户名
    password = ''#密码,注意我这里用的是手机号登录,用邮箱登录需要改一下下面登录地址
    cap_content = urllib2.urlopen(CAPTURE_URL).read()
    cap_file = open('/root/Desktop/cap.gif','wb')
    cap_file.write(cap_content)
    cap_file.close()
    captcha = raw_input('capture:')
    data = {"phone_num":username,"password":password,"captcha":captcha}
    r = _session.post(PHONE_LOGIN, data)
    print (r.json())['msg']
    
def readFollowerNumbers(followerId,followType):
    '''读取每一位用户的关注者和追随者,根据type进行判断'''
    print followerId
    personUrl = 'https://www.zhihu.com/people/' + followerId.strip('\n')
    xsrf =getXsrf()
    hash_id = getHashId(personUrl)
    headers = dict(Default_Header)
    headers['Referer']= personUrl + '/follow'+followType
    followerUrl = 'https://www.zhihu.com/node/ProfileFollow'+followType+'ListV2'
    params = {"offset":0,"order_by":"created","hash_id":hash_id}
    params_encode = json.dumps(params)
    data = {"method":"next","params":params_encode,'_xsrf':xsrf}
    
    signIndex = 20
    offset = 0
    while signIndex == 20:
        params['offset'] = offset
        data['params'] = json.dumps(params)
        followerUrlJSON = _session.post(followerUrl,data=data,headers = headers)
        signIndex = len((followerUrlJSON.json())['msg'])
        offset = offset + signIndex
        followerHtml =  (followerUrlJSON.json())['msg']
        for everHtml in followerHtml:
            everHtmlSoup = BeautifulSoup(everHtml)
            personId =  everHtmlSoup.a['href']
            resultFollowerFile.write(personId+'\n')
            print personId
            
    
def getXsrf():
    '''获取用户的xsrf这个是当前用户的'''
    soup = BeautifulSoup(_session.get(BASE_URL).content)
    _xsrf = soup.find('input',attrs={'name':'_xsrf'})['value']
    return _xsrf
    
def getHashId(personUrl):
    '''这个是需要抓取的用户的hashid,不是当前登录用户的hashid'''
    soup = BeautifulSoup(_session.get(personUrl).content)
    hashIdText = soup.find('script', attrs={'data-name': 'current_people'})
    return json.loads(hashIdText.text)[3]

def main():
    login()
    followType = input('请配置抓取类别:0-抓取关注了谁 其它-被哪些人关注')
    followType = 'ees' if followType == 0 else 'ers'
    for followerId in resourceLines:
        try:
            readFollowerNumbers(followerId,followType)
            resultFollowerFile.flush()
        except:
            pass
   
if __name__=='__main__':
    main()
无非就是那些, useragent,referer,token,cookie 觉得可能会是 2 个原因造成的:
  1. 没带 cookies
  2. _xsrf 或 hash_id 错误
这个问题我来回答下吧,知乎在“_xsrf”这个字段搞了个小动作,并不是首页页面取到的那个_xsrf 的值,而是在登录成功后通过cookie返回的那个“_xsrf ”的值,所以你需要获取正确的这个值,不然一直会报403错误(我是在Post提问时发现的,相信你遇到的问题类似,直接上代码):

///
/// 知乎提问
///

/// 提问标题
/// 详细内容
/// 登录后获取的cookie
public void ZhiHuFaTie(string question_title,string question_detail,CookieContainer cookie)
{
question_title=“提问内容”;
question_detail=“问题详细描述”;

//遍历cookie,获取_xsrf 的值
var list = GetAllCookies(cookie);
foreach (var item in list)
{
if (item.Name == "_xsrf")
{
xsrf = item.Value;
break;
}
}
//发帖
var FaTiePostUrl = "zhihu.com/question/add";
var dd = topicStr.ToCharArray();
var FaTiePostStr = "question_title=" + HttpUtility.UrlEncode(question_title) + "&question_detail=" + HttpUtility.UrlEncode(question_detail) + "&anon=0&topic_ids=" + topicId + "&new_topics=&_xsrf="+xsrf;
var FaTieResult = nhp.PostResultHtml(FaTiePostUrl, cookie, "http://www.zhihu.com/", FaTiePostStr);
}


///
/// 遍历CookieContainer
///

///
///
public static List GetAllCookies(CookieContainer cc)
{
List lstCookies = new List();

Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField |
System.Reflection.BindingFlags.Instance, null, cc, new object[] { });

foreach (object pathList in table.Values)
{
SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField
| System.Reflection.BindingFlags.Instance, null, pathList, new object[] { });
foreach (CookieCollection colCookies in lstCookieCol.Values)
foreach (Cookie c in colCookies) lstCookies.Add(c);
}
return lstCookies;
} 修改header的X-Forwarded-For字段伪装ip 真的是很巧,昨天晚上刚刚遇到了这个问题。原因可能有有很多,我只说自己遇到的,仅供参考,提供一种思路。我爬取的是新浪微博,使用了代理。出现403是因为访问时网站拒绝,我在浏览器上操作也是一样,随便看里面几个网页就会出现403,不过刷新几次就好了。在代码中实现就是多请求几次。 看了楼上的答案,瞬间被镇住了。大牛真多,不过我建议题主去问问李开复好了~哈哈 话说接口是怎么抓到的...为何我用firebug抓不到接口..chrome的network也抓不到接口
话说直接请求followees也可以直接获取到,剩下的也就是正则了

相关文章

知乎
知乎

知乎app是广大用户朋友们常用的问答工具,集搜索、问答、社交等服务功能为一体,超多内容随你阅读观看,让你发现更多精彩。有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

616

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

194

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

91

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

54

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

598

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

56

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP使用CURL抓取页面
PHP使用CURL抓取页面

共4课时 | 2.9万人学习

前端最全HTTP基础原理及应用
前端最全HTTP基础原理及应用

共12课时 | 1.8万人学习

Swoft2.x速学之http api篇课程
Swoft2.x速学之http api篇课程

共16课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号