目录
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字符串拼接是明文)
以上参考, 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": "[[email protected]](mailto:[email protected])",
"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——如何轻松爬取网页数据?