用python爬取需要登录的网站

您所在的位置:网站首页 python批量爬取网页 用python爬取需要登录的网站

用python爬取需要登录的网站

2023-06-21 22:02| 来源: 网络整理| 查看: 265

如何爬取需要登录的网站 创建一个session用fiddler抓取请求参数模拟浏览器发起登录请求获取userkey备用登录后,通过session对象请求该网站的其他页面 假如要爬取某个网页,但是该网页要登录后才能进行访问,刚好登录的时候不需要验证码,那么可以用如下方法

创建一个session

当用浏览器登录网站后,服务器会自动创建一个session对象,在session的有效期内,session对象中的变量在整个用户会话中会一直保存。 因此,我们可以先创建一个session对象

import requests session_request=requests.session() 用fiddler抓取请求参数

打开fiddler,在浏览器输入账号密码登录一下,用fiddler抓取一下请求参数 (爬取的是公司测试环境的网页,目前项目仍然处于内部测试阶段,因此链接打了马赛克,这不是重点,嘻嘻) 在这里插入图片描述 在fiddler中查看登录时请求的接口,如下图,很明显,登录时是以post方式请求的接口 在这里插入图片描述 如下图,请求中传递了四个参数 loginName,password,terminal,InviteUserId 其中password和我们在浏览器端输入的密码并不一样,因为加密了,虽然不知道加密方式,但是,不重要,复制过去就好了 InviteUserId值是空的,也没关系,附个空字符串就好了 在这里插入图片描述 接着上图,顺便再看看服务端给我们返回了啥 比如,在bodyMessage中有个userKey,在后续访问其他网页时,会用到这个参数。

模拟浏览器发起登录请求

我们已经搞清浏览器是怎么给服务器发请求,以及服务器会返回哪些数据,就可以开始模拟浏览器发起登录请求啦!

import requests session_request=requests.session() login_url='http://******/Login' #登录时请求的url result=session_request.post( login_url, data={ #构造post请求的数据,按顺序复制粘贴参数就好了 'loginName':'1********8', 'password':'2*****************9',#此处是密文,一定要乖乖复制fiddler中的参数值 'terminal':'1', 'InviteUserId':'' }, headers = dict(referer=login_url) ) print(result.content.decode('utf-8')) #可以输出一下返回结果:)

在这里插入图片描述

获取userkey备用

登录后,有些页面的地址会含有参数userkey,但userkey是会过期的。而登录时,服务器返回请求的bodyMessage中有个userkey的字段。因此,我们可以把登录返回的userkey取出来,作为一个变量。在访问需要userkey的网页时,可以通过拼接字符串的形式,构造url。通过这种方式,需要做定时爬取的时候就再也不怕userkey过期啦~ 获取它的方式很多,我个人喜欢用正则获取,因为简单:)

body_message=result.content.decode('utf-8') 获取UserKey user_key=''.join(re.findall('"userKey":"(.*?)",',body_message)) print('userkey:'+user_key) # 接着上面的代码,输出一下userkey

在这里插入图片描述

登录后,通过session对象请求该网站的其他页面

之后我们就可以通过session对象开心地访问页面,解析返回结果获取自己需要的数据啦 贴个获取首页的新增粉丝数、总粉丝数、累计阅读量 的完整代码。 在这里插入图片描述

import requests import re import time officialaccount_id = '695' article_id = '15233' sleeptime=10 def crawling(): #登录session session_request=requests.session() login_url='http://*************/api/Login' #登录url result=session_request.post( login_url, data={ 'loginName':'1************8', 'password':'2*********************9', 'terminal':'1', 'InviteUserId':'' }, headers = dict(referer=login_url) ) body_message=result.content.decode('utf-8') #获取UserKey user_key=''.join(re.findall('"userKey":"(.*?)",',body_message)) #首页 url='http://**********/api/ManagerFan/GetFansStatistics?userKey='+user_key+'&oaId='+officialaccount_id res=session_request.get( url, headers = dict(referer = url) ) indexmessage=res.json() index_bodyMessage = indexmessage["bodyMessage"] addfans =''.join(re.findall('addFans":(.*?),',index_bodyMessage)) allfans = ''.join(re.findall('allFans":(.*?),', index_bodyMessage)) allread= ''.join(re.findall('allRead":(.*?)}', index_bodyMessage)) print('addfans:'+addfans) print('allfans:' + allfans) print("allRead:"+allread) crawling()

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3