PythonクローラーはログインをシミュレートしますRenren.com

シミュレートされたログイン:特定のユーザーに基づいてユーザー情報をクロールします。

要件1:Renrenでシミュレートされたログインを実行します。

  • ログインボタンをクリックすると、POSTリクエストが開始されます
  • POSTリクエストには、ログイン前に入力された関連するログイン情報(ユーザー名、パスワード、確認コードなど)が含まれます。
  • 確認コード:リクエストするたびに変更されます

要件2:現在のユーザーの関連するユーザー情報をクロールします(個人のホームページに表示されるユーザー情報)

http / httpsプロトコル機能:ステートレス。

対応するページデータを要求しない理由:

個人のホームページページに基づいて2番目の要求を開始するとき、サーバーは、要求がログイン状態の要求に基づいていることを認識しません。

Cookie:サーバーがクライアントの状態を記録できるようにするために使用されます。

  • 手動処理​​:パケットキャプチャツールを使用してCookie値を取得し、その値をヘッダーにカプセル化します。(推奨されません)
  • 自動処理:
    -Cookie値のソースはどこにありますか?
    -ログインPOSTリクエストをシミュレートした後、サーバーによって作成されます。

セッションオブジェクト:
役割:

  1. リクエストを送信できます。
  2. リクエスト中にCookieが生成された場合、Cookieはセッションオブジェクトに自動的に保存/保存されます。
    -セッションオブジェクトの作成:session = requests.Session()
    -ログインセッションオブジェクトを使用して送信リクエストの送信をシミュレートします(Cookieはセッションに保存されます)
    -送信リクエストの取得に対応する個人のホームページの対象となるセッション(クッキーを運ぶ)

1. http://www.renren.com/にリクエストを送信して、以下のページのソースコードを取得します

ここに画像の説明を挿入します

2.ページで確認コードの画像を見つけ、imgタグのsrc属性の値を取得し、srcのURLにgetリクエストを送信して確認コードの画像をローカルに保存してから、SuperEagleコーディングを使用します識別のためにローカルに保存された検証コードイメージへのプラットフォーム

ここに画像の説明を挿入します

3.ログインボタンをクリックしてブラウザからパケットをキャプチャし、ブラウザがサーバーにPOSTリクエストを送信したことを確認します。リクエストされたURLはhttp://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=202112910495です。 、今回のキャプチャ要求されたデータパケットについて、応答ヘッダー情報にset-cookieがあるかどうかを確認します。ある場合は、要求が確認されたときにサーバーがクライアントのセッションオブジェクトを作成し、cookieが作成されてに返されます。ストレージ用のクライアント。

ここに画像の説明を挿入します
ここに画像の説明を挿入します
案の定、set-cookiesが存在します。したがって、requestsモジュールを使用してログインをシミュレートする場合、開始された要求もcookieを伝送する必要があります。では、Cookieはどのようにリクエストに含まれるのでしょうか。

  • リクエストモジュールは、2つの方法でCookieを処理します。
  1. Cookieは、パケットキャプチャツールから手動で取得され、リクエストリクエストのヘッダーにカプセル化され、ヘッダーがリクエストメソッドに適用されます。(推奨されません)
headers = {
    
    
    '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',
    'Cookie':'xxxxxxxxx'
}
  1. セッションオブジェクトを作成し、セッションオブジェクトを使用してリクエストを送信します。Cookieはセッションで自動的に実行され、処理されるためです。(推奨)
#创建会话对象,该会话对象可以调用get和post发起请求
session = requests.Session()
page_text = session.get(url=url,headers=headers).text
......

4. Webサイトのログインをキャプチャしたところ、要求されたURLはhttp://www.renren.com/974713149であり、必要な応答はログインに成功した後のホームページであることがわかりました。したがって、このURLにリクエストを送信し、シミュレートされたリクエストヘッダーUser-Agent、Referer、Cookieに注意してください。

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

5.取得リクエストをhttp://www.renren.com/974713149/profileに送信して、次の個人ホームページのソースコードを取得します。

ここに画像の説明を挿入します

コードデモ:

  1. Cookieは、パケットキャプチャツールから手動で取得され、リクエストリクエストのヘッダーにカプセル化され、ヘッダーがリクエストメソッドに適用されます。(推奨されません)
# 编码流程:
#     1.验证码的识别,获取验证码图片的文字数据
#     2.对get请求进行发送
#     3.对响应数据进行持久化存储

import requests
from lxml import etree
from hashlib import md5


# 封装识别验证码图片的函数
def getCodeText(userName, password, appId, imgUrl):
    class Chaojiying_Client(object):

        def __init__(self, username, password, soft_id):
            self.username = username
            password = password.encode('utf8')

            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()

    if __name__ == '__main__':
        chaojiying = Chaojiying_Client(userName, password, appId)  # 用户中心>>软件ID 生成一个替换 96001
        im = open(imgUrl, 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
        # print(chaojiying.PostPic(im, 1902))  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    return chaojiying.PostPic(im, 1902)



# 1.对验证码图片进行捕获和识别
headers = {
    
    
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
        'Referer': 'http://www.renren.com/SysHome.do',
        'Cookie': 'anonymid=klgdsqz5n7c6dn; depovince=ZGQT; _r01_=1; JSESSIONID=abcqWHDNhNOVf95ntfjFx; taihe_bi_sdk_uid=926da97ed7bdff5fc3ece47fdd554b0b; taihe_bi_sdk_session=ffa92a5a812142ba8dac302676d881cd; ick_login=426dff64-6952-4319-8c8f-96ea6f498550; first_login_flag=1; [email protected]; ln_hurl=http://hdn.xnimg.cn/photos/hdn421/205/2035/h_main_9aN0_0c1b00037b06195a.jpg; wp_fold=0; jebecookies=c2363801-e587-4f54-8566-24b86aa22659|||||; _de=B3D043F455F38852340E4CEC836F3769696BF75400CE19CC; p=2e69883207d99e253471f621d896037d9; t=1f917c44eaa1178b8bd357e96d7346fc9; societyguester=1f917c44eaa1178b8bd357e96d7346fc9; id=974713149; xnsid=364172ac; loginfrom=syshome'
}
url = 'http://www.renren.com/'
page_text = requests.get(url=url,headers=headers).text
tree = etree.HTML(page_text)
img_url = tree.xpath('//*[@id="verifyPic_login"]/@src')[0]
print(img_url)
img_data = requests.get(img_url,headers=headers).content
print(img_data)
with open('./code.jpg','wb') as fp:
    fp.write(img_data)

# 使用超级鹰打码提供的示例代码对验证码图片进行识别
result = getCodeText('用户名','密码', 'appid', '验证码本地存储的路径')
print(result['pic_str'])

# 2.对get请求进行发送

login_url = 'http://www.renren.com/9747139'
login_page_text = requests.get(url=login_url, headers=headers).text
with open('renren.html','w',encoding='utf-8') as fp:
    fp.write(login_page_text)

# 爬取当前用户的个人主页对应的页面数据
detail_url = 'http://www.renren.com/974713149/profile'
detail_page_text = requests.get(url=detail_url, headers=headers).text
with open('zep.html','w',encoding='utf-8') as fp:
    fp.write(detail_page_text)


ローカルrenren.htmlに
ここに画像の説明を挿入します
保存:ローカルzep.htmlに保存:
ここに画像の説明を挿入します
2。セッションオブジェクトを作成し、セッションオブジェクトを使用してリクエストを送信します。Cookieはセッションで自動的に実行され、処理されるためです。(推奨)

# 编码流程:
#     1.验证码的识别,获取验证码图片的文字数据
#     2.对get请求进行发送
#     3.对响应数据进行持久化存储

import requests
from lxml import etree
from hashlib import md5


# 封装识别验证码图片的函数
def getCodeText(userName, password, appId, imgUrl):
    class Chaojiying_Client(object):

        def __init__(self, username, password, soft_id):
            self.username = username
            password = password.encode('utf8')

            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()

    if __name__ == '__main__':
        chaojiying = Chaojiying_Client(userName, password, appId)  # 用户中心>>软件ID 生成一个替换 96001
        im = open(imgUrl, 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
        # print(chaojiying.PostPic(im, 1902))  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    return chaojiying.PostPic(im, 1902)

#创建会话对象,该会话对象可以调用get和post发起请求
session = requests.Session()

# 1.对验证码图片进行捕获和识别
headers = {
    
    
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
        'Referer': 'http://www.renren.com/SysHome.do',
        # 'Cookie': 'anonymid=klgdsqz5n7c6dn; depovince=ZGQT; _r01_=1; JSESSIONID=abcqWHDNhNOVf95ntfjFx; taihe_bi_sdk_uid=926da97ed7bdff5fc3ece47fdd554b0b; taihe_bi_sdk_session=ffa92a5a812142ba8dac302676d881cd; ick_login=426dff64-6952-4319-8c8f-96ea6f498550; first_login_flag=1; [email protected]; ln_hurl=http://hdn.xnimg.cn/photos/hdn421/200705/235/h_main_9aN0_0c1b00b06195a.jpg; wp_fold=0; jebecookies=c2363801-e587-4f54-8566-24b86aa22659|||||; _de=B3D043F455F38852340E4CEC836F3769696BF75400CE19CC; p=2e69883207d99e253471f621d896037d9; t=1f917c44eaa1178b8bd357e96d7346fc9; societyguester=1f917c44eaa1b8bd357e96d7346fc9; id=974713149; xnsid=364172ac; loginfrom=syshome'
}
url = 'http://www.renren.com/'
page_text = session.get(url=url,headers=headers).text
tree = etree.HTML(page_text)
img_url = tree.xpath('//*[@id="verifyPic_login"]/@src')[0]
print(img_url)
img_data = session.get(img_url,headers=headers).content
print(img_data)
with open('./code.jpg','wb') as fp:
    fp.write(img_data)

# 使用超级鹰打码提供的示例代码对验证码图片进行识别
result = getCodeText('用户名','密码', 'appid', '验证码图片的路径')
print(result['pic_str'])


login_post_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=202112910495'
data = {
    
    
    'email': '[email protected]',
    'icode': result['pic_str'],
    'origURL': 'http://www.renren.com/home',
    'domain': 'renren.com',
    'key_id': '1',
    'captcha_type': 'web_login',
    'password': '346d050fe82d3cfe090210864d73b65b5608bf90173371b3c10e7df6e533',
    'rkey': '3a7cdde0b042c1ba11169c3378fd5b',
    'f': 'http%3A%2F%2Fwww.renren.com%2F974713149%2Fnewsfeed%2Fphoto'
}
response = session.post(url=login_post_url, headers=headers,data=data)
print(response.text)


# 2.对get请求进行发送

login_url = 'http://www.renren.com/974713149'
login_page_text = session.get(url=login_url, headers=headers).text
with open('renren.html','w',encoding='utf-8') as fp:
    fp.write(login_page_text)


# 爬取当前用户的个人主页对应的页面数据
detail_url = 'http://www.renren.com/974713149/profile'
detail_page_text = session.get(url=detail_url, headers=headers).text
with open('zep.html','w',encoding='utf-8') as fp:
    fp.write(detail_page_text)


zep.html:
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_44827418/article/details/113954793