基于python的url信息收集的实现
信息收集
前言
爬虫:它是一种按照一定的规则,自动地抓取网络信息的程序或者脚本。
爬虫的基本流程
网页的请求与响应:网页的请求和响应方式是 Request 和 Response
Request:用户将自己的信息通过浏览器(socket client)发送给服务器(socket server)
Response:服务器接收请求,分析用户发来的请求信息,收到请求信息后返回数据(返回的数据中可能包含其他链接,如:image、js、css等)
浏览器在接收 Response 后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收 Response 后,是要提取其中的有用数据。
发起请求:Request
请求的发起是使用 http 库向目标站点发起请求,即发送一个Request
Request对象的作用是与客户端交互,收集客户端的 Form、Cookies、超链接,或者收集服务器端的环境变量。
Request 对象是从客户端向服务器发出请求,包括用户提交的信息以及客户端的一些信息。客户端可通过 HTML 表单或在网页地址后面提供参数的方法提交数据。
然后服务器通过 request 对象的相关方法来获取这些数据。request 的各种方法主要用来处理客户端浏览器提交的请求中的各项参数和选项。
Request 包含:请求 URL、请求头、请求体等
Request 请求方式: GET/POST
请求url: url全称统一资源定位符,一个网页文档、一张图片、 一个视频等都可以用url唯一来确定
请求头: User-agent:请求头中如果没有 user-agent 客户端配置,服务端可能将你当做一个非法用户;
cookies: cookie 用来保存登录信息
一般做爬虫都会加上请求头
获取响应内容:
爬虫程序在发送请求后,如果服务器能正常响应,则会得到一个Response,即响应;
Response 信息包含:html、json、图片、视频等,如果没报错则能看到网页的基本信息。
输出的就是网页的基本信息,它包含 html、json、图片、视频等,如下图所示:
Response 响应后会返回一些响应信息,例下:
1、响应状态
200:代表成功301:代表跳转404:文件不存在403:权限502:服务器错误2、Respone header
set-cookie:可能有多个,是来告诉浏览器,把cookie保存下来3、preview 是网页源代码
最主要的部分,包含了请求资源的内容,如网页html、图片、二进制数据等4、解析内容
解析 html 数据:解析 html 数据方法有使用正则表达式、第三方解析库如 Beautifulsoup,pyquery 等
解析 json 数据:解析 json数据可使用 json 模块
解析二进制数据:以 b 的方式写入文件
5、保存数据
爬取的数据以文件的形式保存在本地或者直接将抓取的内容保存在数据库中,数据库可以是 MySQL、Mongdb、Redis、Oracle 等……
爬虫模块介绍代码
#GET请求 # result=requests.get('http://www.scitc.com.cn/') # print(result.text) #post 请求 #http://192.168.8.129:8085/zb_system/login.php #如果username=字典,password=字典,进行批量发送 #这不就是一个后台爆破脚本吗? # url='http://192.168.8.129:8085/zb_system/login.php' # data='edtUserName=admin&edtPassWord=admin123456&btnPost=%E7%99%BB%E5%BD%95&username=admin&password=a66abb5684c45962d887564f08346e8d&savedate=1' # result=requests.post(url,data=data) # print(result.text) #带入请求头 #比如:某个地址只能手机访问,电脑访问不了 #实现Python脚本尝试访问爬取数据,那么一般怎么操作? #直接利用手机数据包带入py脚本中去爬虫请求,请求头更改! #应用场景:1、无法访问 2、绕过反爬虫 3、自定义设计(带入cookie) # hearers={ # 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36', # } # requests.get('http://www.scitc.com.cn',headers=hearers) #加入代理 #应用场景:1、无法访问 2、绕过反爬虫 3、自定义设计 # proxy={ # 'http':'127.0.0.1:8080', # 'https':'127.0.0.1:8080' # } # requests.get('http://www.scitc.com.cn',proxies=proxy)
案例一:高校漏洞数据获取
基于edu.src 实现高校漏洞获取
#项目一步-实战案例-edu_src数据提取 #coding:utf-8 #author:阿军 import requests,time from bs4 import BeautifulSoup # 实现步骤: # 1、请求高校名称页面 # 2、爬行所有高校页数 # 3、返回数据进行筛选 # 4、筛选数据进行导出 def edu_src_getdata(): for i in range(1,198): # 1、请求高校名称页面 # 2、爬行所有高校页数 url = 'https://src.sjtu.edu.cn/rank/firm/' urls=url+'?page='+str(i) print('->正在获取第' + str(i) + '页数据') try: print(urls) result=requests.get(urls).text # 3、返回数据进行筛选 soup=BeautifulSoup(result,'lxml') trs=soup.find_all('tr',attrs={'class':'row'}) for tr in trs: name=list(tr.stripped_strings)[1] # 4、筛选数据进行导出 f = open('edu_src.txt', 'a+',encoding='utf-8') f.writelines(name + '\n') f.close() except Exception as e: time.sleep(0.5) pass if __name__ == '__main__': edu_src_getdata()
案例二:fofa获取高校资产
#coding:utf-8 #author:阿军 import requests,time,base64 from bs4 import BeautifulSoup # 实现步骤: # 1、读入名字带入URL # 2、爬行所有高校Fofa # 3、返回数据进行筛选 # 4、筛选数据进行导出 def fofa_get_data(): headers={ 'cookie':'fofa_token=""' } url='https://fofa.so/result?qbase64=' try: #读入目标名称 for name in open('edu_src.txt',encoding='utf-8'): query='title="'+name.strip()+'" && country="CN"' querys=base64.b64encode(query.encode('utf-8')) urls=url+querys.decode('utf-8') result=requests.get(urls,headers=headers).text time.sleep(1) soup = BeautifulSoup(result, 'lxml') #提取资产总数 yeshu = soup.find_all('span', attrs={'class': "pSpanColor"})[0].get_text() yeshu=int(int(yeshu)/10)+1 print("\033[0;31;40m"+name.strip()+"->存在"+str(yeshu)+"页"+"\033[0m") print("="*30) #隔页请求提取 for i in range(1, yeshu + 1): print("=" * 30) print("\033[0;31;40m"+name.strip() + "->提取第" + str(i) + "页"+"\033[0m") urlss=urls+'&page_size=10&page='+str(i) #print(urlss) results=requests.get(urlss,headers=headers).text time.sleep(1) soups=BeautifulSoup(results,'lxml') #URL&IP信息提取 ip = soups.find_all('a', attrs={'target': "_blank"}) print("当前页面URL&IP信息提取如下") for i in ip: domain = i['href'].replace('https://beian.miit.gov.cn/', '') print(domain) #中间件信息提取 server = soups.find_all('div', attrs={'class': "rightListsMain"}) print("当前页面中间件信息提取如下") for s in server: try: servers = str(s) soupss = BeautifulSoup(servers, 'lxml') serverss = soupss.find_all('a', attrs={'class': "listSpans"})[0].get_text() print(serverss) except Exception as e: print('no server data') pass except Exception as e: print("connect failed!x") time.sleep(1) pass if __name__ == '__main__': fofa_get_data()
案例三:ctfhub的目录扫描
import requests url = "http://challenge-43868b562117e3f4.sandbox.ctfhub.com:10080/flag_in_here/" for i in range(1,5): for j in range(1,5): url_test =url+"/"+str(i)+"/"+str(j) r = requests.get(url_test) r.encoding = 'utf-8' get_file=r.text if "flag.txt" in get_file: print(url_test)
案例四:某网站刷网课脚本 网站已经关闭给大家共享下以前的代码
#!-*-coding:utf-8 -*- #!Author :ajun # -*- coding:utf-8 -*- # 日期: # 用途: import hashlib import requests import re from selenium import webdriver import pyautogui import time s = requests.Session() #登陆和申请课程 def login(): url = "http://39.106.4.51/?q=custom_user_login" md = hashlib.md5() #构造一个md5 md.update(passwd.encode()) password = md.hexdigest() data = { "username": username, "password": password} try: req = s.post(url=url,data=data) r = re.findall(r"style=\"color: white\">(.*?)</a>",req.text,re.S|re.M)[0] if(r !="登陆"): print(username + "登陆成功") for u in d: url = host + "/?q=node/" + str(u) + "/people/apply" #print(url) #申请课程的url try: req = s.get(url, headers=header) if "success" in req.text: print("id为"+u+"的课程申请成功") else: print("id为" + u + "的课程申请失败") except: pass else: print(username+"登陆失败") except: pass #学习课程 def study(): for id in d: study_url = host+"/?q=items/student/study/"+str(id) try: req = s.get(study_url,headers=header,timeout=3) r = re.findall(r"<a score=.*?=.*?title=.*?class=.*?nid=.*?module_id=.*?item_id=.*?href=\"(.*?)\">.*?</a>",req.text,re.M|re.S) for url in r: url = host+url print(url) driver = webdriver.Chrome() #driver = webdriver.Chrome(500,500) 500 500是显示浏览器窗口大小,分辨率500 x 500 driver.get("http://39.106.4.51/?q=custom_user_login") driver.find_element_by_id("username").send_keys(username) driver.find_element_by_id("password").send_keys( passwd) driver.find_element_by_xpath("//*[@id=\"custom-user-login-form\"]/fieldset/div[4]/div/button").click() #js = 'window.open("http://39.106.4.51/?q=courses");' #driver.execute_script(js) #time.sleep(5) js= 'self.location=\''+url+'\'' print(js) driver.execute_script(js) time.sleep(5) pyautogui.click(511, 1008) #要点击的位置 time.sleep(4) #设置视频播放时间时间 driver.close() except: pass if __name__ == '__main__': header = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"} host = "http://39.106.4.51" # 课程id代码 d = ["85230", "85312", "85309", "85291", "85311", "85307", "85310", "85313", "85305", "85308"] #课程的id,自行添加 passwd = "18096310815" #设置登陆密码 username = "fengjunjun123" #设置账号处 login() study()