首先,需要理解cookies的含义,是存储在浏览器中的内容,在本地存储任意键值对,第一次访问时服务器返回一个id存储到本地cookie中,第二次访问将cookies一起发送到服务器中

常见http状态码

code 说明
200 请求成功
301/302 永久重定向/临时重定向
403 没有权限访问
404 没有对应的资源
500 服务器错误
503 服务器停机或正在维护

要爬取知乎内容首先需要进行登录,在本文中我们主要介绍2种登录方式,第一种是通过requests的session保存cookies进行登录,第二种是通过scrapy修改start_requests函数进行登录

requests进行登录

在utils中新建zhihu_login.py,实例化一个session对象,设置其cookies对象为cookiesjar库中的LWPCookieJar对象,设置requests库需要用到的headrs(从浏览器中进行拷贝),

session = requests.session()
session.cookies = cookiejar.LWPCookieJar(filename='zhihu_cookies.txt')
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36','Origin':'https://www.zhihu.com','Accept-Language':'zh-CN,zh;q=0.8,en;q=0.6','Host':'www.zhihu.com','Referer':'https://www.zhihu.com/'
}

接下来,我们要寻找登录发送数据的页面,首先打开zhihu.com退出之前的登录,来到一个登录页面,在登陆页面中使用手机号码登录,此时需要发送一个错误的信息给页面,以找到post数据的网页(如果输入正确的账号密码就直接登录成功了,一大堆网页请求就找不到我们需要的网页了)

找到了需要post的网页,发现post的数据有_xsrf,passoword,phone_num,另外一个captcha_type没有用,加了之后反而无法访问(不知道为什么)

def zhihu_login(account, password):if re.match('1\d{10}', account):phone_post_url = 'https://www.zhihu.com/login/phone_num'post_data={'_xsrf':get_xsrf(),'phone_num':account,'password':password,# 'captcha_type':'cn'}# session_response = session.post(phone_post_url, data=post_data, headers=header)# print(session_response.text)# result_list = re.findall('"msg": "(.*?)"',session_response.text)[0]# print(result_list.encode('utf8').decode('unicode-escape'))# try:#     login_page = session.post(phone_post_url, data=post_data, headers=headers)#     print('不要验证码,login_code:{}'.format(login_page.status_code))# except:post_data['captcha'] = get_captcha()login_page = session.post(phone_post_url, data=post_data, headers=headers)result_list = re.findall('"msg": "(.*?)"', login_page.text)[0]print(result_list.encode('utf8').decode('unicode-escape'))session.cookies.save()print('保存成功')

在这里我们一开始没有使用验证码,发现只要是爬虫登录都会被识别到,所以我们编写了一个用于生成验证码的代码:

def get_captcha():t = str(int(time.time()*1000))captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"r = session.get(captcha_url, headers=headers)with open('captcha.jpg','wb') as f:f.write(r.content)try:im = Image.open('captcha.jpg')im.show()im.close()except:print('wrong')captcha = input('请输入验证码:')return captcha

保存完cookies,我们尝试使用这个cookies再次登录

def get_again():try:session.cookies.load(ignore_discard=True)print('cookies加载成功\n')except:print('cookies加载失败')response = session.get('https://www.zhihu.com',headers=headers)# response.encoding = response.apparent_encodingwith open('my_zhihu_login.html','wb') as f:f.write(response.text.encode('utf8'))print('保存页面成功')

查看这个页面发现不停地刷新,暂时还没有找到办法

scrapy模拟登陆知乎

首先生成一个新的spider,名字为zhihu

在class zhihu中定义headers等信息,重写start_requests函数

def start_requests(self):return [scrapy.Request('https://www.zhihu.com/#signin',headers=self.headers, callback=self.login)]

start_requests里面返回一个新的Request,其回调函数设置为一个新的login函数如下:

def login(self,response):# print(response.text)# a = '<input type="hidden" name="_xsrf" value="36424865b408db8c3f976a1a676cad60"/>'match_obj = re.match('.*name="_xsrf" value="(.*?)"', response.text, re.DOTALL)if match_obj:_xsrf = match_obj.group(1)post_data = {'_xsrf': _xsrf,'phone_num': 'xxxxxxxxxxx','password': 'xxxxxxx','captcha':''}t = str(int(time.time() * 1000))captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"return [scrapy.Request(url=captcha_url,meta={'post_data':post_data},headers=self.headers,callback=self.get_captcha_login)]else:raise EOFError

转载于:https://www.cnblogs.com/drawon/p/8520739.html

scrapy爬取知乎问题实战相关推荐

  1. Scrapy爬取知乎Python专题精华,连答主头像都给爬下来,不放过一切

    前些天写的一篇"我与Scrapy的初次相识,理论+实战入门Scrapy "都上首页推荐了,到现在浏览量还没破百,难受. 写的不好大概,不过只要有一人看,都是鼓励,一直写,一直积淀, ...

  2. Scrapy爬取知乎用户信息以及人际拓扑关系

    Scrapy爬取知乎用户信息以及人际拓扑关系 1.生成项目 scrapy提供一个工具来生成项目,生成的项目中预置了一些文件,用户需要在这些文件中添加自己的代码. 打开命令行,执行:scrapy sta ...

  3. 使用python scrapy爬取知乎提问信息

    前文介绍了python的scrapy爬虫框架和登录知乎的方法. 这里介绍如何爬取知乎的问题信息,并保存到mysql数据库中. 首先,看一下我要爬取哪些内容: 如下图所示,我要爬取一个问题的6个信息: ...

  4. python爬虫实战笔记---以轮子哥为起点Scrapy爬取知乎用户信息

    开发环境:python3.5+Scrapy+pycharm+mongodb 思路: 1.选定起始人:选定一个关注数量或粉丝数量多的大佬 2.获取粉丝和关注列表 3.获取列表用户信息 4.获取每位用户粉 ...

  5. 手把手教你用Scrapy爬取知乎大V粉丝列表

    导读:通过获取知乎某个大V的关注列表和被关注列表,查看该大V以及其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息. ...

  6. yield python3 知乎_运维学python之爬虫高级篇(七)scrapy爬取知乎关注用户存入mongodb...

    首先,祝大家开工大吉! 本篇将要介绍的是从一个用户开始,通过抓关注列表和粉丝列表,实现用户的详细信息抓取并将抓取到的结果存储到 MongoDB. 1 环境需求 基础环境沿用之前的环境,只是增加了Mon ...

  7. java mongodb 返回所有field_Python爬虫框架:scrapy爬取知乎关注用户存入mongodb

    环境需求 基础环境沿用之前的环境,只是增加了MongoDB(非关系型数据库)和PyMongo(Python 的 MongoDB 连接库),默认我认为大家都已经安装好并启动 了MongoDB 服务. 测 ...

  8. Scrapy爬取知乎用户信息

    1 爬取逻辑 先选取一个用户,爬取他的粉丝列表和关注列表.然后对每个粉丝进行分析,找出他们的粉丝列表和关注列表,以此往复,递归下去,就可以爬取大部分的用户信息了.通过一个树形的结构,蔓延到所有的用户. ...

  9. scrapy爬取天气存MySQL_Scrapy实战篇(五)之爬取历史天气数据

    本篇文章我们以抓取历史天气数据为例,简单说明数据抓取的两种方式: 1.一般简单或者较小量的数据需求,我们以requests(selenum)+beautiful的方式抓取数据 2.当我们需要的数据量较 ...

最新文章

  1. jieba(结巴)常用方法
  2. GraphViz :1 安装和简单使用
  3. 记录 之 整形数除整形数 产生的数据依然是整形,难搞哦
  4. 中国高校计算机考研:计算机数据结构核心考点解析
  5. 通过键盘上下键 JS事件,控制候选词的选择项
  6. PHP笔记-商品价格例子
  7. Jmeter之Json表达式关联
  8. mdadm中文man帮助
  9. 由“单独搭建Mybatis”到“Mybatis与Spring的整合/集成”
  10. 移远4G模组EC600N进行TCP/IP连接和服务器测试
  11. 系统更新win10服务器出错,Win10系统Windows Update更新出现0x80080005错误代码怎么办...
  12. 服务器开机风扇转但无显示,电脑开机主机风扇在转,显示器却显示无信号是怎么回事?...
  13. jmeter之http取样器
  14. android 智能识别名片,小程序云开发实战:实现 AI 智能名片识别小程序
  15. java格式化xml字符串_XML串的格式化输出
  16. 带顶点动画的护盾效果——UnityShader学习笔记
  17. python破解wifi教程
  18. 学习日常英语(每天更新10+—)
  19. numpy统计图像中某个像素值的个数
  20. c++可视化 横向打印二叉树(连线、规整)

热门文章

  1. Hyper-V虚拟机安装XP系统
  2. ZXing实现横竖屏扫描切换
  3. echarts省市区id(区域编码)实现地图下钻点击(data赋值自定义属性值,geojson信息获取)
  4. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest 补题
  5. 多维数组存储的两种方式
  6. np.loadtxt加载数据集遇到ValueError: invalid literal for float(): 3.7194476e+06 -1.2636059e+05错误
  7. 两个正数相乘或相加,为什么结果是负数。/Java基本数据类型介绍
  8. 全国计算机等级考试二级教程与资料
  9. Hi-Fi小经验(转)
  10. 铁流:苹果为何不找IBM,而选择中国浪潮