Scrapy+Python模拟登入Facbook

566 阅读3分钟

Python环境:3.7 安装Scrapy:pip install Scrapy 进入登入页面:www.facebook.com/

成功登入后点击 F12进入开发者模式:

找到登入的请求页面: 我懒的找了所有:www.facebook.com/login/devic…

name = 'mafengwo'
host = "https://www.facebook.com/"
username = "1737751826501"  # 帐号
password = "**************"  # 密码
headerData = {
    "authority": "www.facebook.com",
    'scheme':'https',
    'path':'/login/device-based/regular/login/?login_attempt=1&lwv=110',
    'user-agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36",
    'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'accept-language':'zh-CN,zh;q=0.9',
    'upgrade-insecure-requests':'1',
    'cache-control':'max-age=0',
    'content-type':'application/x-www-form-urlencoded',
    'origin':'https://www.facebook.com',
    'referer':'https://www.facebook.com/',
}

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

定义 函数爬取登入页面

爬虫运行的起始位置

# 第一步:爬取登录页面
def start_requests(self):
    print("start mafengwo clawer")
    # 登录页面
    mafengwoLoginPage = "https://www.facebook.com/"
    loginIndexReq = scrapy.Request(
        url=mafengwoLoginPage,
        headers=self.headerData,
        callback=self.parseLoginPage,
        dont_filter=True,  # 防止页面因为重复爬取,被过滤了
    )
    yield loginIndexReq

1 2 3 4 5 6 7 8 9 10 11 12 13 定义请求方法:

# 第二步:分析登录页面,取出必要的参数,然后发起登录请求POST
def parseLoginPage(self, response):
    print(f"完蛋 = {response.url}"+"==========================")
    # 如果这个登录页面含有一些登录必备的信息,那么就在这个函数里面进行信息提取( response.text )
    loginPostUrl = "https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110"
    # FormRequest 是Scrapy发送POST请求的方法
    yield scrapy.FormRequest(
        url=loginPostUrl,
        headers=self.headerData,
        method="POST",
        # post的具体数据
        formdata={
            "jazoest":"2635",
            "lsd":"AVpC9O0y",
            "email": self.username,
            "pass": self.password,
            "timezone":"-480",
            "lgndim":"eyJ3IjoxOTIwLCJoIjoxMDgwLCJhdyI6MTkyMCwiYWgiOjEwNDAsImMiOjI0fQ==",
            "lgnrnd": "000725_pmuo",
            "lgnjs": "1547193922",
            "locale": "zh_CN",
            "next": "https://www.facebook.com/",
            "login_source": "login_bluebar",
            "prefill_contact_point": self.username,
            "prefill_source": self.password,
            "skstamp": "eyJyb3VuZHMiOjUsInNlZWQiOiJhN2RmZTVlNDQ0NmRkNmFlNzA2NjFlODJlNWI3NzlhZiIsInNlZWQyIjoiMjU0MzdiZTU2YmMzNjAwMzJhMmMzNTI3NWYzZGJiYWUiLCJoYXNoIjoiNDY0YjI3YmFjNzYzMmM5NDU1MjFjZDVkYmQ5NjA3MDYiLCJoYXNoMiI6IjkwNzQ1ZTZkMDgzZTBmOTA2MTI3MjIyN2EzN2RiOWI1IiwidGltZV90YWtlbiI6MTM2Nzk5LCJzdXJmYWNlIjoibG9naW4ifQ==",
            # "other": "other",
        },
        callback=self.loginResParse,
        dont_filter=True,
    )

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Form Data 和上面的 formdata对应

# 第三步:分析登录结果,然后发起登录状态的验证请求
def loginResParse(self, response):
    print(f"loginResParse: url = {response.url}")
    # 这个页面,只有登录过的用户,才能访问。否则会被重定向(302) 到登录页面
    routeUrl = "https://www.facebook.com/"
    # 下面有两个关键点
    # 第一个是header,如果不设置,会返回500的错误
    # 第二个是dont_redirect,设置为True时,是不允许重定向,用户处于非登录状态时,是无法进入这个页面的,服务器返回302错误。
    #       dont_redirect,如果设置为False,允许重定向,进入这个页面时,会自动跳转到登录页面。会把登录页面抓下来。返回200的状态码
    yield scrapy.Request(
        url=routeUrl,
        headers=self.headerData,
        meta={
            'dont_redirect': True,  # 禁止网页重定向302, 如果设置这个,但是页面又一定要跳转,那么爬虫会异常
            # 'handle_httpstatus_list': [301, 302]      # 对哪些异常返回进行处理
        },
        callback=self.isLoginStatusParse,
        dont_filter=True,
    )

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Cookie = response.request.headers.getlist('Cookie') #获取Scrapy控件的Cookie 1 打完收工! ———————————————— 版权声明:本文为CSDN博主「qq_34459504」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/qq_34459504…