python爬虫-urllib-微博cookie登录

微博的cookie登录

适用的场景:数据采集的时候 需要绕过登陆 然后进入到某个页面。

import urllib.request
import urllib.parse

url='https://weibo.cn/6872495808/info'

headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
request=urllib.request.Request(headers=headers,url=url)
response=urllib.request.urlopen(request)
content=response.read().decode('utf-8')
with open('weibo.html','w',encoding='utf-8')as fp:
    fp.write(content)

这里发现报错:content=response.read().decode('utf-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 672: invalid start byte
提示说是编码不是utf-8,但是在网页源码中又显示个人信息页面是utf-8 但是还报错了编码错误 因为并没有进入到个人信息页面 而是跳转到了登陆页面。而且登陆页面不是utf-8,所以报错。

接着在登录页面查看网页源码,发现是gb2312于是作以下改动:

with open('weibo.html','w',encoding='gb2312')as fp:

发现还是报编码错误:content=response.read().decode('utf-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 672: invalid start byte
说明问题不是出在这,于是把上面的utf-8也改了:

content=response.read().decode('gb2312')

运行没有报错,但是点开了网页发现并访问到个人页面,而是停留在登陆页面,那么什么情况下会访问不成功?是因为请求头的信息不够,所以访问不成功。
于是在headers加上请求头信息;

# ':authority': 'weibo.cn',
    # ':method': 'GET',
    # ':path': '/6451491586/info',
    # ':scheme': 'https',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    # 'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'zh-CN,zh;q=0.9',
    'cache-control': 'max-age=0',
    #     cookie中携带着你的登陆信息   如果有登陆之后的cookie  那么我们就可以携带着cookie进入到任何页面
    'cookie': 'SUB=_2A25PJAvMDeRhGeBG7FAV-SvEyzSIHXVs5pWErDV6PUJbkdANLUrhkW1NQe-HxmHuuXzmv1a226xtk30RzaYFGJF4; SCF=AiJJMHivyISNdFS_kK1Qy82P8fjCdvJBrbfp-3-ct34jQ8NxasJjUrNpezYZhg4jAti78Z4vprRJhv4ShN22SB0.; SSOLoginState=1646295965; _T_WM=28162820002; WEIBOCN_FROM=1110006030; MLOGIN=1; M_WEIBOCN_PARAMS=uicode%3D20000174%26fid%3D2304136872495808_-_WEIBO_SECOND_PROFILE_WEIBO',
    # referer  判断当前路径是不是由上一个路径进来的    一般情况下 是做图片防盗链
    'referer': 'https://weibo.cn/',
    'sec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',

筛选之后就会发现是cookie在起关键作用,cookie中携带着你的登陆信息,如果有登陆之后的cookie,那么我们就可以携带着cookie进入到任何页面,但是并不是所有的反爬都只有cookie,可能还会有referer等等。
这里我们要把刚刚的gb2312改回utf-8,因为已经请求到个人页面了。
完整代码:

import urllib.request
import urllib.parse

url='https://weibo.cn/6872495808/info'

headers={
    # ':authority': 'weibo.cn',
    # ':method': 'GET',
    # ':path': '/6451491586/info',
    # ':scheme': 'https',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    # 'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'zh-CN,zh;q=0.9',
    'cache-control': 'max-age=0',
    #     cookie中携带着你的登陆信息   如果有登陆之后的cookie  那么我们就可以携带着cookie进入到任何页面
    'cookie': 'SUB=_2A25PJAvMDeRhGeBG7FAV-SvEyzSIHXVs5pWErDV6PUJbkdANLUrhkW1NQe-HxmHuuXzmv1a226xtk30RzaYFGJF4; SCF=AiJJMHivyISNdFS_kK1Qy82P8fjCdvJBrbfp-3-ct34jQ8NxasJjUrNpezYZhg4jAti78Z4vprRJhv4ShN22SB0.; SSOLoginState=1646295965; _T_WM=28162820002; WEIBOCN_FROM=1110006030; MLOGIN=1; M_WEIBOCN_PARAMS=uicode%3D20000174%26fid%3D2304136872495808_-_WEIBO_SECOND_PROFILE_WEIBO',
    # referer  判断当前路径是不是由上一个路径进来的    一般情况下 是做图片防盗链
    'referer': 'https://weibo.cn/',
    'sec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
request=urllib.request.Request(headers=headers,url=url)
response=urllib.request.urlopen(request)
content=response.read().decode('utf-8')
with open('weibo.html','w',encoding='utf-8')as fp:
    fp.write(content)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值