python模拟登陆+获取数据

参考地址:http://www.jianshu.com/p/3debfb110ad9

最近做了一个网络爬虫的题,要求:访问一个链接,页面中含有同样的另一个链接信息,需要提取出来,再次访问,直到访问到某一个链接跳转到成功页面。

解析:就是一个网页爬取,主要遇到的困难时如何保存登录信息,由于对python不熟,加上其中各方面的小错误没注意导致一直得不出结果,现在回顾发现有很多这一个简单地题目其实涉及到很多知识点。包括:登录提交的数据格式获取、运用浏览器工具获取提交信息、正则表达式以及注意转义字符、浏览器缓存、字符串匹配等。

import re
import requests
import http.cookiejar
from PIL import Image
import time
import json

# 头信息
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 '
                         '(KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36',
           "Host": "xdmsc.club",
           "Referer": "https://xdmsc.club/",
           }
# 建立一个会话,可以把同一用户的不同请求联系起来;直到会话结束都会自动处理cookies
session = requests.Session()
# 建立LWPCookieJar实例,可以存Set-Cookie3类型的文件。
# 而MozillaCookieJar类是存为'/.txt'格式的文件
session.cookies = http.cookiejar.LWPCookieJar("cookie")
# 若本地有cookie则不用再post数据了


try:
    session.cookies.load(ignore_discard=True)
except IOError:
    print('Cookie未加载!')

def get_xsrf():
    """
    获取网站登录的动态参数post
    获取参数_xsrf
    """
    response = session.get('https://xdmsc.club/question/login', headers=headers)
    html = response.text
    get_xsrf_pattern = re.compile(r"<input type='hidden' name='csrfmiddlewaretoken' value='(.*?)'")
    _xsrf = re.findall(get_xsrf_pattern, html)[0]
    print(_xsrf)
    return _xsrf


# def get_captcha():
#     """
#     获取验证码本地显示
#     返回你输入的验证码
#     """
#     t = str(int(time.time() * 1000))
#     captcha_url = 'http://www.zhihu.com/captcha.gif?r=' + t + "&type=login"
#     response = session.get(captcha_url, headers=headers)
#     with open('cptcha.gif', 'wb') as f:
#         f.write(response.content)
#     # Pillow显示验证码
#     im = Image.open('cptcha.gif')
#     im.show()
#     captcha = input('本次登录需要输入验证码: ')
#     return captcha

def getHtml(session,url):
    """
    获取页面内容
    """
    return session.get(url).text


def getImg(html):
    """
    获取特定位置信息(链接)
    """
    imgre = re.compile(r"answer=(.*?)<")
    imglist = re.findall(imgre, html)[0]
    print(imglist)
    return "https://xdmsc.club/question/web/5/?answer="+imglist

def login(email, number):
    """
    输入自己的账号密码,模拟登录知乎
    """
    # # 检测到11位数字则是手机登录
    # if re.match(r'\d{11}$', username):
    url = 'https://xdmsc.club/question/login'
    data = {
            'email': email,
            'number': number,
            'csrfmiddlewaretoken': get_xsrf()
            }
    # else:
    #     url = 'https://www.zhihu.com/login/email'
    #     data = {'_xsrf': get_xsrf(),
    #             'password': password,
    #             'remember_me': 'true',
    #             'email': username
    #             }
    # 若不用验证码,直接登录
    result = session.post(url, data=data, headers=headers)
    print(result)
    # 打印返回的响应,r = 1代表响应失败,msg里是失败的原因
    # loads可以反序列化内置数据类型,而load可以从文件读取
    # if (json.loads(result.text))["r"] == 1:
    #     # 要用验证码,post后登录
    #     data['captcha'] = get_captcha()
    #     result = session.post(url, data=data, headers=headers)
    #     print((json.loads(result.text))['msg'])
        # 保存cookie到本地
    session.cookies.save(ignore_discard=True, ignore_expires=True)
    ourl = 'https://xdmsc.club/question/web/5/?answer=fad39d71'

    numberx = 0
    while True:
        numberx += 1
        print(numberx)
        html = getHtml(session,ourl)
        ourl = getImg(html)


def isLogin():
    # 通过查看用户个人信息来判断是否已经登录
    url = "https://www.zhihu.com/settings/profile"
    # 禁止重定向,否则登录失败重定向到首页也是响应200
    login_code = session.get(url, headers=headers, allow_redirects=False).status_code
    if login_code == 200:
        return True
    else:
        return False


if __name__ == '__main__':
    # if isLogin():
    #     print('您已经登录')
    # else:
        # account = input('输入账号:')
        # secret = input('输入密码:')
        account = '123@qq.com'
        secret = '130'
        login(account, secret)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值