python:3.7.4
python库:requests-html
IDE:pycharm2019.3版本
爬取网址: https://weibo.cn
抓包分析工具Fiddle
chrome浏览器
模拟登录是为了拿到Cookies,这样可以像自己登录微博一样可以看所有内容,没有cookie只能看游客才能访问的内容
第一步:清除chrome的登录cookie
chrome->历史记录->清除浏览记录->选择cookie
这样才能最真实的模拟登录场景
第二步:打开weibo.cn网站进入登录界面但不要输入账号密码
第三步:打开Filddle(Filddle的设置请查看入门系列一)
第四步:输入账号密码登录
如果Fiddle显示内容过多,可以右击选择remove->all sessions再点击登录抓包
找到登录的数据包
双击进入,选择右边的WebForms
这些就是我们需要构造的post请求参数
下面就可以编写代码模拟登录去获取cookie了
下面放出代码,代码中只需要根据获取的form表单构造post请求的参数和浏览器头部,然后输入微博账号和密码即可
另外需要说明一下,用自己的电脑模拟登录极有可能出现一种错误叫做
Error: HTTPSConnectionPool(host='passport.weibo.cn', port=443): Max retries exceeded with url
这个有两种解决方法
第一种是post请求代码改为
session.post(url=url, data=post_data, headers=headers, verify=False)
第二种是把post改为循环请求,如果获取不到结果就sleep五秒继续请求,直到成功
最后获取的是cookies和mid,mid是自己微博账号的id,微博是根据id来区分用户的
#!/bin/bash python
# -*- coding: UTF-8 -*-
from requests_html import HTMLSession
import traceback
class GetCookies(object):
def __init__(self, username, password):
self.username = username
self.password = password
# 通过fiddler抓包分析模拟登陆的form表单,获取cookies和自己账号的uid
def get_cookies(self):
try:
session = HTMLSession()
url = 'https://passport.weibo.cn/sso/login'
post_data = {
'username': self.username,
'password': self.password,
'savestate': '1',
'r': 'https://weibo.cn/',
'ec': '0',
'pagerefer': 'https://weibo.cn/pub/',
'entry': 'mweibo',
'wentry': '',
'loginfrom': '',
'client_id': '',
'code': '',
'qq': '',
'mainpageflag': '1',
'hff': '',
'hfp': ''
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
'Referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https%3A%2F%2Fweibo.cn%2F&backTitle=%CE%A2%B2%A9&vt=',
'Host': 'passport.weibo.cn',
'Origin': 'https://passport.weibo.cn',
'Content-Type': 'application/x-www-form-urlencoded',
'Connection': 'close'
}
r = session.post(url=url, data=post_data, headers=headers)
mid = r.json()['data']['uid']
return r.cookies, mid
except Exception as e:
print('Error:', e)
traceback.print_exc()