一起学爬虫(Python) — 19 年轻人,进来学自动化
这里呢,还是宣传一下这个跟自动调试有关系的一篇博客,为什么呢,因为她能帮你们自动给我的博客点赞!!!
经过两到三天的咕咕咕,小泽发现这个浏览量是蹭蹭蹭的往上涨,顿时变得无比纳闷,为什么我不勤奋更新了反而看的人变多了呢…
难道…
这是大家在用事实告诉我,更新是错误的,咕咕咕才是我应该做的吗!
带师,我悟了。
当然,拖更是不可能的,这辈子也不可能的,其实这段时间小泽在忙一个大项目,是跟腾讯合作的大项目,具体有多大呢,牵扯到的人数有千万级别,里面的利于更是千亿级别的,没错!
这几天我在努力的打王者荣耀。
然鹅卡在钻石上不去了T-T
气啊,赢一局输一局,这还怎么玩嘛!
只能靠低保过过日子,没有保级卡就不敢开排位。
所以经过一系列的打击之后呢,就来给大家更新了,绝对不是因为事业不顺哦,完全是心心念念我的小粉丝们好吧!!!
为什么要说这么多废话呢,你是不是看的津津有味,但是你不知道的是,我已经成功的水了将近一千的字数,啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈…
那,废话不多说,咱们开干!
神奇の传送门
蝉妈妈呢,大家可以这么理解,就是一个帮我们统计哪些商品卖的好的一个平台,通过她我们就可以知道如果想要卖东西可以进那些货…当然以上都是我乱说的,因为她已经被我摸透了吧。
实现模拟登陆,并且爬取登录后查询到的商品信息。
为什么呢,因为如果不是登录状态的话,我们只能获取前10条信息,当然登录后如果不是VIP会员的话也只能获取前50条哦,不过一开始好像是可以免费领取VIP会员的,具体的你们可以去官网了解一下。
如果今天的内容你掌握了呢,你就可以试着绕过很多网站的登录,直接获取登录后的信息。
就是不用输账号密码。
为什么要了解cookies呢,我们今天主要解决的就是这个cookies的问题哦。
大家想一下,我们对一个网站进行登录,是不是只需要登录一遍就可以了!
后续再进行修改用户信息,站内查询等等功能的话,都不需要重新登陆吧。那么她是怎么知道我们在进行这些操作的时候,是已经登录的了呢,为什么我们在python里面直接发起请求就不可以呢???
这一切的一切的背后,究竟是道德的沦丧,还是人性的扭曲…欢迎收看午夜节目,小泽的爬虫教学!
其实啊,这背后都是cookies这个玩意在作祟,我们登录的时候呢,我就会好奇一个问题,到底是登录还是登陆呢?知道的小伙伴把答案打在留言里,这里我就统一暂时先用登录好了,因为登陆的话怎么看都像是登陆,对吧,简直一模一样。
又水了一波字数。
我们在登录的时候,本身就有一个cookies吧,这个cookies呢大家可以理解为登录前的cookies,也就是保存了我们的一些用户信息(不是登陆后的用户信息哦,是我们这个电脑的用户信息),用来跟服务器做交互,然后交配成功的话,服务器就会发给我们一个两条杠的棒棒,对吧,没有开车,这个棒棒里呢,就包含了服务器返回的cookies,也就是联系方式吧,大家以后再来往哈。
然后呢,我们再对这个网站的其他页面进行访问的时候,浏览器就会自动的带上服务器返回的cookies,服务器呢也就不需要我们进行账号密码的输入,也能知道,原来是熟客鸭。
就直接开始那个了嘛。
你懂吧。
至于cookies里面包含什么呢,大家可以去我的合作伙伴那里,就是百度哦,了解一下,她应该是会告诉你的,如果她也不告诉你,那我再告诉你好了。
这里我们只要知道,我们需要取得登录成功后返回的cookies,然后每次访问的时候把这个cookies戴上去就ok了对吧,那你就要问了,你之前明明说好的用session就行了鸭,怎么这个时候又要手动戴上cookies了呢,无良博主,还我青春!
咳咳,网站的反爬措施也会升级的嘛,别那么讲究啦~
还有哦,cookies一定是在请求头里的,当然你也可以在requests里手动写上,不过我是直接放到headers里,省事。
说真的,打了这么多cookies,我都快不认识cookies了,看到这里的小可爱们点个赞再继续看吧,求求了!!!
每一位妈妈都是伟大的…
除了蝉妈妈。
打开一开始给大家的神奇の传送门,会发现这个网站其实还蛮好看的,大家可以在没登录之前,随便搜索一些东西,看一看效果。
这里我们再进去登录界面看一看:
也就是说我们需要在这个界面进行一个模拟登陆,然后获得服务器给我们返回的cookies值,再把这个值加到我们的headers里面,就可以进行一个登录后的数据搜索了,对吧。
冲呗。
老规矩,先打开抓包工具,然后登录,这里我们输入一个错的密码就可以了:
发现有两个包哦,第二个没有数据的嘛,所以不管,直接看第一个:
点进去看到,里面放着我们的账号和密码,还有一个时间戳,针不戳。
而且还是一个post请求吧:
在请求头里呢,也发现了我们登录前的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就是登录,好像不是吧,是下载来的吧,唉,英语差就是这样啦。
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了:
在这个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呢,是在登录后进行搜索商品的时候抓包找到的,相关的知识前面也重复过很多次了,相信各位勤奋好学的小可爱一定能再学一遍,彻底摸透!
加油,编程人!
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)
我干饭去了,拜拜。
哦对了,如果你需要一个可以交流的地方的话,可以考虑一下这里:
干饭人,干饭魂,谈恋爱哪有干饭香。