本文章分为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 查看本文章