Python爬虫模拟网站登录

@Python爬虫模拟网站登录

Python爬虫模拟网站登录

需要的工具

  • python3.x
  • Fiddler
  • 安装BeautifulSoup、urllib库

1.我们首先需要查看网站源码,这里用的是搜狗浏览器,它的开发者工具使用起来比较方便,Google Chrome和IE也有开发者工具,操作相似。

Python爬虫模拟网站登录_第1张图片
Python爬虫模拟网站登录_第2张图片

  1. 因为要爬虫模拟一个网站的登录,但是分析源码后发现,该网站的登录页面是动态加载的,在点击登录后弹出一个窗口,而不是一个单独的url。
    Python爬虫模拟网站登录_第3张图片
    网站获取用户的输入后会将数据传送给https://www.gongzicp.com/login/userLogin(不可以直接访问)。
    这个网站之前没有使用验证码检验爬虫,所以可以使用cookie直接把登录需要的用户名和密码post给url就可以。
    这里有一个问题,我们可以通过Fiddler抓包发现,传送的数据不止有用户名和密码,还有ncode、zzz和remember这几个数值。登录传送数据
    这些数据不是用户输入的,那么就是网站自己生成或者判断的。
    我们再看一下fiddler的抓包情况。
    在这里插入图片描述
    Python爬虫模拟网站登录_第4张图片
    可以看到在进行登录之前,网站先访问了https://www.gongzicp.com/login/nationCode ,在fiddler查看该网页的返回的内容:
    Python爬虫模拟网站登录_第5张图片
    虽然没有找到ncode,但有一个值code等于86。而后面的\u4e2d\u56fd\u5927\u9646明显经过了编码。想要知道它的具体内容,我们就要将它爬取下来解码。代码如下:
import urllib.parse
import json
#import chardet
import requests
import os
import sys
import random
from bs4 import BeautifulSoup
from urllib.request import quote,unquote
class Download:
    def __init__(self):
        self.server='https://www.gongzicp.com'
        self.ncode='https://www.gongzicp.com/login/nationCode'  
        self.login='https://www.gongzicp.com/login/userLogin'
        #设置多个用户信息,预防反爬虫
        self.user_agents=[
            'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
            'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299',
            'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'
        ]
       #伪装报头
        self.header = {
            'Host':'www.gongzicp.com',
            'Connection': 'keep-alive',
            'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Origin': 'https://www.gongzicp.com',
            'Accept-Language':'zh-CN,zh;q=0.8',
            'Cache-Control':'max-age=0',
            #'Referer':'https://www.gongzicp.com/novel-30233.html',
            'Upgrade-Insecure-Requests':'1',
            'User-Agent': self.user_agents[random.randrange(0,4)],
            'Accept-Encoding': 'gzip, deflate, br',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
        }
        
   def getOpener(self,head):
        # deal with the Cookies
        self.cj = http.cookiejar.CookieJar()
        self.pro = urllib.request.HTTPCookieProcessor(self.cj)
        self.opener = urllib.request.build_opener(self.pro)
        self.header = []
        for key, value in head.items():
            elem = (key, value)
            self.header.append(elem)
        self.opener.addheaders = self.header
        return self.opener
        
   def js(self):
        self.opener = self.getOpener(self.header)
        getUserInfo_url='https://www.gongzicp.com/login/nationCode'
        op = self.opener.open(getUserInfo_url)
        data = op.read()
        #解压缩
        data = gzip.decompress(data)
        #解码
        data=data.decode('unicode-escape')
        print(data)

这里有两个需要注意的地方:

  • 解压缩。我们用开发者工具查看网站源码,可以发现,网站的返回内容经过了压缩。所以需要对返回值进行解压。
    Python爬虫模拟网站登录_第6张图片
  • 编码方式。我们要将内容进行转码,否则中文将会以乱码形式出现。这里需要的解码方式是unicode-escape,不同网站可能不一样。
  1. 解决了ncode的问题,那么zzz是什么值呢?我们继续查看源码
    Python爬虫模拟网站登录_第7张图片
    可以看到,zzz的值在源码之中,每次刷新页面都会变化。那么我们就使用beautifulsoup获取这一段数值。其中部分代码如下:
soup = BeautifulSoup(data, "html.parser")        
#print(soup.prettify())
vue=str(soup.find_all('script',type='text/javascript'))

而remember的值也可以在源码中找到,应该是代表是否保存密码。这里选择了保存密码,所以为1。
Python爬虫模拟网站登录_第8张图片
4.获取了所有的数值后,就可以post数值进行登录了。

         postDict = {
                'ncode':'86',
                'username': user_id,
                'password': user_passw,
                'remember': '1',
                 'zzz':zzz
        }
        postData = urllib.parse.urlencode(postDict).encode('utf-8')
        login_op = self.opener.open(self.login, postData)
        print('have login')
        #获取用户信息,查看登录是否成功        
        getUserInfo_url='https://www.gongzicp.com/user/getUserInfo'
        op = self.opener.open(getUserInfo_url)
        data = op.read()
        data = gzip.decompress(data)
        data=data.decode('unicode-escape')
        print(data)

你可能感兴趣的:(python,爬虫)