python使用request库登录界面爬取html内容和js内容

目录

1.使用request的post进行登录

2.审查元素查找网页的用户名和密码的键名

3.get方法获取网页静态内容

4.查找动态js对应XHR响json文件(str数据格式)的网址接口

5.使用json.loads解码str数据格式为python的数据类型


1.使用request的post进行登录

python爬虫使用request库登录网页时,使用post方法(密码存储在header中更安全),获取网页内容时,使用get方法(网址与params字符串拼接是明文)

image.png

以上参考, https://blog.csdn.net/acarsar/article/details/84866637

2.审查元素查找网页的用户名和密码的键名

登录的关键点在于要知道网址账号和密码json对应的键名

比如有的网站用户名和密码的键名是passport,password;有的是username,password等等

通过网页登录的时候按F12,选择network,勾选Preserve log。在name列表中找到login文件或者其它文件,点击login文件,查看Headers中的request Header中的内容,寻找含义username和password的字眼,这个就是关键字,然后构造json数据结构,把账号密码填进去。

如果没有login文件,就查看其它文件的header,如果所有文件都没有,可以查看view source,在里面搜索看看。

查看账号和密码的键名是post登录的关键

postData = {

    "username": "[2122@qq.com](mailto:2122@qq.com)",

    "password": "123qwe",

}#username和password需要在网页端登录后按F2查看

# 使用session直接post请求

responseRes = gerrit.post(postUrl, data = postData, headers = header)

建议采用简书作为网站测试,知乎的这个关键字通过js加密了!

第一,先使用一个错误的用户名和密码来登录,这样就可以清晰的看到这个登录请求有post哪些数据,post到哪个url。因为如果使用正确的用户名和密码登录,一旦登录成功,就会直接跳转到其他页面,页面和请求都会被刷新。很难找出原始的请求信息。

第二,在截取请求的地方,勾选Preserve log,保留跳转前的请求数据。

截取到的请求如下:

# -*- coding: utf-8 -*-
import requests
userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
header = {
    # "origin": "[https://passport.mafengwo.cn](https://passport.mafengwo.cn/)",
    "Referer": "[https://passport.mafengwo.cn/](https://passport.mafengwo.cn/)",
    'User-Agent': userAgent,
}
def mafengwoLogin(account, password):
    # 马蜂窝模仿 登录
    print ("开始模拟登录马蜂窝")
    postUrl = "[https://passport.mafengwo.cn/login/](https://passport.mafengwo.cn/login/)"
    postData = {
        "passport": account,
        "password": password,
    }
    responseRes = requests.post(postUrl, data = postData, headers = header)
    # 无论是否登录成功,状态码一般都是 statusCode = 200
    print(f"statusCode = {responseRes.status_code}")
    print(f"text = {responseRes.text}")
if __name__ == "__main__":
    # 从返回结果来看,有登录成功
    mafengwoLogin("13756567832", "000000001")

一般来说,调试期,判断是否登录成功的最简单的方法:就是直接打印登录之后的text内容,使用错误的用户名登录,和使用正确的用户名登录,对比打印输出的内容。

以上参考:https://blog.csdn.net/zwq912318834/article/details/79571110

快速查找键名的方法

通过右键审查元素,查找用户名的键名为:session[email_or_mobile_number],密码的键名:session[password]

以上参考: https://blog.csdn.net/iodjSVf8U1J7KYc/article/details/78940671

3.get方法获取网页静态内容

可以直接把网址当成一个字符串来处理,手动拼接。

URL = "[http://gerrit.pt.mioffice.cn/changes/?q=](http://gerrit.pt.mioffice.cn/changes/?q=)" + str(change_id) + "&n=25&O=81"
#也可以构造一个kv,放到get的params参数中
import requests
kv1={'q':'java'}
>>> r1=requests.get("[http://www.so.com/s",params=kv1](http://www.so.com/s))
>>> r1.status_code
200
>>> r1.request.url
https://www.so.com/s?q=java

4.查找动态js对应XHR响json文件(str数据格式)的网址接口

登录后爬取网页,发现大部分是js内容,无法直接爬取,需要执行js脚本后才能生成,但是也可以通过api方式直接访问,缺点就是需要手动找到自己想要的内容。

对于复杂点,获取内容比较多的,“python+ selenium + 第三方浏览器“。

对于简单的,获取单一信息的, 分析网页元素,找出该数据的原始网页,提交表单,获取不同的数据,用来达到爬取的目的。

5.使用json.loads解码str数据格式为python的数据类型

一、从网页响应中找到JS脚本返回的JSON数据

即使网页内容是由JS动态生成加载的,JS也需要对某个接口进行调用,并根据接口返回的JSON数据再进行加载和渲染。

所以我们可以找到JS调用的数据接口,从数据接口中找到网页中最后呈现的数据。

就以今日头条为例来演示:

1、找到JS请求的数据接口

选择“网络”选项卡后,发现有很多响应,我们筛选一下,只看XHR响应(如果XHR想要没有,可以看看JS)。

(XHR是Ajax中的概念,表示XMLHTTPrequest)

然后我们发现少了很多链接,随便点开一个看看:

我们选择city,Preview中有一串json数据:(选择preview可以看到网页的具体内容,以json文件呈现出来,我们要找的就是这个json文件!)

我们再点开看看,原来全都是城市的列表

选择headers,查看JS请求的URL(有时候可能直接就是文件名city,把鼠标放在上面就能看到网址),在网页中输入这个网址就能拿到json内容, 现在大概了解了怎么找JS请求的接口的吧(拿到网址)

获取到json内容后,还要将其转为python的数据结构,使用json库

import json
comments = requests.get('http://comment5.news.sina.com.cn/page/info?version=1&format=js&channel=gn&newsid=comos-fyfzhac1650783')
comments.encoding = 'utf-8'
print(comments)
jd = json.loads(comments.text.strip('var data=')) #移除改var data=将其变为json数据
print(jd['result']['count']['total'])

注释:这里解释下为何需要移除 var data= 因为在获取时字符串前缀是包含var data=的 其不符合json数据格式 因此转化时需将其从请求内容中移除(json格式起始要是{}开头的)

如果数据格式(type为str)是这样的,也可以使用json.loads()解码,得到的就是一个list

    resp = gerrit.get(URL, headers=header, allow_redirects=False)
    resp.text=resp.text[4:]
    print(resp.url)
    data = json.loads(resp.text)
    news = data[0]['branch']
    print("###############")
    print(resp.text)
    print("###############")
    print(news)
    print("###############")
    print(len(data))

把前4个元素去掉,只保留后面的[{...},{...},{...},{...}]这种,直接使用json的loads函数就解决了,得到了一个元素为字典的list

测试代码(即使有无序的空格插在里面,也能解决)

json.load()加载python json格式文件
json.loads()解码python json格式
(先加载,后解码)

以上参考:
https://blog.csdn.net/hanchaobiao/article/details/73150405——python 爬虫如何获取js里面的内容
https://zhuanlan.zhihu.com/p/24838761——Python爬虫实战入门五:获取JS动态内容—爬取今日头条
https://toutiao.io/posts/my6w53/preview——如何轻松爬取网页数据?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335