大家好,之前看到的关于cookies的应用,由于有段时间没看,再看的时候花了一些时间,来给大家总结下。本文是根据:"http://www.bubuko.com/infodetail-2233980.html"基础上加了一些自己遇到的问题,希望能帮助到大家,那我们开始!!

一: 先上一些干货,稍微做些前期知识储备:

HTTP 请求方法:GET 和 POST(提交的方式)
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据 Cookie和session(存储的方式)
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。 cookie - (name,value,domain,path,secure,expire(过期时间))
根据用户名,密码,标识用户
session - session_id+cookie
根据session_id,标识用户,发送用户名和密码 本来 session 是一个抽象概念,开发者为了实现中断和继续等操作,将 user agent 和 server 之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。
而 cookie 是一个实际存在的东西,http 协议中定义在 header 中的字段。可以认为是 session 的一种后端无状态实现。
session 因为 session id 的存在,通常要借助 cookie 实现

Scrapy模拟浏览器登录

scrapy的基本请求流程:
1.start_request 遍历start_urls列表
2.make_requests_from_url 执行Request方法,请求start_urls里面的地址(post--登录) 快速登录的方法:
  1.改写start_request,直接GET登录页面的html信息(登录的账户,密码,怎么提交,提交到哪)
<form action="#" enctype="application/x-www-form-urlencoded" method="post">
<tr id="auth_user_email__row">
<tr id="auth_user_password__row">
<tr id="auth_user_remember_me__row">
<tr id="submit_record__row">
<td class="w2p_fw">
<input type="submit" value="Log In" class="btn">
<button class="btn w2p-form-button" onclick="window.location='/places/default/user/register';return false">Register</button>
</td>
</tr>
</tr>
</tr>
</tr>
</form>   2.start_request方法GET到数据后,用callback参数,执行拿到response后要接下来执行哪个方法,然后在login方法里面写入登录用户名和密码   3、parse_login方法是提交完表单后callback回调函数指定要执行的方法,为了验证是否成功。这里我们直接在response中搜索Welcome Liu这个字眼就证明登录成功。
  这个好理解,重点是yield from super().start_resquests(),这个代表着如果一旦登录成功后,就直接带着登录成功后Cookie值,方法start_urls里面的地址。
  这样的话登录成功后的response可以直接在parse里面写。

Cookie登录:

    start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于start_urls,start_requests()返回的请求会替代start_urls里的请求

    Request()get请求,可以设置,url、cookie、回调函数

    FormRequest.from_response()表单post提交,第一个必须参数,上一次响应cookie的response对象,其他参数,cookie、url、表单内容等

    yield Request()可以将一个新的请求返回给爬虫执行

    在发送请求时cookie的操作,
meta={'cookiejar':1}表示开启cookie记录,首次请求时写在Request()里
meta={'cookiejar':response.meta['cookiejar']}表示使用上一次response的cookie,写在FormRequest.from_response()里post授权
meta={'cookiejar':True}表示使用授权后的cookie访问需要登录查看的页面 获取Scrapy框架Cookies 请求Cookie
Cookie = response.request.headers.getlist('Cookie')
print(Cookie) 响应Cookie
Cookie2 = response.headers.getlist('Set-Cookie')
print(Cookie2)

二: 现在给大家开始代码:

spider/pach.py

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request,FormRequest
from Pach.settings import USER_AGENT
import pdb class PachSpider(scrapy.Spider): #定义爬虫类,必须继承scrapy.Spider
name = 'pach' #设置爬虫名称
allowed_domains = ['edu.iqianyue.com'] #爬取域名
# start_urls = ['http://edu.iqianyue.com/index_user_login.html'] #爬取网址,只适于不需要登录的请求,因为没法设置cookie等信息 header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0'} #设置浏览器用户代理
'''
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Connection': 'keep-alive',
'Content-Length': '11',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Host': 'edu.iqianyue.com',
'Origin': 'edu.iqianyue.com',
#'Referer': 'http://www.dy2018.com/html/tv/oumeitv/index.html',
'User-Agent': USER_AGENT,
'X-Requested-With': 'XMLHttpRequest', }
''' def start_requests(self): #用start_requests()方法,代替start_urls
"""第一次请求一下登录页面,设置开启cookie使其得到cookie,设置回调函数"""
yield Request('http://edu.iqianyue.com/index_user_login.html',meta={'cookiejar':1},callback=self.parse) def parse(self, response): #parse回调函数 data = { #设置用户登录信息,对应抓包得到字段
'number':'xxxxx',
'passwd':'xxxx',
'submit':''
}
# 响应Cookie
Cookie1 = response.headers.getlist('Set-Cookie') #查看一下响应Cookie,也就是第一次访问注册页面时后台写入浏览器的Cookie
print('cookie1',Cookie1)
"""第二次用表单post请求,携带Cookie、浏览器代理、用户登录信息,进行登录给Cookie授权"""
yield FormRequest.from_response(response,
url='http://edu.iqianyue.com/index_user_login.html', #真实post地址
meta={'cookiejar':response.meta['cookiejar']},
headers=self.header,
formdata=data,
callback=self.next,
)
def next(self,response):
"""登录后请求需要登录才能查看的页面,如个人中心,携带授权后的Cookie请求"""
yield Request('http://edu.iqianyue.com/index_user_index.html',meta={'cookiejar':True},callback=self.next2) def next2(self,response):
# 请求Cookie
#Cookie2 = response.request.headers.getlist('Cookie')
#print(Cookie2)
body = response.body # 获取网页内容字节类型
unicode_body = response.body_as_unicode() # 获取网站内容字符串类型
a = response.css('div.col-md-4.column ::text').extract()[2]
#a = response.css('div#panel-54098 h2::text').extract() #得到个人中心页面
print(a)

设置代理:

middlewares.py

class PachSpiderMiddleware(object):
# Not all methods need to be defined. If a method is not defined,
# scrapy acts as if the spider middleware does not modify the
# passed objects.
def __init__(self, ip=''):
self.ip = ip
def process_request(self, request, spider):
print('http://10.240:911')
request.meta['proxy'] = 'http://10.240:911'

settings.py

USER_AGENT ={       #设置浏览器的User_agent
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
} ROBOTSTXT_OBEY = False
CONCURRENT_REQUESTS = 16
DOWNLOAD_DELAY = 0.5
#COOKIES_ENABLED = False DOWNLOADER_MIDDLEWARES = {
#'Pach.middlewares.PachDownloaderMiddleware': 543,
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 543,
'Pach.middlewares.PachSpiderMiddleware': 125,
} ITEM_PIPELINES = {
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware':1,
#'Pach.pipelines.PachPipeline': 300,
}

三: 需要注意的点

#COOKIES_ENABLED = False
| COOKIES_ENABLED = True
#settings.py 将cookies开启,才能获取登录成功后的信息,能够获取请求response.request.headers的"Cookie",无法获取response.headers的"Set-Cookie" #settings.py 将cookies禁用,无法获取登录成功后的信息,无法获取请求response.request.headers的"Cookie",能够获取response.headers的"Set-Cookie" (Pdb) response.request.headers
{'Accept-Language': ['en'], 'Accept-Encoding': ['gzip,deflate'], 'Accept': ['text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'],
'User-Agent': ['Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0'], 'Referer': ['http://edu.iqianyue.com/index_user_login.html'],
'Cookie': ['PHPSESSID=2jhiv5fdb3rips83928mf5gaq2'], 'Content-Type': ['application/x-www-form-urlencoded']} (Pdb) response.headers
{'Via': ['1.1 shzdmzpr03'], 'X-Powered-By': ['PHP/5.6.36'], 'Expires': ['Thu, 19 Nov 1981 08:52:00 GMT'], 'Server': ['Apache/2.4.6 (CentOS) PHP/5.6.36'],
'Pragma': ['no-cache'], 'Cache-Control': ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0'], 'Date': ['Tue, 09 Oct 2018 05:17:14 GMT'],
'Content-Type': ['text/html; charset=utf-8']} -> a = response.css('div#panel-54098 h2::text').extract()
(Pdb) c
[u'\r\n\t\t\t\t\t\t\t\t\t\t\t\t\u6211\u7684\u57fa\u672c\u4fe1\u606f\r\n\t\t\t\t\t\t\t\t\t\t\t',
u'\r\n\t\t\t\t\t\t\t\t\t\t\t\t\u6211\u5b66\u4e60\u7684\u8bfe\u7a0b\u6570\u91cf\r\n\t\t\t\t\t\t\t\t\t\t\t',
u'\r\n\t\t\t\t\t\t\t\t\t\t\t\t\u6211\u8d2d\u4e70\u7684\u8bfe\u7a0b\u6570\u91cf\r\n\t\t\t\t\t\t\t\t\t\t\t'] COOKIES_ENABLED = False
(Pdb) response.request.headers
{'Accept-Language': ['en'], 'Accept-Encoding': ['gzip,deflate'], 'Accept': ['text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'],
'User-Agent': ['Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0'], 'Referer': ['http://edu.iqianyue.com/index_user_login.html'],
'Content-Type': ['application/x-www-form-urlencoded']}
(Pdb) response.headers
{'Via': ['1.1 shzdmzpr03'], 'X-Powered-By': ['PHP/5.6.36'], 'Set-Cookie': ['PHPSESSID=0bjvnkfom3q9c9u878f0aauvi4; path=/'],
'Expires': ['Thu, 19 Nov 1981 08:52:00 GMT'], 'Server': ['Apache/2.4.6 (CentOS) PHP/5.6.36'], 'Pragma': ['no-cache'],
'Cache-Control': ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0'], 'Date': ['Tue, 09 Oct 2018 05:20:23 GMT'], 'Content-Type': ['text/html; charset=utf-8']}
-> a = response.css('div#panel-54098 h2::text').extract()
(Pdb) c
[ ]

scrapy--Cookies的更多相关文章

  1. scrapy cookies:将cookies保存到文件以及从文件加载cookies

    我在使用scrapy模拟登录新浪微博时,想将登录成功后的cookies保存到本地,下次加载它实现直接登录,省去中间一系列的请求和POST等.关于如何从本次请求中获取并在下次请求中附带上cookies的 ...

  2. Python爬虫【四】Scrapy+Cookies池抓取新浪微博

    1.设置ROBOTSTXT_OBEY,由true变为false 2.设置DEFAULT_REQUEST_HEADERS,将其改为request headers 3.根据请求链接,发出第一个请求,设置一 ...

  3. python scrapy cookies 处理

    def start_requests(self): cookies = 'anonymid=jcokuqwe................省略' # 首先是对cookies进行分割以;为节点 ook ...

  4. scrapy加载cookies登陆

    import scrapy from xxxx.items import XXXXItem from scrapy.http.request import Request class ZndsSpid ...

  5. 小白进阶之Scrapy(基于Scrapy-Redis的分布式以及cookies池)

    首先我们更新一下scrapy版本.最新版为1.3 再说一遍Windows的小伙伴儿 pip是装不上Scrapy的.推荐使用anaconda .不然还是老老实实用Linux吧. conda instal ...

  6. 字符串cookies转字典 scrapy使用。

    配置文件 DOWNLOADER_MIDDLEWARES = { 'weibo.middlewares.CookiesMiddleware': 543, } 中间件内容 class CookiesMid ...

  7. 第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies

    第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于star ...

  8. 十二 web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies

    模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于start_urls,start_requests()返回的请求会替代start_urls里 ...

  9. scrapy模块之分页处理,post请求,cookies处理,请求传参

    一.scrapy分页处理 1.分页处理 如上篇博客,初步使用了scrapy框架了,但是只能爬取一页,或者手动的把要爬取的网址手动添加到start_url中,太麻烦接下来介绍该如何去处理分页,手动发起分 ...

  10. scrapy的User-Agent中间件、代理IP中间件、cookies设置、多个爬虫自定义settings设置

    在scrapy的反爬中,常用的几个配置,简单总结了下: User-Agent中间件: from fake_useragent import UserAgent class RandomUserAgen ...

随机推荐

  1. 在快速自定义的NopCommerce中使用实体框架(EF)代码优先迁移

    我看到很多nopCommerce论坛的用户问他们如何使用Entity Framework(EF)代码优先迁移来自定义nopCommerce,添加新的字段和entites核心.我实际上在做nopComm ...

  2. node.js 模块和其下载资源的镜像设置

    以前安装 electron 时总是失败,然后就在淘宝镜像上下载好相应版本的文件放到用户目录来解决问题. 后来研究发现 npm 不仅可以设置 node.js 模块仓库的代理, 同样可以设置像 elect ...

  3. C++ Knowledge series Conversion & Constructor & Destructor

    Everything has its lifecycle, from being created to disappearing. Pass by reference instead of pass ...

  4. HashWithIndifferentAccess

    The params method returns the parameters passed to the action, such as those fromthe form or query p ...

  5. lunix重启service network restart错误Job for network.service failed. See 'system 或Failed to start LSB: Bring

    1.mac地址不对 通过ip addr查看mac地址,然后修改cd /etc/sysconfig/network-scripts/目录下的文件里面的mac地址 2.通过以下方法 systemctl s ...

  6. hibernate 模拟实现和What is and Why O/R Mapping

    What is and Why O/R Mapping What is : 用面向对象的方式调用api,类库帮我们翻译成面向关系的方式. Why: 1.JDBC操作数据库很繁琐2.Sql 语句编写并不 ...

  7. nginx启动时报错

    nginx启动时报错 原因:nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed /var/cache/ngin ...

  8. [QualityCenter]QC是什么?发展历程是怎样?

    QC,即Quality Center,是一个基于Web的测试管理工具.它可以组织和管理应用程序测试流程的所有阶段,包括制定测试需求.计划测试.执行测试和跟踪缺陷.此外,通过Quality Center ...

  9. HTML5 data-* 自定义属性操作及其注意点

    在HTML5中添加了data-*的方式来自定义属性,所谓data-*实际上上就是data-前缀加上自定义的属性名,命名可以用驼峰命名方式,但取值是必需全部使用小写(后面会说),使用这样的结构可以进行数 ...

  10. Spring Boot:内置tomcat启动和外部tomcat部署总结

    springboot的web项目的启动主要分为: 一.使用内置tomcat启动 启动方式: 1.IDEA中main函数启动 2.mvn springboot-run 命令 3.java -jar XX ...