Scrapy模拟登录知乎
建立项目
scrapy startproject zhihu_login
scrapy genspider zhihu www.zhihu.com
编写spider
- 知乎的登录页url是
http://www.zhihu.com/#signin, 为了方便重写sart_requests
# -*- coding: utf-8 -*-
import scrapy
class ZhihuSpider(scrapy.Spider):
name = "zhihu"
allowed_domains = ["www.zhihu.com"]
def start_requests(self):
# 返回值必须是一个序列
return [scrapy.Request('http://www.zhihu.com/#signin')]
def parse(self, response):
print response
测试能不能正确返回, 返回结果是
[scrapy] DEBUG: Retrying <GET http://www.zhihu.com/robots.txt> (failed 1 times): 500 Internal Server Error
在settings中假如USER_AGENT再进行测试, 返回200, 说明是知乎验证浏览器的问题, 到此可以成功请求到
DEBUG: Crawled (200) <GET http://www.zhihu.com/robots.txt> (referer: None)
- 确定post都需要传入哪些参数, 使用开发者工具得到post值如下(没有出现验证码的情况)
_xsrf (在html中可以找到)
email
password
remember_me
- 定义login函数, 用于post登录
以上找大了_xsrf的值
# -*- coding: utf-8 -*-
import scrapy
class ZhihuSpider(scrapy.Spider):
name = "zhihu"
allowed_domains = ["www.zhihu.com"]
def start_requests(self):
# 返回值必须是一个序列
return [scrapy.Request('http://www.zhihu.com/#signin', callback=self.login)]
def login(self, response):
print '-------' # 便于测试
_xsrf = response.xpath(".//*[@id='sign-form-1']/input[2]/@value").extract()[0]
print _xsrf
使用FormRequest登录
def login(self, response):
print '-------' # 便于测试
_xsrf = response.xpath(".//*[@id='sign-form-1']/input[2]/@value").extract()[0]
print _xsrf
return [scrapy.FormRequest(
url = 'http://www.zhihu.com/login/email', # 这是post的真实地址
formdata={
'_xsrf': _xsrf,
'email': 'xxxxxxxx', # email
'password': 'xxxxxxxx', # password
'remember_me': 'true',
},
headers=self.headers,
callback=self.check_login,
)]
- 检测是否登录成功, 知乎的response会返回一个json, 如果里面r为0的话说明成功登录
def check_login(self, response):
if json.loads(response.body)['r'] == 0:
yield scrapy.Request(
'http://www.zhihu.com',
headers=self.headers,
callback=self.page_content,
dont_filter=True, # 因为是第二次请求, 设置为True, 默认是False, 否则报错
)
spider的完整代码
# -*- coding: utf-8 -*-
import scrapy
import json
class ZhihuSpider(scrapy.Spider):
name = "zhihu"
allowed_domains = ["www.zhihu.com"]
headers = {
'Host': 'www.zhihu.com',
'Referer': 'http://www.zhihu.com',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
}
def start_requests(self):
# 返回值必须是一个序列
return [scrapy.Request('http://www.zhihu.com/#signin', callback=self.login)]
def login(self, response):
print '-------' # 便于测试
_xsrf = response.xpath(".//*[@id='sign-form-1']/input[2]/@value").extract()[0]
print _xsrf
return [scrapy.FormRequest(
url = 'http://www.zhihu.com/login/email', # 这是post的真实地址
formdata={
'_xsrf': _xsrf,
'email': 'xxxxxxxx', # email
'password': 'xxxxxxxx', # password
'remember_me': 'true',
},
headers=self.headers,
callback=self.check_login,
)]
def check_login(self, response):
if json.loads(response.body)['r'] == 0:
yield scrapy.Request(
'http://www.zhihu.com',
headers=self.headers,
callback=self.page_content,
dont_filter=True,
)
def page_content(self, response):
with open('first_page.html', 'wb') as f:
f.write(response.body)
print 'done'
注: 也是刚学scrapy, 暂时不知道怎么处理验证码的情况, 还望大牛指教
Scrapy模拟登录知乎的更多相关文章
- 利用scrapy模拟登录知乎
闲来无事,写一个模拟登录知乎的小demo. 分析网页发现:登录需要的手机号,密码,_xsrf参数,验证码 实现思路: 1.获取验证码 2.获取_xsrf 参数 3.携带参数,请求登录 验证码url : ...
- Python爬虫初学(三)—— 模拟登录知乎
模拟登录知乎 这几天在研究模拟登录, 以知乎 - 与世界分享你的知识.经验和见解为例.实现过程遇到不少疑问,借鉴了知乎xchaoinfo的代码,万分感激! 知乎登录分为邮箱登录和手机登录两种方式,通过 ...
- requests_模拟登录知乎
如何登录知乎? 首先要分析,进行知乎验证的时候,知乎服务器需要我们提交什么数据,提交的地址.先进行几次登录尝试,通过浏览器中network中查看数据流得知,模拟登录知乎需要提供5个数据,分别是_xsr ...
- scrapy模拟登录微博
http://blog.csdn.net/pipisorry/article/details/47008981 这篇文章是介绍使用scrapy模拟登录微博,并爬取微博相关内容.关于登录流程为嘛如此设置 ...
- python爬虫scrapy之登录知乎
下面我们看看用scrapy模拟登录的基本写法: 注意:我们经常调试代码的时候基本都用chrome浏览器,但是我就因为用了谷歌浏览器(它总是登录的时候不提示我用验证码,误导我以为登录时不需要验证码,其实 ...
- 【爬虫】python requests模拟登录知乎
需求:模拟登录知乎,因为知乎首页需要登录才可以查看,所以想爬知乎上的内容首先需要登录,那么问题来了,怎么用python进行模拟登录以及会遇到哪些问题? 前期准备: 环境:ubuntu,python2. ...
- Python爬虫入门(基础实战)—— 模拟登录知乎
模拟登录知乎 这几天在研究模拟登录, 以知乎 - 与世界分享你的知识.经验和见解为例.实现过程遇到不少疑问,借鉴了知乎xchaoinfo的代码,万分感激! 知乎登录分为邮箱登录和手机登录两种方式,通过 ...
- 2020.10.20 利用POST请求模拟登录知乎
前两天学习了Python的requests模块的相关内容,对于用GET和PSOT请求访问网页以抓取需要的内容有了初步的了解,想要再从一些复杂的网站积累些经验.最开始我采用最简单的get(url)方法想 ...
- Java爬虫——模拟登录知乎
登录界面,首先随意输入一个账号,登录查看发送表单的请求 可以发现请求是Post : https://www.zhihu.com/login/phone_num 发送的表单是 _xsrf: passwo ...
随机推荐
- scrapy抓取淘宝女郎
scrapy抓取淘宝女郎 准备工作 首先在淘宝女郎的首页这里查看,当然想要爬取更多的话,当然这里要查看翻页的url,不过这操蛋的地方就是这里的翻页是使用javascript加载的,这个就有点尴尬了,找 ...
- 开发中关于IPv6的问题
问题: 报错信息如下 [root@kube-master iemp]# kubectl logs equipment-139404108-7mc14 -n iemp2017-05-27 05:41:0 ...
- js中的事件,内置对象,正则表达式
[JS中的事件分类] 1.鼠标事件: click/dbclick/mouseover/mouseout/mousemove/mousedown/mouseup 2.键盘事件: keydown: 键盘按 ...
- java http请求,字节流获取百度数据
请求的地址为: http://api.map.baidu.com/place/v2/search?&q=%E9%A5%AD%E5%BA%97®ion=%E9%87%8D%E5%B ...
- web开发中前后端传值
在JavaScript中,页面与页面间的传值需要注意. 比如,我们通过url向下个页面进行传一个数字时,到下个页面进行解析出来后可能是一个字符串.这样会导致一个现象.调试时,发现我要传的值的确传过来了 ...
- php中的date函数
一.带零 echo date('Y-m-d');2012-08-08二.不带零 echo date('Y-n-j');2012-8-8
- tab切换实现方式1
tab切换实现方式1: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- 短信发送接口被恶意访问的网络攻击事件(四)完结篇--搭建WAF清理战场
前言 短信发送接口被恶意访问的网络攻击事件(一)紧张的遭遇战险胜 短信发送接口被恶意访问的网络攻击事件(二)肉搏战-阻止恶意请求 短信发送接口被恶意访问的网络攻击事件(三)定位恶意IP的日志分析脚本 ...
- kindeditor使用入门-张国红
kindeditor是在线编辑器,比较好用,以下是使用这个插件的步骤. 下载kindeditor-4.1.10.zip 解压 asp,asp.net,php对于jsp开发没有用,可以删除 新建web工 ...
- Win7使用USB口连接H3C交换机的Console口
使用Console线的一端连接交换机的Console口,另一端连接电脑的USB口. 使用驱动精灵安装USB转串口驱动,我电脑上面提示安装的是: Prolific PL2303 USB转串口驱动1.16 ...