一起学爬虫(Python) — 21 蝉妈妈,嘿嘿

一起学爬虫(Python) — 19 年轻人,进来学自动化

这里呢,还是宣传一下这个跟自动调试有关系的一篇博客,为什么呢,因为她能帮你们自动给我的博客点赞!!!

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第1张图片
诶嘿嘿,各位一定不会想白嫖吧。

蝉妈妈,嘿嘿

  • 前言
  • 蝉妈妈
    • 何为蝉妈妈
    • 今天的目标
    • 了解一下cookies
    • 了解一下蝉妈妈
    • 开冲
    • 全部代码
  • 结尾

前言

经过两到三天的咕咕咕,小泽发现这个浏览量是蹭蹭蹭的往上涨,顿时变得无比纳闷,为什么我不勤奋更新了反而看的人变多了呢…

难道…

这是大家在用事实告诉我,更新是错误的,咕咕咕才是我应该做的吗!

带师,我悟了。

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第2张图片
当然,拖更是不可能的,这辈子也不可能的,其实这段时间小泽在忙一个大项目,是跟腾讯合作的大项目,具体有多大呢,牵扯到的人数有千万级别,里面的利于更是千亿级别的,没错!

这几天我在努力的打王者荣耀。

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第3张图片

然鹅卡在钻石上不去了T-T

气啊,赢一局输一局,这还怎么玩嘛!

只能靠低保过过日子,没有保级卡就不敢开排位。

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第4张图片
所以经过一系列的打击之后呢,就来给大家更新了,绝对不是因为事业不顺哦,完全是心心念念我的小粉丝们好吧!!!

为什么要说这么多废话呢,你是不是看的津津有味,但是你不知道的是,我已经成功的水了将近一千的字数,啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈…

那,废话不多说,咱们开干!

蝉妈妈

何为蝉妈妈

神奇の传送门

蝉妈妈呢,大家可以这么理解,就是一个帮我们统计哪些商品卖的好的一个平台,通过她我们就可以知道如果想要卖东西可以进那些货…当然以上都是我乱说的,因为她已经被我摸透了吧。

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第5张图片

今天的目标

实现模拟登陆,并且爬取登录后查询到的商品信息。

为什么呢,因为如果不是登录状态的话,我们只能获取前10条信息,当然登录后如果不是VIP会员的话也只能获取前50条哦,不过一开始好像是可以免费领取VIP会员的,具体的你们可以去官网了解一下。

如果今天的内容你掌握了呢,你就可以试着绕过很多网站的登录,直接获取登录后的信息。

就是不用输账号密码。

了解一下cookies

为什么要了解cookies呢,我们今天主要解决的就是这个cookies的问题哦。

大家想一下,我们对一个网站进行登录,是不是只需要登录一遍就可以了!

后续再进行修改用户信息,站内查询等等功能的话,都不需要重新登陆吧。那么她是怎么知道我们在进行这些操作的时候,是已经登录的了呢,为什么我们在python里面直接发起请求就不可以呢???

这一切的一切的背后,究竟是道德的沦丧,还是人性的扭曲…欢迎收看午夜节目,小泽的爬虫教学!

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第6张图片
其实啊,这背后都是cookies这个玩意在作祟,我们登录的时候呢,我就会好奇一个问题,到底是登录还是登陆呢?知道的小伙伴把答案打在留言里,这里我就统一暂时先用登录好了,因为登陆的话怎么看都像是登陆,对吧,简直一模一样。

又水了一波字数。

我们在登录的时候,本身就有一个cookies吧,这个cookies呢大家可以理解为登录前的cookies,也就是保存了我们的一些用户信息(不是登陆后的用户信息哦,是我们这个电脑的用户信息),用来跟服务器做交互,然后交配成功的话,服务器就会发给我们一个两条杠的棒棒,对吧,没有开车,这个棒棒里呢,就包含了服务器返回的cookies,也就是联系方式吧,大家以后再来往哈。

然后呢,我们再对这个网站的其他页面进行访问的时候,浏览器就会自动的带上服务器返回的cookies,服务器呢也就不需要我们进行账号密码的输入,也能知道,原来是熟客鸭。

就直接开始那个了嘛。

你懂吧。

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第7张图片
至于cookies里面包含什么呢,大家可以去我的合作伙伴那里,就是百度哦,了解一下,她应该是会告诉你的,如果她也不告诉你,那我再告诉你好了。

这里我们只要知道,我们需要取得登录成功后返回的cookies,然后每次访问的时候把这个cookies戴上去就ok了对吧,那你就要问了,你之前明明说好的用session就行了鸭,怎么这个时候又要手动戴上cookies了呢,无良博主,还我青春!

咳咳,网站的反爬措施也会升级的嘛,别那么讲究啦~

还有哦,cookies一定是在请求头里的,当然你也可以在requests里手动写上,不过我是直接放到headers里,省事。

说真的,打了这么多cookies,我都快不认识cookies了,看到这里的小可爱们点个赞再继续看吧,求求了!!!

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第8张图片

了解一下蝉妈妈

每一位妈妈都是伟大的…

除了蝉妈妈。

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第9张图片
打开一开始给大家的神奇の传送门,会发现这个网站其实还蛮好看的,大家可以在没登录之前,随便搜索一些东西,看一看效果。

这里我们再进去登录界面看一看:

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第10张图片
应该是没有验证码的,我目前还没见到过,如果有说明你有问题。

也就是说我们需要在这个界面进行一个模拟登陆,然后获得服务器给我们返回的cookies值,再把这个值加到我们的headers里面,就可以进行一个登录后的数据搜索了,对吧。

冲呗。

开冲

老规矩,先打开抓包工具,然后登录,这里我们输入一个错的密码就可以了:

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第11张图片
发现有两个包哦,第二个没有数据的嘛,所以不管,直接看第一个:

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第12张图片
点进去看到,里面放着我们的账号和密码,还有一个时间戳,针不戳。

而且还是一个post请求吧:

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第13张图片
同时返回的数据也需要json()一下。

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第14张图片
在请求头里呢,也发现了我们登录前的cookies,因为要交互的嘛,所以就带上吧,还有一个Referer,如果看到这个的话,大家最好是带上,这个东西是证明我们不是通过其他链接访问的。

User-Agent,老朋友了。

headers = {
     
        # 登录前的cookie
        'Cookie': 'Hm_lvt_1f19c27e7e3e3255a5c79248a7f4bdf1=1607054172,1607241195,1607485551,1609118533; Hm_lpvt_1f19c27e7e3e3255a5c79248a7f4bdf1=1609118533; Hm_lvt_ce889f3ae5bf6277ca4cbf05b940acbc=1609118534; Hm_lpvt_ce889f3ae5bf6277ca4cbf05b940acbc=1609118534',
        # 证明我们不是通过外部链接过来的
        'Referer': 'https://www.chanmama.com/login',
        # 浏览器相关的信息啦
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }

不要直接复制我的哦,去复制你那边的去,哼!

然后我们再把我们的登录界面的url放进去~

# 登录页面
downlod_url = 'https://api-service.chanmama.com/v1/access/token'

还有时间戳!

# 时间戳,先弄成整数型的,再弄成字符串
timeStamp = str(int(time.time()))

以及我们发送请求时需要携带的参数!当然也不要忘了手动json化一下,需要导入json的模块哦。

import json
# 发起请求时携带的参数
data = {
     
    'appId': '10000',
    'password': password,
    'timeStamp': timeStamp,
    'username': username,
}

# 对参数json化一下
data = json.dumps(data)

一切都准备好后,就可以对url发起请求啦~

这里为什么是downlod_url呢,因为小泽一开始以为downlod就是登录,好像不是吧,是下载来的吧,唉,英语差就是这样啦。

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第15张图片

import requests
# 发起一个post请求,返回的数据也是json类型的,用res接一下
res = requests.post(downlod_url,headers=headers,data=data).json()

大家可以打印一下res,观察一下返回了一个什么。

各位会发现里面有个token哦,并不是我们想要的cookies。

这里呢,给大家科普一下token和cookies的区别:

cookies呢,可以理解为是比较高级的身份验证,需要的东西比较多,光告诉我们是谁还不够。

而token呢,只要告诉服务器我们是谁就可以了,服务器那边是不会存我们的相关信息的,相对应的cookies是需要进一步跟服务器进行交互验证的。

也就是说,是token的话反而更简单了。

其实一开始看请求头的时候,就该知道是token了:

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第16张图片
在这个Authorization相对应的键值里是空的吧,她就是用来放token的,我们只需要在请求头里放入这个Authorization并且后面带上token就ok了。

# 返回了一个json串,里面有一个键值是'errCode',大家可以自己试一下故意输错密码,或者带错参数,返回的都不是0
# 也就是说只有返回的'errCode'是0的情况下才说明我们登录成功了!
print(res)

既然进行模拟登录了,就要知道我们的登录有没有成功吧,下面就是验证的方法哦。

# 进行登录是否成功的一个验证,返回的键值里面是数字嘛,所以0就不用带引号了
if res['errCode'] == 0:
    print('登陆成功')

    # 处理我们的token,放在请求头中
    headers['Authorization'] = res['data']['token']
    # 这里因为小泽是写在一个函数里的,所以return了一下,你们也可以把上面的都放在函数里
    return headers

else:
    print('没了,看看是密码错了还是参数带错了吧。')

上面的步骤走完之后,我们就拿到了包含有token的请求头信息吧,也就是headers,只要我们用这个headers发起请求,服务器一定会乖乖服从吧,开干吧!

def get_data(headers,key,nums):
    # 搜索界面的url
    url = 'https://api-service.chanmama.com/v1/product/search'

    # 发起请求时携带的参数
    data = {
     
        # 要搜索的东西
        "keyword": key,
        "keyword_type": "",
        "page": 1,
        "price": "",
        # 数量
        "size": nums,
        "filter_coupon": 0,
        "is_aweme_goods": 0,
        "has_live": 0,
        "has_video": 0,
        "tb_max_commission_rate": "",
        "day_pv_count": "",
        "day_order_count": "",
        "big_category": "",
        "first_category": "",
        "second_category": "",
        "platform": "",
        "sort": "day_order_count",
        "order_by": "desc"
    }

    # 这里为什么用json=而不用data=呢,是json可以帮我们跟网页说这个数据你需要自己弄成json串
    # 使用data传参的话,是支持嵌套字典的,两者都可以用,当然这里你也可以选择手动处理一下data
    res = requests.post(url, json=data, headers=headers).json()

    # 用w的话,如果文件不存在会自动创建一个文件,但是每次都会覆盖上一次的内容,也就是说不能累加,如果想追加就用a
    with open('蝉妈妈.txt', 'w', encoding='utf-8') as fp:
        # 如果不懂可以打印一下res看看
        for i in res['data']['list']:
            # 这里可以用%,也可以用format等等,甚至可以手动拼接,方法很多
            print("商品:%s  价格:%s 原价:%s 昨日浏览:%s 昨日销量:%s" % (
                i['title'], i['price'], i['market_price'], i['day_pv_count'], i['day_order_count']))
            # 写入,每一行都要加个换行
            fp.write("商品:%s  价格:%s 原价:%s 昨日浏览:%s 昨日销量:%s\n" % (
                i['title'], i['price'], i['market_price'], i['day_pv_count'], i['day_order_count']))

尽量的把注释写的很明白了,除了一些基础类的,这方面的url呢,是在登录后进行搜索商品的时候抓包找到的,相关的知识前面也重复过很多次了,相信各位勤奋好学的小可爱一定能再学一遍,彻底摸透!

加油,编程人!

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第17张图片

全部代码

import requests
import json
import time

# 获取登录后的cookie
def get_cookies(username,password):
    headers = {
     
        # 登录前的cookie
        'Cookie': 'Hm_lvt_1f19c27e7e3e3255a5c79248a7f4bdf1=1607054172,1607241195,1607485551,1609118533; Hm_lpvt_1f19c27e7e3e3255a5c79248a7f4bdf1=1609118533; Hm_lvt_ce889f3ae5bf6277ca4cbf05b940acbc=1609118534; Hm_lpvt_ce889f3ae5bf6277ca4cbf05b940acbc=1609118534',
        # 证明我们不是通过外部链接过来的
        'Referer': 'https://www.chanmama.com/login',
        # 浏览器相关的信息啦
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }

    # 登录页面
    downlod_url = 'https://api-service.chanmama.com/v1/access/token'

    # 时间戳,先弄成整数型的,再弄成字符串
    timeStamp = str(int(time.time()))

    # 发起请求时携带的参数
    data = {
     
        'appId': '10000',
        'password': password,
        'timeStamp': timeStamp,
        'username': username,
    }

    # 对参数json化一下
    data = json.dumps(data)

    # 发起一个post请求,返回的数据也是json类型的,用res接一下
    res = requests.post(downlod_url,headers=headers,data=data).json()

    # 返回了一个json串,里面有一个键值是'errCode',大家可以自己试一下故意输错密码,或者带错参数,返回的都不是0
    # 也就是说只有返回的'errCode'是0的情况下才说明我们登录成功了!
    # print(res)

    # 进行登录是否成功的一个验证,返回的键值里面是数字嘛,所以0就不用带引号了
    if res['errCode'] == 0:
        print('成功取得cookies!')

        # 处理我们的cookies
        headers['Authorization'] = res['data']['token']
        return headers

    else:
        print('没了,看看是密码错了还是参数带错了吧。')

def get_data(headers,key,nums):
    # 搜索界面的url
    url = 'https://api-service.chanmama.com/v1/product/search'

    # 发起请求时携带的参数
    data = {
     
        # 要搜索的东西
        "keyword": key,
        "keyword_type": "",
        "page": 1,
        "price": "",
        # 数量
        "size": nums,
        "filter_coupon": 0,
        "is_aweme_goods": 0,
        "has_live": 0,
        "has_video": 0,
        "tb_max_commission_rate": "",
        "day_pv_count": "",
        "day_order_count": "",
        "big_category": "",
        "first_category": "",
        "second_category": "",
        "platform": "",
        "sort": "day_order_count",
        "order_by": "desc"
    }

    # 这里为什么用json=而不用data=呢,是json可以帮我们跟网页说这个数据你需要自己弄成json串
    # 使用data传参的话,是支持嵌套字典的,两者都可以用,当然这里你也可以选择手动处理一下data
    res = requests.post(url, json=data, headers=headers).json()

    # 用w的话,如果文件不存在会自动创建一个文件,但是每次都会覆盖上一次的内容,也就是说不能累加,如果想追加就用a
    with open('蝉妈妈.txt', 'w', encoding='utf-8') as fp:
        # 如果不懂可以打印一下res看看
        for i in res['data']['list']:
            # 这里可以用%,也可以用format等等,甚至可以手动拼接,方法很多
            print("商品:%s  价格:%s 原价:%s 昨日浏览:%s 昨日销量:%s" % (
                i['title'], i['price'], i['market_price'], i['day_pv_count'], i['day_order_count']))
            # 写入,每一行都要加个换行
            fp.write("商品:%s  价格:%s 原价:%s 昨日浏览:%s 昨日销量:%s\n" % (
                i['title'], i['price'], i['market_price'], i['day_pv_count'], i['day_order_count']))

if __name__ == '__main__':
    # 这里面输入你的账号和密码(第一个参数是带有登录后cookies的headers,第二个参数是要搜索的商品,第三个参数是要的数量,不是vip的话最多50条)
    # get_cookies(账号,密码)会返回一个有登录后cookies的headers,当然,你得把你的账号密码写进去,是以字符串的形式哦
    get_data(get_cookies('',''),'丝袜',50)

结尾

我干饭去了,拜拜。

哦对了,如果你需要一个可以交流的地方的话,可以考虑一下这里:

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第18张图片
170个妹纸,快来撩妹吧!

干饭人,干饭魂,谈恋爱哪有干饭香。

一起学爬虫(Python) — 21 蝉妈妈,嘿嘿_第19张图片

你可能感兴趣的:(爬虫,python,cookie,token,爬虫,蝉妈妈)