在web  sprider crawl过程中,许多网站都需要登录后才能访问,一般如果我们不用爬虫框架的前提下,常规用的就两个库 ,urllib库和requests库,本文将用最基础的urllib库,以模拟登录人人网为例,理清爬虫过程中登录访问和cookie的思绪。

1.终极方案,也是最简单粗暴最有效的方式。直接手动登录,提取cookie,下次访问直接在请求头携带cookie

我们知道,网站辨别用户身份和保持会话的常用方式就是cookie和session,用户登录成功,服务器返回一些特定字符串保存在本地浏览器中(cookie),浏览器下次访问会直接携带cookie,这样服务器就可以根据返回的cookie验证访问者身份。通常如果用浏览器正常访问,这部分事情浏览器会帮我们去做。但是在程序模拟登  录时候,携带cookie就需要手动携带了。话不多说,直接进入主题。

打开人人网登录界面,填入自己正确的用户名和密码,成功登陆进去。

其中红色框的就是服务器给你的cookie,你的cookie就是以这样的形式在request请求头中的。直接将其复制粘贴下来,放入代码中。上程序:

"""首先手动登录人人网,然后获取cookie"""

from urllib.request importurlopen, Request

headers={'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',#'Accept-Encoding': 'gzip, deflate', 这部分通常注释掉,因为这部分是高诉服务器,本地支持的压缩类型,因为浏览器会自动帮我们解压,但是在程序中,没办法解压,所以请求头就不携带了

'Accept-Language': 'zh-CN,zh;q=0.9','Connection': 'keep-alive','Cookie': 'anonymid=kcpawuyd33irh2a;depovince=GW;r01_=1; JSESSIONID=abcGzDX6FRQNVfwdUETBnx;ick_login=6a732399-3adf-471b-af92-9bd68299d515; \

taihe_bi_sdk_uid=e4c3ee72270319312dde3088eb04c0be; taihe_bi_sdk_sefssion=6722a32d96ebbf8fd565fc7cc7f8f789;ick=1048bb79-0d32-46ab-8a11-af0c7e4cfa51;first_login_flag=1; \

ln_uact=17795796865;ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; ga=GA1.2.2124318841.1594975538;gid=GA1.2.506855365.1594975538; \

wp_fold=0;jebecookies=3833d4fe-20b3-4ecf-9efc-df9aca93641e|||||;de=5C6d0B07AA3EB53E377A21F126C928EF0; p=d3ae1effe255d4e057ef37f5682ac4850;\

t=ba23da27a155cc2b84a43307e83b37a70;societyguester=ba23da27a155cc2b84a4f3307e83b37a70;id=974774570;xnsid=a3c6bde2;ver=7.0;loginfrom=null','Host': 'www.renren.com','Referer': 'http://www.renren.com/974774570/profile''Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'}

url= 'http://www.renren.com/974774570/profile' #个人主页request= Request(url=url, headers=headers)

response=urlopen(request)print(response.read().decode())

注释:程序的headers 是一个字典,是通过登录后抓包来的如下:

其实通常我们只需要携带图中的两个参数,cookie和User-Agent,,某些get请求中,只需伪装User_agent即可。但是我为什么带这么多呢,那是因为,在有的网站你抓取的过程中,你其他参数都配置完美,但是总是抓取错误,那么问题八九不离十出现在headers中,始终记住我们是用程序模拟浏览器访问服务器,说明程序伪装的还不够完美。

那么这时候就要考虑headers中是否缺失了某些头部信息。为了防止出错,干脆全盘端过来,反正你浏览器访问的时候就是带的这些请求头参数。但是要注意,请求头Accept-Encoding (程序中已经交代清楚)和 Content-Length(这是浏览器计算出的长度,程序模拟没办法计算,所以注释掉)通常注释掉。

HTTP请求中的常用消息头

accept:浏览器通过这个头告诉服务器,它所支持的数据类型

Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集

Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式

Accept-Language:浏览器通过这个头告诉服务器,它的语言环境

Host:浏览器通过这个头告诉服务器,想访问哪台主机

If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间

Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的  防盗链

Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接

Content-Length:浏览器通过这个头告诉服务器发出去的字节长度

2. 模拟登录,然后访问主页(在程序中我们不需要关心cookie是如何如何的,opener对象会自动帮我们处理,与之对应的是方式3,见下文)

通过抓包如上图,分析登录post请求的地址和携带的参数

直接上代码:

"""真正的模拟登录是:发送post请求之后,保存cookie,之后访问携带cookie"""# http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2020652227884 通过这13位数,我们可以以男人的直觉,嗅出这是精确到毫秒的时间戳,那m我们给他生成就是

url= 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp={}' # 登录地址

importtimefrom urllib.request importRequest, urlopen, HTTPCookieProcessor, build_opener, ProxyHandlerfrom urllib.parse importurlencodefrom http.cookiejar importCookieJar, MozillaCookieJar#1. 创建cookiejar对象,这一种方式不用手动保存cookie,后期直接调用同一个opener即可,因为cookie已经在opener对象中

cookiejar =CookieJar()#2.通过cookiejar创建一个handler

handler =HTTPCookieProcessor(cookiejar)#handler1 = ProxyHandler({'http': '182.101.207.11:8080'}) # 选择是否需要代理(自己设定代理)#3.根据handler创建一个opener

opener = build_opener(handler) #build_opener以传递多个handler对象,如果需要代理,则将handler1也传入

unique_time = int(time.time() * 1000) #生成时间戳

headers={'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'}

data={'email': '17795796865','icode': '','origURL': 'http://www.renren.com/home','domain': 'renren.com','key_id': '1','captcha_type': 'web_login',#此处密码是经过目标网站加密,不能直接放置原生密码,加密密码可以用浏览器抓包获取

'password': '4af866303efsdf40a11d9f01e9677f3374bb957f905790b62a7eaa1accaf0a634764a1','rkey': '1ad002b47d8446d446f8d76f5bb5ff66','f': 'http%3A%2F%2Fwww.renren.com%2F974774570%2Fnewsfeed%2Fphoto'}#4 创建request对象

request = Request(url=url.format(unique_time), headers=headers)#5.post方式提交登录

respose = opener.open(request, data=urlencode(data).encode())print(respose.read().decode())print('*' * 50)#get方式访问个人主页

get_url = 'http://www.renren.com/974774570/profile'request= Request(url=get_url, headers=headers)

respose=opener.open(request)print(respose.read().decode())

注释:data中的数,我们一个都不能少,因为post请求中,抓包可以看到,浏览器就带的这么多参数。至于参数是什么意思,我们唯一能一眼看懂的就是email(用户名)和password(密码)。密码是加密后的,一定不能写原生密码,加密后这一窜密码可以用浏览器登录抓包获取。至于其他的参数,这就是爬虫的难点,比如像大型的互联网公司如淘宝,这里的data参数动辄几十个,要破解相当有难度,我们暂且不需要关注这些,但是通常的网站我们稍作分析大概就能猜出来这里某个参数的意思,实在猜不出来,就原生不动的放着试着登录。大不了登录不进去我么可以采取上面的终极方案啊。始终记住,爬虫工程师,获取到网页提取数据才是你的重点。不要把精力耗费到破解form_data中的参数上。

3.手动将cookie保存到本地文件中,后续请求中直接读取该cookie文件即可

可能有的人就有疑问了,方式2既然能模拟登录成功,那为什么还要手动保存在本地呢,岂不是多此一举。凡事存在即合理。在爬虫过程中,我们可以手动提取cookie,或者模拟登录,但是在分布式爬虫或者多台机器同时爬取时候,如果让每台机器都要copy cookie,或者让每台机器都登录一遍,这不是明智的选择,那么只有事先将cookie保存在文件中,后续每台机器的程序从文件中读取即可。

程序和方式2的程序很相似:

importtimefrom fake_useragent importUserAgentfrom urllib.request importRequest, urlopen, HTTPCookieProcessor, build_opener, ProxyHandlerfrom urllib.parse importurlencodefrom http.cookiejar importCookieJar, MozillaCookieJarfrom time importsleep

url= 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp={}'

#模拟登录

defsave_cookie():#1. 创建cookiejar对象

#cookiejar = CookieJar() # 这一种不用保存文件中,后期直接用同一个opener对象调用就行

cookiejar = MozillaCookieJar() #这种方式是将cookie保存文件中

#2.通过cookiejar创建一个handler

handler =HTTPCookieProcessor(cookiejar)#handler1 = ProxyHandler({'http': '182.101.207.11:8080'}) # 选择是否需要代理

#3.根据handler创建一个opener

opener = build_opener(handler) #可以传递多个handler对象,如果需要代理,则将handler1也传入

unique_time = int(time.time() * 1000) #生成时间戳

headers={'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'}

data={'email': '17795796865','icode': '','origURL': 'http://www.renren.com/home','domain': 'renren.com','key_id': '1','captcha_type': 'web_login',#此处密码是经过目标网站加密,不能直接放置原生密码,加密密码可以用浏览器抓包获取

'password': '4af866303e40a11901e9677f3374bb957f905790b62a7eaa1accaf0a634764a1','rkey': '1ad002b47d8446d446f8d76f5bb5ff66','f': 'http%3A%2F%2Fwww.renren.com%2F974774570%2Fnewsfeed%2Fphoto'}

request= Request(url=url.format(unique_time), headers=headers)

respose= opener.open(request, data=urlencode(data).encode())#创建保存可以序列化cookie的文件对象

cookiejar.save('cookiejar.txt', ignore_discard=True, ignore_expires=True)print(respose.read().decode())print('*' * 50)#访问个人主页

defuse_cookie():

get_url= 'http://www.renren.com/974774570/profile'headers={'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'}#1. 创建cookiejar

cookiejar =MozillaCookieJar()#2.从本地加载cookie文件

cookiejar.load('cookiejar.txt')#3.创建handler对象

handler =HTTPCookieProcessor(cookiejar)#4.创建opener对象

opener =build_opener(handler)#5.创建request对象

request = Request(url=get_url, headers=headers)#6.发送请求

respose =opener.open(request)print(respose.read().decode())if __name__ == '__main__':

save_cookie()

sleep(2)

use_cookie()

运行程序我们可以看到本地有个cookiejar.txt文件

总结

不管以哪种方式,我们的终极目的是为了爬取数据,而不是花里胡哨的模拟登陆,如果模拟登陆过程中几次尝试失败,那么不妨可以直接放弃,直接以第一种方式即可。毕竟人生苦短!由于精力有限,此处就没有涉及验证码,通常大多数网站登陆几次失败后就有验证码验证。后续有机会再讲。

python爬虫分析模拟登录时会变的参数_Python爬虫之urllib模拟登录及cookie的那点事...相关推荐

  1. python requests模拟登录淘宝购物车下单_Python使用requests库模拟登录淘宝账号(上)...

    学好Python这款编程语言,我们能够设计出很多程序要帮助我们完成数据采集等工作,ET代理今天要跟大家介绍如何用Python模拟登录淘宝账号? 看了下网上有很多关于模拟登录淘宝,但是基本都是使用scr ...

  2. python requests模拟登录淘宝购物车下单_Python使用requests库模拟登录淘宝账号(下)...

    在文章的上部分,我们已经做好了模拟登录的前期准备,接下来就是让操作实现的部分了.一起来继续看看具体的操作步骤吧: 3.申请st码 上面我们已经申请到了淘宝(http://taobao.com)的tok ...

  3. endpointimpl怎么填参数_python爬虫19 | 爬虫遇到需要的登录的网站怎么办?用这3招轻松搞定!...

    你好 由于你是游客 无法查看本文 请你登录再进 谢谢合作 当你在爬某些网站的时候 需要你登录才可以获取数据 咋整? 莫慌 小帅b把这几招传授给你 让你以后从容应对 那么 接下来就是 学习 python ...

  4. python爬虫入门实战---------一周天气预报爬取_Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析...

    Python爬虫入门实战--------一周天气预报爬取[转载][没有分析 Python爬虫入门实战--------一周天气预报爬取[转载][没有分析] 来源:https://blog.csdn.ne ...

  5. python爬虫模拟浏览器的两种方法_python爬虫模拟浏览器访问-User-Agent过程解析

    这篇文章主要介绍了python爬虫模拟浏览器访问-User-Agent过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 模拟浏览器访问-Use ...

  6. python登录并关注公众号_python爬虫之微信公众号关注度排行榜

    摘要:根据一个运营朋友的需求,取出上万个微信公众号的关注度排行,最终用python实现了这一需求,工作量从至少3天缩减至2小时. 简介:本文使用python+requests框架实现接口访问,通过字典 ...

  7. python自动登录网站爬取数据_Python爬虫实战:自动化登录网站,爬取商品数据

    前言 随着互联网时代的到来,人们更加倾向于互联网购物.某东又是电商行业的巨头,在某东平台中有很多商家数据.今天带大家使用python+selenium工具获取这些公开的商家数据 适合阅读人群:sele ...

  8. 如何利用python爬虫获取网易云音乐某个歌手简介_Python 爬虫获取网易云音乐歌手信息...

    今天就先带大家爬取网易云音乐下的歌手信息并把数据保存下来. 爬取结果 环境 语言:Python 工具:Pycharm 导包 BeautifulSoup:用来解析源码,提取需要的元素. selenium ...

  9. python爬虫可以爬取哪些有用的东西_Python爬虫系列(十三) 用selenium爬取京东商品...

    这篇文章,我们将通过 selenium 模拟用户使用浏览器的行为,爬取京东商品信息,还是先放上最终的效果图: 1.网页分析 (1)初步分析 原本博主打算写一个能够爬取所有商品信息的爬虫,可是在分析过程 ...

最新文章

  1. Android studio 导入jar 文件
  2. 利用Arduino Nano 对于另外的Arduino控制板下载Bootloader
  3. Android Touch系统简介(二):实例详解onInterceptTouchEvent与onT
  4. BP: Useful report to list assigned employees
  5. 神奇的css3(2)动画
  6. c语言实现图片卷积_卷积神经网络(CNN)Python的底层实现——以LeNet为例
  7. Delphi XE3 下载
  8. WIN10系统——打开PB的帮助文档
  9. 宾州汉语句法依存指南 树库(3.0) 中文整理版
  10. bugzilla mysql 配置_Bugzilla 系统配置指南(Win32)
  11. layui控制文本框只能填写数字
  12.  php怎么做注册短信验证码
  13. John F. Kennedy的就职演说(在线收听)
  14. ug安装lmtools显示未连接服务器,服务器(LMTOOLS)设置教程
  15. jquery方法之append()与appendto()
  16. 查看CPU物理核数和逻辑核数
  17. c 语言easyx图形库飞机大战的源码
  18. 秒表计时器怎么读_秒表应该怎么读
  19. 使用scikit-image feature计算图像特征与常见特征示例
  20. 程序员才会明白的代码版“猜灯谜”

热门文章

  1. 假设有两名囚徒a和b python_囚徒问题(100 prisoners problem)的python验证
  2. 基于TCP的在线英文词典(使用了sqlite3数据库)
  3. 牛逼吧,微信状态竟然也能赚钱
  4. 泛型编程与模板元编程介绍(概念、优点)
  5. 超分算法DRCN:Deeply-Recursive Convolutional Network for Image Super-Resolution超分辨率重建
  6. python标识符区分大小写吗_python代码区分大小写吗
  7. sql 子查询及基本语句 挺全的收录
  8. Fisher线性判别分析以及python实现
  9. 网络安全态势感知研究综述
  10. 历经千辛万苦的Ubuntu20.04与Geomagic Haptic相联(下)