[Python爬虫] 通过接口登录系统(带token)以及抓取登录后的所有请求链接

本文章分为3步:

1. LoginAff.py:通过接口登录系统

2. GetAllLinks.py:通过爬虫爬取所有href和src的链接,并过滤掉一些无用的链接

3. VisitAllLinks.py:通过post或get方法去访问这些链接,看是否能访问成功

LoginAff.py

此系统登录需要传token作为参数,并且需要cookie中带有token。两个token的值不能相同。因此以下代码获取了2次token,分别作为登录的token和cookie里面的token。

import requests
import re


login_url="https://***********************"

#初始化url请求对象
login = requests.get(login_url)
#从HTML中取字符串token
gettoken=re.search(r'(_RequestVerificationToken" type="hidden" value=")(.*?)(" />)',login.text)
#print("整个字符串",GetToken.group(0)) #匹配0组:整个字符串 _RequestVerificationToken" type="hidden" value="U85NeA5wJiPxBaeZBtHTyCz8tv8If-VK0v9WJvxQw_iw7RsN417xxtDp2nXC7JZNl6LFXV8nu2NHSkcXvpXyjVfGBZw1" />
#print("匹配1组",GetToken.group(1))  #匹配1组: _RequestVerificationToken" type="hidden" value="
#print("_RequestVerificationToken=",GetToken.group(2)) #匹配2组:U85NeA5wJiPxBaeZBtHTyCz8tv8If-VK0v9WJvxQw_iw7RsN417xxtDp2nXC7JZNl6LFXV8nu2NHSkcXvpXyjVfGBZw1
token=gettoken.group(2)


#从cookies中取字符串token
getcookietoken=re.findall(r"Cookie __RequestVerificationToken=(.*?) for",str(login.cookies))
cookietoken=getcookietoken[0]

headers={
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'en-US,en;q=0.9,zh;q=0.8,zh-CN;q=0.7',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requestsy': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'
}

cookie={
'__RequestVerificationToken':cookietoken,
' ab-features': '************',
'a6095384f63f934a35018678aa916d1a': '************'
}
#登录需要传的参数
logindata = {
        "userName": "************",
        "password": "************",
        "utcOffset": "-480",
        "isSupportDST": "false",
        "rememberMe": "false",
        "returnURL":"",
        "__RequestVerificationToken": token
}

#一般登录注册页面均是post方式进行提交的
#初始化post请求对象(需要传入url、提交的数据、header,cookie)
loginaff = requests.post(login.url,headers=headers,data=logindata,cookies=cookie)
#打印返回结果
print("登录请求的状态码:",loginaff.status_code)
#print("登录请求的返回值:",LoginAff.text)
#print("URL",LoginAff.url)
GetAllLinks.py
import urllib.request
import re
from LoginAff import *

# 定义一个空列表,用来保存最后输出的所有链接
#在VisitAllLinks.py中需要用到,因此需要作为全局变量定义
visitalllinks = []

def GetAllLinks():
    # 从HTML中取获取所有href后面的链接
    findallhrefs = re.findall(r'.*?href="(.*?)".*?', str(loginaff.text))
    # 从HTML中取获取所有src后面的链接
    findallsrcs = re.findall(r'.*?src="(.*?)".*?', str(loginaff.text))
    findalllinks = findallhrefs + findallsrcs  # 合并2个列表
    FilterLinks(findalllinks)


def FilterLinks(links):
    # 定义一个空列表,用来保存多次获取的值
    alllinks = []
    links = set(links)  # 去重
    # 将每次获取的去重后的链接追加到一个新列表中
    for singellink in links:
        # 从下标0开始,查找在元素里首字母出现#或者元素中存在javascript:void的子串,如果不存在,则追加进列表
        # -1表示没有匹配的结果
        if (singellink[0].find('#') == -1) & (singellink.find("javascript") == -1):
            alllinks.append(singellink)
        #else:
            #print("输出过滤后的链接:", singellink)
    SaveLinks(alllinks)


def SaveLinks(links):
    # 定义一个变量,给链接标上序号
    num = 0
    links = set(links)  # 去重
    # 将所有链接保存到文件中
    file_new = "D:\\href.txt"
    with open(file_new, 'w') as f:
        # 以w的方式打开写入时会覆盖原有记录,而以a的方式则会在原有内容上追加
        f.write("总链接数量:" + str(len(links)) + "\n")
        for singellink in links:
            num += 1
            # 如果没有在获取的链接中找到http,才进行拼接输出
            if singellink.find("http") == -1:
                viitlink=login_url + singellink
                f.write("链接" + str(num) + ": " + viitlink + "\n")
                visitalllinks.append(viitlink)

            else:
                viitlink=singellink
                f.write("链接" + str(num) + ": " + singellink + "\n")
                visitalllinks.append(viitlink)
        f.close()
    print('\n已经生成文件,所有链接都已经保存到了txt文件中。')


GetAllLinks()
VisitAllLinks.py
import requests
from GetAllLinks import *


#定义一个空数组,用来保存post请求后响应码不等于200的链接
#然后通过get方法重新访问
visitlinks=[]

print("\n使用post方法访问:")
for singellink_post in visitalllinks:
    #通过post方法访问
    visitlink_post = requests.post(singellink_post,headers=headers,cookies=cookie)
    #如果响应码是200就打印出来,不是200就保存在新数组中,并接下来尝试用get方法访问
    if visitlink_post.status_code == 200:
        print("响应码:", visitlink_post.status_code, "    ", "访问的链接:", singellink_post )
    else:
        visitlinks.append(singellink_post)

print("\n使用get方法访问:")
for singellink_get in visitlinks:
    # 通过get方法访问
    visitlink_get = requests.get(singellink_get)
    if visitlink_get.status_code == 200:
        print("响应码:", visitlink_get .status_code, "    ","访问的链接:", singellink_get)
    else:
        print("\n经过post和get访问,响应码仍旧不是200\n",singellink_get, "    ","响应码:", visitlink_get .status_code)

扫描二维码关注公众号,回复: 2520864 查看本文章

猜你喜欢

转载自blog.csdn.net/FloraCHY/article/details/81334898