建立项目

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, 暂时不知道怎么处理验证码的情况, 还望大牛指教

最新文章

  1. clientTop、offsetTop和scrollTop的区分
  2. Python 深入理解yield
  3. noi 666 放苹果
  4. Hue中给BI分配的权限
  5. Solum入门知识(编辑中)
  6. 《数据通信与网络》笔记--TCP中的拥塞控制
  7. asp.net输出重写压缩页面文件实例
  8. Google的IP地址一览表,加上代理服务器
  9. 算法笔记_014:合并排序(Java)
  10. python项目使用jsonschema进行参数校验
  11. Android热修复技术选型——三大流派解析
  12. 第四次团队作业:社团申请App
  13. Mac下部署Ionic环境
  14. Mac OS环境下DOSBox汇编环境的搭建
  15. 未来-IOT-Aliyun:ICA 联盟
  16. PAT乙级题:1003我要通过!
  17. webpack 学习总结demo
  18. mysql服务里面没有启动项
  19. Laravel View Composer - 当 include 一个模板时,自动获取其所需的变量
  20. PAT 乙级 1061. 判断题(15)

热门文章

  1. scrapy架构初探
  2. java中得到图片的宽度 高度:
  3. Intent解析
  4. Example012点击修改属性
  5. win 结束占用端口的进程
  6. openssl req(生成证书请求和自建CA)
  7. Ionic 应用图标,信息修改
  8. springmvc+jdbc连接数据库(第一个微商项目,代理注册)
  9. 高效测试用例组织算法pairwise之Python实现
  10. hibernate之映射文件VS映射注解