Python3 学习札记(四)

参考‘逆風的薔薇’的教程,《Python3爬虫》-登录知乎

抓包

关于fiddler的https抓包的设置说明,可以参考fiddler设置
这里写图片描述

请求报头如下:
这里写图片描述

登录表格如下:
这里写图片描述

报头原始信息如下:
这里写图片描述

回应报文如下:
这里写图片描述

代码


import urllib.request, gzip, re, http.cookiejar, urllib.parse
import sys

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

# 解压缩函数
def ungzip(data):
    try:
        print('正在解压...')
        data = gzip.decompress(data)    # compress压缩字符串,decompress解压字符串
        print('解压完毕...')
    except:
        print('未经压缩,无需解压...')
    return data

# 构造头文件
def getOpener(header):
    cookieJar = http.cookiejar.CookieJar()
    cp = urllib.request.HTTPCookieProcessor(cookieJar)
    opener = urllib.request.build_opener(cp)
    headers = []
    for key, value in header.items():
        elem = (key, value)
        headers.append(elem)
    opener.addheaders = headers
    return opener

# 读取知乎首页内容,获取_xsrf
def getXsrf(data):
    cer = re.compile(r'name="_xsrf" value="(.*)"')    # 生成一个正则表达式对象
    strlist = cer.findall(data)
    return strlist[0]

# 根据网站报头信息设置headers
headers = {
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Encoding':'gzip, deflate, br',
    'Accept-Language':'zh-CN,zh;q=0.8',
    'Connection':'keep-alive',
    'Cookie':'q_c1=5ba08c6bcdab4f98a1a97d11e8495b4d|1500197738000|1500197738000; q_c1=518c3d9c141b4bccb3880967131e2186|1500197738000|1500197738000; _zap=fe3234c0-7501-46a9-aa56-1e063b4db236; d_c0="AJCC4CQEGAyPTnpsYIUvHfLyAZZV90itz4U=|1500550129"; aliyungf_tc=AQAAAIXyYgtb4wgAwlle2vrlgFbgWuEs; r_cap_id="YmQzM2M4NGM0OWEyNDZjOTgzMzVkYjExZWJmOWY0ODA=|1501204860|234a91444bb4abaf6649d0b09bec238e7fa9116d"; cap_id="MThlM2NhNThkZGMxNDEwZDk4NDJkZWUyMGEwNDQ1ZGM=|1501204860|aa98ec79f2d7e47a23093e585f5e169cfe5fc938"; __utma=51854390.53179949.1500550131.1501145531.1501204872.4; __utmb=51854390.0.10.1501204872; __utmc=51854390; __utmz=51854390.1501204872.4.4.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmv=51854390.000--|2=registration_date=20130923=1^3=entry_date=20170716=1; z_c0=Mi4wQUFDQVRWa2VBQUFBa0lMZ0pBUVlEQmNBQUFCaEFsVk5xeDZpV1FDZnlVZGdNd25qUUJZdzZ4bUVMb280NUJIY0hR|1501204907|4257cba0b18f221671cebfe447222423c313b756; _xsrf=2a40b36a-26fa-4132-a068-a25bf1d14385',
    'Host':'www.zhihu.com',
    'Referer':'https://www.zhihu.com/',
    'Upgrade-Insecure-Requests':'1',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36'
}

url = 'https://www.zhihu.com/'
req = urllib.request.Request(url, headers=headers)
res = urllib.request.urlopen(req)   # method仍为GET

# 读取知乎首页内容,获得_xsrf
data = res.read()
data = ungzip(data)
_xsrf = getXsrf(data.decode('utf-8'))

opener = getOpener(headers)

# post数据接收和处理的页面(我们要向这个页面发送我们构造的post数据)
url += 'login/phone_num'    # 根据fiddler确定登录的url
# url += '#login'
name = '********'
password = '********'

# 分析构造post数据
postDict = {
    # 这部分都需要哪些参量?
    '_xsrf':_xsrf,
    'phone_num':name,
    'password':password,
}

# 给post数据编码
postData = urllib.parse.urlencode(postDict).encode('utf-8')

# 构造请求
res = opener.open(url, postData)
data = res.read()

# req = urllib.request.Request(url, data=postData, headers=headers)
# res1 = urllib.request.urlopen(req)
# data = res1.read()

# 解压缩
data = ungzip(data)
print(data.decode())

运行结果

这里写图片描述

笔记

  • 调试过程中显示method not allowed,检查发现是url不对,误以为是浏览器网址中的https://www.zhihu.com/#login,计算机方面知识储备不足,应该严格按照抓包结果为https://www.zhihu.com/login/phone_num
    这里写图片描述

  • 获取_xsrf时需要通过正则表达式匹配,可以通过匹配正则表达式来实现,正则表达式可以参考变量data
    这里写图片描述

  • 知乎回传的数据是经过gzip压缩之后的数据,可以通过gzip.compress/decompress实现对字符串的压缩和解压缩。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值