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 ...
随机推荐
- 获取当前 系统时间 + 获取当前URL 键值;
一://系统当前时间 function show(){ var mydate = new Date(); var str = "" + mydate.getFullYear() + ...
- JavaScript表单验证和正则表达式
JavaScript表单验证 分为四类: 1.非空验证 常用于用户名等 2.相等验证 常用于验证两次输入的密码 3.范围验证 常用于年龄等 4.正则验证 用于手机号,邮箱号等 以下是实例: <! ...
- IOS 固定定位底部input输入框,获取焦点时弹出的输入法键盘挡住input
移动页面经常会做到这样一个效果,看下面的图片,重点就是那个固定定位的底部,里面有个input输入框,在输入字符的时候,安卓手机看着是完全没有问题! 1.页面没有点击底部input的初始状态 2.安卓手 ...
- USACO Healthy Holsteins
首先看题目: Healthy HolsteinsBurch & Kolstad Farmer John prides himself on having the healthiest dair ...
- VB6之SOAP
根据网上搜来的资料,MS有个组件可以用来支撑VB6访问SOAP接口. 于是下载了个msSoapToolkit.exe安装后试了下,发现确实可以访问用C#或者VB.net写的webservice. 但是 ...
- CCS学习(三)
边框样式 边框线 dorder-style (top 上: bottom 下: left 左: right 右) 样式:none | hidden | dotted | dashed | sol ...
- English - Green Peanut Butter
There is a guy. He wants to drink 12 cups of green peanut butter. He needs green peanut butter. So h ...
- Linux常见命令语句
查看当前目录: pwd 查看文件具体大小: ls -l 返回上一级: cd.. 返回根目录: cd / 创建一个隐藏文件 vim .test 显示隐藏文件:ls -a 编辑文件: 1.vim 文件名 ...
- 剥析surging的架构思想
1.前言 前面第一篇阐述了采用基于.NET CORE微服务架构,应用surging服务端与客户端之间进行通信的简单示例以及对于surging服务化框架简单介绍.在这篇文章中,我们将剥析surgin ...
- tomcat支持php
最近做项目遇到了问题,服务器是用的tomcat,而有用到php,就想在tomcat下面可以运行php,步骤如下: 1.下载php压缩包解压或者用wamp/xampp 我下载的是wamp,用的里面的ph ...