快速爬取登入網站資料

Z_suger7發表於2020-11-20

部分網站需要登入才能允許訪問,因此爬蟲需要獲取登入cookie,然後通過爬蟲代理使用該cookie進行資料採集。本示例按照以上流程進行實現如下:
1 模擬表單登陸
通過於post請求向伺服器傳送表單資料,爬蟲將返回的cookie進行儲存。

import requests
data = {'data1':'XXXXX', 'data2':'XXXXX'}
response = requests.post(url=url, data=data)

2 提取cookie登陸
讀取儲存的cookie進行登陸,伺服器會認為爬蟲請求是已登陸的使用者,所以就會返回已登陸的內容。注意需要驗證碼的情況可以使用帶驗證碼登陸的cookie解決。

    #! -*- encoding:utf-8 -*-
    import requests
    import random
    import requests.adapters

    # 要訪問的目標頁面
    targetUrlList = [
        "https://httpbin.org/ip",
        "https://httpbin.org/headers",
        "https://httpbin.org/user-agent",
    ]

    # 代理伺服器(產品官網 www.16yun.cn)
    proxyHost = "t.16yun.cn"
    proxyPort = "31111"

    # 代理隧道驗證資訊
    proxyUser = "username"
    proxyPass = "password"

    proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
        "host": proxyHost,
        "port": proxyPort,
        "user": proxyUser,
        "pass": proxyPass,
    }

    # 設定 http和https訪問都是用HTTP代理
    proxies = {
        "http": proxyMeta,
        "https": proxyMeta,
    }

    # 訪問三次網站,使用相同的Session(keep-alive),均能夠保持相同的外網IP
    s = requests.session()

    # 設定cookie
    cookie_dict = {"JSESSION":"123456789"}
    cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
    s.cookies = cookies

    for i in range(3):
        for url in targetUrlList:
            r = s.get(url, proxies=proxies)
            print r.text

若存在驗證碼,此時採用response = requests_session.post(url=url_login, data=data)是不行的,做法應該如下:

response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陸
response2 = requests_session.get(url_login) # 已登陸,因為之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陸,因為之前拿到了Response Cookie!

相關文章