python高级应用程序课程_Python高级应用程序设计任务

需求:

登录sina微博手机版

登录url:https://passport.weibo.cn/signin/login

1、登录

2、获取50个博文信息

输出:

博主名

博文的前10个字符

3、查找第二个需要访问的 request

我们的这里的功能是先登录、再获取博文

第一个功能是 登录

登录会使用到 用户名和密码

但是密码一般会被转码,搜索 密码 不保险

那么我们搜索 用户名, 如果用户名是邮箱,记住不要搜索@,

那么在我这里就搜索 51508690@qq.com 用户名中的 51508690 字符串

搜索的范围是:

这种登录提交,肯定是 post, 而且 用户名、密码,只会出现在 request 的请求体中

搜索后,找到url: https://passport.weibo.cn/sso/login

headers:

Refererhttps://passport.weibo.cn/signin/login

params: 没有

data or json:

form表单数据:

username51508690@qq.com # 用户名

passwordmumu2018 # 密码

savestate1

r

ec0

pagerefer

entrymweibo

wentry

loginfrom

client_id

code

qq

mainpageflag1

hff

hfp

执行post 请求, 登录成功

4、查找 获取博文 的请求

不要搜索 中文、特殊字符

而是去寻找 不易重复的 字母+数字+_ 组成的 字符串

找到 Antares 这样一个字符串

在 response 范围内查找

找到: https://m.weibo.cn/feed/friends?

PS: 如果找到多个, 记住, 请求时间最靠前的是正确的

因为是GET请求,没有 data

headers:

Refererhttps://m.weibo.cn/

params:

没有

发送 get 请求, 得到第一页20条的博文信息的 json 内容

5、要查找另外的 30 条 或者 更多 博文

在 后续的(前20条博文以后的)博文中, 查找 可以用于 搜索的关键字

iphone7

在 response 范围内,搜索 iphone7

查找到url: https://m.weibo.cn/feed/friends?max_id=4304071526186165

比第一页的请求多了一个 max_id=4304071526186165

4304071526186165: 这个 value 不可能是固定值, 确定是 动态值

在 response 范围中 搜索 4304071526186165

找到多个response包含, 确定一个请求:

https://m.weibo.cn/feed/friends?max_id=4304079469074017

同样的方式 搜索 4304079469074017

找到: https://m.weibo.cn/feed/friends?

获取第一页的时候, 得到一个 next_cursor, 指向下一页的 max_id

classSinaWeiboMobileSpider:def __init__(self,username,password):#self.session = make_session()

self.session =requests.session()#不检验 https 证书

self.session.verify =False#设置不信任系统代理,并且不启用

self.session.trust_env =False#设置默认的headers

self.session.headers ={'Connection': 'keep-alive','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36','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.9'}

self.username=username

self.password=password

self.index= 1

defvisit_signin_login(self):"""访问登录的第一个请求

:return:"""url= 'https://passport.weibo.cn/signin/login'self.session.get(url)print('访问登录页面')defvisit_sso_login(self):"""发送登录请求

:return:"""url= 'https://passport.weibo.cn/sso/login'headers={'Referer': 'https://passport.weibo.cn/signin/login'}

data={'username': self.username,'password': self.password,'savestate': '1','r': '','ec': '0','pagerefer': '','entry': 'mweibo','wentry': '','loginfrom': '','client_id': '','code': '','qq': '','mainpageflag': '1','hff': '','hfp': ''}

response= self.session.post(url,data=data,headers=headers)#使用 json库 转换 响应文本内容为 json格式

text =response.text

json_data=json.loads(text)#使用 requests 的 response 的 json() 方法

#json_data = response.json()

#登录成功返回状态码是: 20000000

if json_data['retcode'] == 20000000:print('登录成功')else:print('登录失败')

2种不同的访问方式:

1、访问第一页时,没有 max_id

url直接是: https://m.weibo.cn/feed/friends?

get 请求

headers 中 有一个 Referer

2、访问 第二页到第N页 时, 需要根据 一个参数 max_id 来确定页码

而这个 max_id 是上一页的 博文数据 中的 json内容中的 json_data['data']['next_cursor']

url 是:https://m.weibo.cn/feed/friends?max_id=4304099472257457

即你访问第一页数据时,可以根据返回的 next_cursor

拼接处 访问第二页的 url: https://m.weibo.cn/feed/friends?max_id=上一页获取的next_cursor

访问第二页时,可以根据返回的next_cursor得到第三页的 url

以此类推

除了第一页,后续的数据都是根据上一页的 next_cursor 来进行访问的

:param max_id: url参数

:return:"""# 有 max_id 代表不是第一页博文

if max_id:

# 进行url的拼接

url = 'https://m.weibo.cn/feed/friends?max_id=' + str(max_id)

# max_id 为 None时, 访问获取第一页的博文数据

else:

url = 'https://m.weibo.cn/feed/friends?'

headers = {

'Referer': 'https://m.weibo.cn/'

}

response = self.session.get(url,headers=headers)

json_data = response.json()

# 得到 博文数据 列表

statuses = json_data['data']['statuses']

# 得到 获取 下一页博文数据 的 max_id

next_cursor = json_data['data']['next_cursor']

# 遍历 博文数据 列表

for statuse in statuses:

print(f"第{self.index}条 博主:{statuse['user']['screen_name']}, 博文:{statuse['text']}")

self.index += 1

return next_cursor

def visit_friends_by_page_num(self,page_num=1):"""获取指定页码数的博文信息

:param page_num: 多少页

:return:"""next_cursor = None

# 根据次数循环控制

# 当循环的 数值没有作用时, 使用 _ 来代表

for _ in range(page_num):

next_cursor = self._visit_friends(next_cursor)

if __name__ == '__main__':

username = '17393199931'

password = 'mjm19970201'

sina_weibo_mobil_spider = SinaWeiboMobileSpider(username,password)

sina_weibo_mobil_spider.visit_signin_login()

sina_weibo_mobil_spider.visit_sso_login()

sina_weibo_mobil_spider.visit_friends_by_page_num(50)

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值