路飞学城-python爬虫密训-第二章
(一)学习心得
第二章的python爬虫密训,又有新的模块Flask,time,re(正则表达式);这次是一步步去爬取web微信的相关信息,怎么讲,也许自己没有前期网页开发相关学习,学习有点难度,希望自己在这短暂7天学习中,先学会掌握爬虫思路,基础知识只能课下好好恶补,因为爬虫不是你想爬就能爬。它需要综合性计算机知识。
(二)知识点总结
Web微信示例
基于Flask开发Web微信
1. 基于Flask编写登录页面:显示二维码
From flask import Flask,request,render_template
Import time
Import re
App=flask(_name_)
App.debug=True
@app.route(“/login”,methods=[“GET”,”POST”])
Def login():
If request.method==”GET”:
ctime=str((int(time.time()*1000)
qcode_url=” https://login.wx.qq.com......&fun=new&lang=zh_CN&_={0}.format(ctime)”
ret=requests.get(qcode_url)
print(ret.text)
qcode =re.findall(“uuid=”(.*)”:”,ret.text)[0]
print(qcode)
return render_template(“login.html”)
else:
pass
if _name_==”__main__”:
app.run()
学会:
a. 去上部请求中查找想要的内容
b. chrome,network
c. requests
2. 二维码变
检查用户是否已经扫码、登录:(将请求夯住) https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=QbeUOBatKw==&tip=0&r=-1036255891&_=1525749595604
扫码: - 显示头像
登录: - 获取凭证信息
<error>
<ret>0</ret>
<message></message>
<skey>@crypt_2ccf8ab9_70b4bfadb5aeb520357d4ecf46c23713</skey>
<wxsid>xryEESU5QgXX61ji</wxsid>
<wxuin>981579400</wxuin>
<pass_ticket>3nIORdKsOyenOh1%2FoH4U17Qhw8YBkGHJl%2BfqVvaoGoDnmBoQxEJdA%2BZyuHixW1Ow</pass_ticket>
<isgrayscale>1</isgrayscale>
</error>
{
'ret': '0',
'message': '',
'skey': '@crypt_2ccf8ab9_3e9a7a5405ef2aef30811783fe0dc14e',
'wxsid': 'R/KWc/xr3zkb0ain',
'wxuin': '981579400',
'pass_ticket': 'er8kY4ydtTlfttnRyYNsl%2FXsopxPV6o06LNQRlWAqN0CfhkHX2VE0wDb8u8Vo9hr',
'isgrayscale': '1'
}
3. 用户初始化
发送POST请求:
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=-1039465096&lang=zh_CN&pass_ticket=q9TOX4RI4VmNiHXW9dUUl1oMzoQK2X2f3H3kn0VYm5YGNwUMO2THYMznv8DSXqp0
data = {
"BaseRequest":{
"DeviceID":"e750865687999321"
Sid:"/xhn2u7d5BL7s+xP"
Skey:"@crypt_2ccf8ab9_10519e7b5c402ccdeb2c3f100ea3a521"
Uin:"981579400"
}
}
4. 获取联系人列表
getContactList
总结 1. url 2. 响应 3. cookie 4. chrome
PS:
轮训
长轮训
Websocket
5.高性能相关
任务:批量发送请求
方案:
-买电脑
-写程序
-开线程
-单线程
本质:-浏览器本质,socket客户端遵循http协议(通过\r\n分割的规范+请求响应断开连接=》无状态、短链接)
url=“www.cnblongs.com ”
sk=socket.socket()
#连接的过程是:阻塞
sk.connect((url,80))
#http协议
content=“ ...... ”%url
sk.sendall(content.encode(“utf-8 ”))
#等待服务端返回内容:阻塞
data=sk.recv(8096)
print(data)
sk.close()
6.IO多路复用
目标:用于监听多个socket对象是否发生变化。
import select(需要记下来哦!)
while True:
#让select模块帮助我们去检测sk1/sk2两个socket对象是否已经发生“变化”
r=[]
如果r中有值
r=[sk1,] 表示:sk1这个socket已经获取到响应的内容
r=[sk1,sk2] 表示:sk1,sk2这两个socket已经获取到响应的内容
w=[],如果w中有值
w=[sk1,] 表示:sk1这个socket已经连接成功
w=[sk1,sk2] 表示:sk1,sk2这两个socket已经连接成功
r,w,e=select.select([sk1,sk2],[sk1,sk2],[],0.5)