今日のコードは、Renren.comへのシミュレートされたログインです。
- ログインボタンをクリックすると、POSTリクエストが開始されます
- POSTリクエストには、ログイン前に入力されたログイン情報(ユーザー名、パスワード、確認コードなど)が含まれます。
- 検証コードの機能:毎回動的に変更
- print(response.status_code)、対応するステータスコードを確認します。200の場合、シミュレーションログインは成功します。
- エラーがある場合は、URLと運ばれるパラメータにエラーがあるはずです。
2つ目の問題は、ユーザーのパーソナルセンターに直接アクセスすると、アクセス後のページはログインページであるが、パーソナルホームページのページデータに直接アクセスできないことです。理由は次のとおりです。-
2回目がパーソナルホームページのページリクエストに基づいて開始された場合、サーバーエンドは、リクエストがログイン状態のリクエストに基づいていることを知りません。
現時点ではCookieが使用されます。
- Cookie:重要な機能は、サーバーがクライアントの状態を記録できるようにすることです。
- 手動処理:パケットキャプチャツールを使用してその値を取得し、ヘッダーにカプセル化します。(あまり用途が広いわけではありません)
- 自動処理:
- cookie値のソースはどこにありますか?
- シミュレートされたログインPOST要求の後にサーバーによって作成されます。
- セッションオブジェクト:
- 役割:1。リクエストを送信できます。
2.リクエスト中にCookieが生成された場合、そのCookieはセッションオブジェクトに自動的に保存/保存されます。
- 役割:1。リクエストを送信できます。
- cookie値のソースはどこにありますか?
Cookieの操作方法:
1。セッションオブジェクトを作成します:session = requests.Session()
2。セッションオブジェクトを使用して、シミュレートされたログインPOSTリクエストを送信します(Cookieはセッションに保存され
ます)3。セッションオブジェクトの個人ホームページのgetリクエスト送信(クッキーを運ぶ)
コードをアップロード
import requests
from lxml import etree
from hashlib import md5
#超级鹰示例代码
class Chaojiying_Client(object):
def __init__(self, username, password, soft_id):
self.username = username
password = password.encode('utf-8')
self.password = md5(password).hexdigest()
self.soft_id = soft_id
self.base_params = {
'user': self.username,
'pass2': self.password,
'softid': self.soft_id,
}
self.headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
def PostPic(self, im, codetype):
"""
im: 图片字节
codetype: 题目类型 参考 http://www.chaojiying.com/price.html
"""
params = {
'codetype': codetype,
}
params.update(self.base_params)
files = {
'userfile': ('ccc.jpg', im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
return r.json()
def ReportError(self, im_id):
"""
im_id:报错题目的图片ID
"""
params = {
'id': im_id,
}
params.update(self.base_params)
r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
return r.json()
#创建Session对象
session = requests.Session()
#获取数据
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36'
}
url = 'http://www.renren.com/SysHome.do'
page_text = requests.get(url=url,headers=headers).text
#实例化解析数据,获取相应的验证码图片
tree = etree.HTML(page_text)
code_img_src = tree.xpath('//*[@id="verifyPic_login"]/@src')[0]
code_img_data= requests.get(url=code_img_src,headers=headers).content
with open('./codedata.jpg','wb') as fp:
fp.write(code_img_data)
#使用超级鹰的示例代码对验证码进行识别
if __name__ == '__main__':
chaojiying = Chaojiying_Client('a1372431588', '970110yy', '905384') #用户中心>>软件ID 生成一个替换 96001
im = open('codedata.jpg', 'rb').read() #本地图片文件路径 来替换 a.jpg
a =chaojiying.PostPic(im, 1902)
print(a)
#post请求的发送(模拟登陆)
login_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20204110256'
data = {
'email': '18234504765',
'icode': a,
'origURL':'http://www.renren.com/home',
'domain': 'renren.com',
'key_id': '1',
'captcha_type': 'web_login',
'password': '97ea2d9e82a391b42e834975b7a8d552db313437c3646e6b473fe5ab845e858e',
'rkey': '3f674e5c4940658971a514b5bdb19571',
'f': 'http%3A%2F%2Fwww.renren.com%2F974497470',
}
#利用下述可以查看响应状态码,如果是200,说明模拟登陆成功,查看状态码是一种通用方式
#使用session进行post请求的发送
response =session.post(url=login_url,headers=headers,data=data)
print(response.status_code)
#爬取当前用户个人主页对应的页面数据
detail_url = 'http://www.renren.com/974497470/profile'
detail_page_text = session.get(url=detail_url,headers=headers).text
with open('yonghu.html','w',encoding='utf-8') as fp:
fp.write(detail_page_text)
コードには詳細なコメントがあります。
操作結果のステータスコードは200で、シミュレートされたログインは成功しています。