├── CrawlerClassCode ├── README.md ├── class1 │ ├── request01.py │ ├── request02.py │ └── request03.py ├── class2 │ ├── bs4数据处理.py │ ├── global.py │ ├── jd_product.csv │ ├── jsonpath抓取猪八戒网.py │ ├── json抓菜价.py │ ├── pic_crawler2.0.py │ ├── pic_crawler_1.0.py │ ├── range.py │ ├── re基础.py │ ├── xpath爬取京东.py │ ├── 电影天堂.py │ └── 豆瓣排行.py ├── class3 │ ├── __pycache__ │ │ └── video.cpython-37.pyc │ ├── session.py │ ├── video.py │ └── video_download.py ├── class4 │ ├── img │ │ ├── 419e535e83c7192a99f7ee76d15f4043.jpg │ │ ├── 8b5586ee3febf914369de58aee65a370.jpg │ │ └── da6aec6d7e061dd6ea5da7cbe90e4abc.jpg │ ├── json抓菜价_线程池.py │ ├── multiprocess.py │ ├── novel │ │ ├── 第一章 此间少年 │ │ ├── 第七章 刻箓师 │ │ ├── 第三章 一日三境 │ │ ├── 第二章 三年聚气 │ │ ├── 第五章 风晴雪的决定 │ │ ├── 第八章 万众瞩目 │ │ ├── 第六章 有龙出没 │ │ └── 第四章 太阳命魂 │ ├── requests异步.py │ ├── thread_pool.py │ └── ts │ │ ├── 0.ts │ │ ├── 1.ts │ │ ├── 2.ts │ │ └── 3.ts ├── class5 │ ├── __pycache__ │ │ └── chaojiying.cpython-37.pyc │ ├── _无头浏览器.py │ ├── a.jpg │ ├── chaojiying.py │ ├── chaojiying_Python │ │ └── __pycache__ │ │ │ └── chaojiying.cpython-37.pyc │ ├── chrome.py │ ├── login_auto_无头浏览器基础操作.py │ ├── 窗口之间的切换.py │ └── 超级鹰处理验证码.py ├── proxy │ ├── Queue │ │ └── Queue.py │ ├── UA.py │ ├── UA.py~ │ ├── proxy_crawler.py │ ├── proxy_list.txt │ ├── proxy_pool_crawler.py │ ├── proxy_pool_crawler.py~ │ └── user-agent.json └── request │ ├── get.py │ ├── post.py │ ├── timeout.py │ └── upFile.py ├── README.md ├── edu_vul_search ├── README.md ├── eduVul.txt ├── edu_vul_spider.py └── target.txt ├── jd_conduct_search └── jd_crawler.py ├── job_info_search └── job_seach.py ├── translator ├── README.md ├── translator.py └── translator_log.txt ├── url_gather ├── README.md ├── baidu_crawler.py ├── bing_spider.py └── requirement.txt └── web_gather ├── dic.txt └── sweb.py /CrawlerClassCode/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Class1 4 | * request入门基础demo,简单的发送HTTP请求获取到网站的源代码 5 | ## Class2 6 | ### 这部分讲的是对网页源代码的数据处理 7 | - *使用到的模块* 8 | - re 正则提取,这种方式速度快,但是入门比较难 9 | - beautifulsoul 速度一般,入门简单,能快速上手 10 | - xpath 根据doc节点位置或特征来提取数据 11 | - jsonpath 和xpath差不多,区别主要是它用来解析接口返回的json格式的文件 12 | 13 | ## Class3 14 | * 网站登录时session的问题 15 | * 如何下载视频 16 | ## Class4 17 | * 线程池的使用 18 | * 异步爬取小说 19 | ## Class5 20 | * 无头浏览器,用代码自动化操作浏览器 21 | * 如何实现网站的自动登录 22 | * 各个页面之间的切换 23 | * 初探图形验证码的处理 24 | 25 | -------------------------------------------------------------------------------- /CrawlerClassCode/class1/request01.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | query = input("输入一个你喜欢的明星:") 4 | 5 | url = f'https://cn.bing.com/search?q={query}&form=QBLH&sp=-1&pq=&sc=0-0&qs=n&sk=&cvid=5302145820824897B9A226AA28423AF7' 6 | headers={ 7 | "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.73" 8 | } 9 | 10 | resp = requests.get(url,headers=headers) 11 | 12 | f = open("search01.html","w",encoding="utf-8") 13 | f.write(resp.text) 14 | f.close() 15 | #print(resp) 16 | #print(resp.text) 17 | 18 | resp.close() -------------------------------------------------------------------------------- /CrawlerClassCode/class1/request02.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | url = 'https://fanyi.baidu.com/sug' 4 | 5 | s = input("请输入你要翻译的英文单词:") 6 | data = { 7 | "kw": s 8 | } 9 | 10 | #发送post请求,发送的数据必须放在字典中,通过data参数进行传递 11 | resp = requests.post(url,data=data) 12 | print(resp.json()) #json =>dict 13 | 14 | resp.close() -------------------------------------------------------------------------------- /CrawlerClassCode/class1/request03.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | url = "https://movie.douban.com/j/chart/top_list" 4 | 5 | #重新封装参数 6 | params = { 7 | "type": "24", 8 | "interval_id": "100:90", 9 | "action": "", 10 | "start": "0", 11 | "limit": "20", 12 | } 13 | 14 | headers = { 15 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" 16 | } 17 | 18 | resp = requests.get(url=url,params=params,headers=headers) 19 | 20 | print(resp.json()) 21 | 22 | resp.close() -------------------------------------------------------------------------------- /CrawlerClassCode/class2/bs4数据处理.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from bs4 import BeautifulSoup 3 | 4 | url = 'http://www.bjtzh.gov.cn/bjtz/home/jrcj/index.shtml' 5 | resp = requests.get(url) 6 | resp.encoding = 'utf-8' 7 | 8 | page = BeautifulSoup(resp.text,"html.parser") 9 | #print(page) 10 | table = page.find("table") #后面可以加特征 attr={"class":"hq_table"} 11 | #print(table) 12 | #每一行的内容,除去表头 13 | trs = table.find_all('tr')[7:] 14 | for tr in trs: 15 | tds = tr.find_all('td') 16 | name = tds[0].text #拿到被标签标记的内容 17 | card = tds[1].text 18 | high = tds[2].text 19 | avg = tds[3].text 20 | print(name, card, high, avg) -------------------------------------------------------------------------------- /CrawlerClassCode/class2/global.py: -------------------------------------------------------------------------------- 1 | a = 10 2 | def test(): 3 | global a 4 | a = 5 5 | print(a) 6 | test() 7 | print(a) 8 | a = 20 9 | print(a) -------------------------------------------------------------------------------- /CrawlerClassCode/class2/jd_product.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggfgh/Crawler/f6cecb6c8e906c7c33455ed07d412982e7136301/CrawlerClassCode/class2/jd_product.csv -------------------------------------------------------------------------------- /CrawlerClassCode/class2/jsonpath抓取猪八戒网.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import pprint 3 | import jsonpath 4 | import json 5 | import re 6 | from bs4 import BeautifulSoup 7 | #https://jinshi.zbj.com 8 | url = 'https://jinshi.zbj.com/api/unwanted/index2021/QftInfoService/getQftSearchInfo' 9 | key_word = input('[*] 想要查询的服务:') 10 | headers = { 11 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", 12 | 13 | "Referer":'https://taiyuan.zbj.com/search/f/?kw={keyword}' 14 | } 15 | 16 | para = { 17 | 'searchType': 1, 18 | 'catType': 2, 19 | 'cityId': 3803, 20 | 'keyword':key_word, 21 | 'currentPage':2, 22 | 'size': 32, 23 | } 24 | 25 | 26 | resp = requests.get(url,headers=headers,params=para) 27 | json_data = resp.json() 28 | #pprint.pprint(json_data) 29 | 30 | #解析想要的数据 31 | name_list = jsonpath.jsonpath(json_data,'$..brandName') 32 | title_list = jsonpath.jsonpath(json_data,'$..title') 33 | price_list = jsonpath.jsonpath(json_data,'$..price') 34 | provinceName_list = jsonpath.jsonpath(json_data,'$..provinceName') 35 | title_list = jsonpath.jsonpath(json_data,'$..title') 36 | cityName_list = jsonpath.jsonpath(json_data,'$..cityName') 37 | 38 | title_result_list = [] 39 | #处理title中的标签 40 | for title in title_list: 41 | soup = BeautifulSoup(title,"html.parser") 42 | result = soup.text 43 | title_result_list.append(result) 44 | #print(title_result_list) 45 | 46 | #对应元素输出 47 | a = zip(name_list,title_result_list,price_list,provinceName_list,cityName_list) 48 | for i in a: 49 | print(i) 50 | -------------------------------------------------------------------------------- /CrawlerClassCode/class2/json抓菜价.py: -------------------------------------------------------------------------------- 1 | import bs4 2 | import requests 3 | import json 4 | import csv 5 | import time 6 | from concurrent.futures import ThreadPoolExecutor 7 | import connect_mysql 8 | 9 | def download_one_page(page): 10 | url = 'http://xinfadi.com.cn/getPriceData.html' 11 | 12 | headers = { 13 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0', 14 | "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", 15 | "Referer": "http://xinfadi.com.cn/priceDetail.html", 16 | } 17 | 18 | #去掉文本中的\\和/ 19 | #txt = (item.replace("\\",'').replace("/",'') for item in txt) 20 | #print(list(txt)) 21 | 22 | #每次获取的条目 23 | limit = 20 24 | 25 | #页面 26 | current = page 27 | 28 | data = { 29 | 'limit':limit, 30 | 'current':current 31 | } 32 | 33 | f = open("蔬菜.csv","a+",newline='',encoding='utf-8') 34 | csvWrite = csv.writer(f) 35 | 36 | resp = requests.post(url,data=data) 37 | dic_json = json.loads(resp.text) 38 | #print(dic_json) 39 | for item in dic_json['list']: 40 | name = item['prodName'] 41 | low = item['lowPrice'] 42 | avg = item['avgPrice'] 43 | prodCat = item['prodCat'] 44 | place = item['place'] 45 | date = item['pubDate'] 46 | connect_mysql.insert(prodName, lowPrice, avgPrice, prodCat,place,pubDate) 47 | print(name, low, avg, prodCat, place, date) 48 | csvWrite.writerow([name, low, avg, prodCat, place, date]) 49 | 50 | if __name__ == '__main__': 51 | start = time.time() 52 | try: 53 | 54 | # for page in range(1,200): 55 | # download_one_page(page) 56 | with ThreadPoolExecutor(1000) as t: 57 | for i in range(1,101): 58 | t.submit(download_one_page,i) 59 | 60 | except: 61 | pass 62 | end = time.time() 63 | print("下载完毕,总用时 %d s" %(end - start)) -------------------------------------------------------------------------------- /CrawlerClassCode/class2/pic_crawler2.0.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import re 3 | from bs4 import BeautifulSoup 4 | 5 | headers = { 6 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36" 7 | } 8 | 9 | 10 | #下载图片的数量 11 | total = 0 12 | start = int(input('开始爬取的页面:')) 13 | end = int(input('终止爬取的页面:')) 14 | last_img_name = '' 15 | 16 | for i in range(start,end+1): 17 | url = 'http://bbs.fengniao.com/forum/forum_101_{0}_lastpost.html'.format(i) 18 | hrefs = '' 19 | 20 | print('当前爬取主页:',url) 21 | resp = requests.get(url,headers=headers) 22 | main_page = BeautifulSoup(resp.text,"html.parser") 23 | #print(main_page) 24 | alist = main_page.find_all("a") 25 | #print(alist) 26 | 27 | for a in alist: 28 | href = a.get('href') 29 | #print(href) 30 | hrefs += str(href) 31 | #print(hrefs) 32 | 33 | #正则匹配图片子页面 34 | obj1 = re.compile(r"/forum/(?P\d{8}).html",re.S) 35 | obj2 = re.compile(r'.*?).png') 37 | 38 | #子页面 39 | result = obj1.finditer(hrefs) 40 | #请求获得的所有子页面 41 | for href in result: 42 | #图片所在的页面 43 | child_href = 'http://bbs.fengniao.com/forum/' + href.group('src') + '.html' 44 | #print(href) 45 | child_resp = requests.get(child_href,headers=headers) 46 | child_result = obj2.findall(child_resp.text) 47 | for img_href in child_result: 48 | 49 | #图片的url 50 | img_src = img_href + '.jpg' 51 | 52 | img_resp = requests.get(img_src,headers=headers) 53 | img_name = img_src.split('/')[-1] 54 | with open(str(img_name),"wb") as f: 55 | f.write(img_resp.content) 56 | if(last_img_name == img_name): 57 | pass 58 | else: 59 | total += 1 60 | print('[*] 成功下载%d张图片,当前下载图片页面%s,文件名%s' %(total,child_href,img_name)) 61 | 62 | print('[*] over') 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /CrawlerClassCode/class2/pic_crawler_1.0.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from bs4 import BeautifulSoup 3 | import re 4 | import time 5 | 6 | headers={ 7 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.73" 8 | } 9 | 10 | #定义一些全局变量 11 | total = 0 12 | last_img_name = '' 13 | 14 | 15 | start = int(input("开始爬取图片的页数:")) 16 | end = int(input("终止爬取图片的页数:")) 17 | 18 | #设置爬取图片页数 19 | for i in range(start,end+1): 20 | domain = 'https://699pic.com/photo-0-0-{0}.html'.format(i) 21 | resp = requests.get(domain,headers=headers) 22 | print('current url:',domain) 23 | resp.encoding = 'utf-8' 24 | #print(resp.text) 25 | 26 | #bs4处理获取获取图片子页面url 27 | str_href = '' 28 | main_page = BeautifulSoup(resp.text,"html.parser") 29 | alist = main_page.find("div",class_="imgshow clearfix").find_all("a") 30 | 31 | #获取a标签中的href 32 | for a in alist: 33 | href = a.get('href') 34 | str_href += str(href) 35 | 36 | #正则处理获取有效的href 37 | obj = re.compile(r"//(?P.*?).html",re.S) 38 | child_href_list = [] 39 | result = obj.finditer(str_href) 40 | 41 | for href in result: 42 | child_href = 'https://' + href.group("pic_href") + '.html' 43 | #print(child_href) 44 | child_href_list.append(child_href) 45 | 46 | for child_href in child_href_list: 47 | 48 | child_resp = requests.get(child_href,headers=headers) 49 | child_resp.encoding = 'utf-8' 50 | #从子页面拿到图片下载链接 51 | child_page = BeautifulSoup(child_resp.text,"html.parser") 52 | div = child_page.find("div",class_="photo-img-block") 53 | img_a = div.find('a') 54 | 55 | src = 'https:' + img_a.get('href') 56 | #下载图片 57 | img_resp = requests.get(src,headers=headers) 58 | img_name = src.split('/')[-1] #url / 最后的内容 59 | 60 | with open('C:\\Users\\Oringals\\Desktop\\python\\crawler\\class2\\img' + str(img_name),'wb') as f: 61 | f.write(img_resp.content) 62 | if(last_img_name == img_name): 63 | pass 64 | else: 65 | total += 1 66 | print('[*] done!',img_name,total) 67 | last_img_name = img_name 68 | #print('last_name:',last_img_name) 69 | print('[*] over!!') 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /CrawlerClassCode/class2/range.py: -------------------------------------------------------------------------------- 1 | for i in range(1,10): 2 | print(i) -------------------------------------------------------------------------------- /CrawlerClassCode/class2/re基础.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | # #findall:匹配字符串中所有符合正则的内容 4 | # list = re.findall(r"\d+", "我的电话是10010,我朋友的电话是10086") 5 | # print(list) 6 | 7 | # #finditer 8 | # it = re.finditer(r"\d+","我的电话是10010,我朋友的电话是10086") 9 | # for i in it: 10 | # print(i.group()) 11 | 12 | #search:找到一个结果就返回,返回的结果是match对象,拿数据要用.group() 13 | # s = re.search(r"\d+", "我的电话是10010,我朋友的电话是10086") 14 | # print(s.group()) 15 | 16 | # #match:从头开始匹配 17 | # s = re.match(r"\d+","10010,我朋友的电话是10086") 18 | # print(s.group()) 19 | 20 | #compile:预加载正则表达式 21 | # obj = re.compile(r"\d+") 22 | # ret = obj.finditer("我的电话是10010,我朋友的电话是10086") 23 | # for i in ret: 24 | # print(i.group()) 25 | 26 | # ret = obj.findall("sdjfjsfl43432839") 27 | # print(ret) 28 | 29 | s = """ 30 |
金鸡奖
31 |
广告歌
32 |
咕咕咕
33 |
嘎嘎嘎
34 | """ 35 | 36 | #(?P<分组名字>正则) 可以单独从正则匹配的内容中进一步提取内容 37 | obj = re.compile(r"
(?P.*?)
",re.S) 38 | result = obj.finditer(s) 39 | for i in result: 40 | print(i.group("a")) 41 | print(i.group("b")) 42 | print(i.group("c")) -------------------------------------------------------------------------------- /CrawlerClassCode/class2/xpath爬取京东.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from lxml import etree 3 | from urllib import parse 4 | import csv 5 | 6 | url = 'https://search.jd.com/Search' 7 | keyword = input("[*] 你想查询的书籍(类型):") 8 | start = int(input("[*]start page:")) 9 | end = int(input("[*]end page:")) 10 | 11 | #创建保存数据的文件 12 | f = open("jd_product.csv","w",encoding='gbk') 13 | csvWrite = csv.writer(f) 14 | 15 | for page in range(start,end+1): 16 | para = { 17 | "keyword": keyword, 18 | "page": page, 19 | } 20 | #参数url编码 21 | text = parse.urlencode(para) 22 | headers = { 23 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36" 24 | } 25 | response = requests.get(url,headers=headers,params=text) 26 | 27 | #解析 28 | html = etree.HTML(response.text) 29 | 30 | #拿到每个商品的li 31 | lis = html.xpath("/html/body/div[5]/div[2]/div[2]/div[1]/div/div[2]/ul/li") 32 | 33 | #从每本书的li中进行解析 34 | for li in lis: 35 | price = li.xpath("./div/div[2]/strong/i/text()") 36 | title = li.xpath("./div/div[3]/a/em//text()") #//text()获取子节点的所有内容 37 | img_src = li.xpath("./div/div[1]/a/img/@data-lazy-img") 38 | info = li.xpath("./div/div[7]/i[1]/text()") #是否自营 39 | 40 | #取出列表中的值 41 | title_str = ''.join(title) 42 | price_str = '¥' + ''.join(price) 43 | info_str = ''.join(info) 44 | 45 | csvWrite.writerow([title_str,info_str,price_str]) 46 | print(title_str,info_str,price_str) 47 | 48 | print('[*] done') 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /CrawlerClassCode/class2/电影天堂.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import re 3 | 4 | domain = 'https://dy.dytt8.net/' 5 | 6 | headers = { 7 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36" 8 | } 9 | 10 | resp = requests.get(domain,headers=headers,verify=False) 11 | #由于网页是GBK编码的,所以我们进行gbk编码 12 | resp.encoding = 'gbk' 13 | #print(resp.text) 14 | 15 | child_href_list = [] 16 | obj1 = re.compile(r"手机浏览,推荐下载本站app,绿色小巧,简单实用!详情请点击.*?(?P",re.S) 17 | obj2 = re.compile(r"最新电影下载.*?.*?)
.*?href="(?P.*?)"') 19 | 20 | result1 = obj1.finditer(resp.text) 21 | for it in result1: 22 | ul = it.group('ul') 23 | #提取子页面链接 24 | result2 = obj2.finditer(ul) 25 | for itt in result2: 26 | child_href = domain + itt.group('href').strip('/') #strip 去掉前面的/ 27 | #将child_href放入child_href_list列表中 28 | child_href_list.append(child_href) 29 | #print(itt.group('href')) 30 | 31 | #提取子页面的信息 32 | for href in child_href_list: 33 | child_resp = requests.get(href,verify=False) 34 | child_resp.encoding = 'gbk' 35 | #print(child_resp.text) 36 | result3 = obj3.search(child_resp.text) 37 | print(result3.group("movie")) 38 | print(result3.group("download")) 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /CrawlerClassCode/class2/豆瓣排行.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import re 3 | 4 | url = 'https://movie.douban.com/chart' 5 | 6 | headers={ 7 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.73" 8 | } 9 | 10 | resp = requests.get(url,headers=headers) 11 | page_content = resp.text 12 | 13 | #解析数据 14 | expression =r'.*? title="(?P.*?)">.*?

(?P.*?) .*?(?P.*?).*?(?P.*?)' 15 | obj = re.compile(expression,re.S) 16 | 17 | #匹配数据 18 | result = obj.finditer(page_content) 19 | for i in result: 20 | print(i.group("name")) 21 | print(i.group("year")) 22 | print(i.group("score")) 23 | print(i.group("num")) 24 | 25 | 26 | -------------------------------------------------------------------------------- /CrawlerClassCode/class3/__pycache__/video.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggfgh/Crawler/f6cecb6c8e906c7c33455ed07d412982e7136301/CrawlerClassCode/class3/__pycache__/video.cpython-37.pyc -------------------------------------------------------------------------------- /CrawlerClassCode/class3/session.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | def login(): 4 | 5 | login_url = 'https://passport.17k.com/ck/user/login' 6 | 7 | session = requests.session() 8 | 9 | data = { 10 | 11 | 'loginName':'15113205893', 12 | 'password':'123.com', 13 | } 14 | headers = { 15 | 'Referer': 'https://passport.17k.com/login/', 16 | 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36', 17 | #'Cookie': 'IPLOC=CN; SUV=0010F8CF75885A32617594C5FF5D6671' 18 | } 19 | 20 | r = session.post(login_url,data=data,headers=headers) 21 | r.encoding='utf-8' 22 | #print(r.text) 23 | return session 24 | 25 | def getContent(session): 26 | 27 | url = 'https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919' 28 | 29 | headers={ 30 | #'Referer': 'https://user.17k.com/www/bookshelf/index.html', 31 | #'Cookie':'GUID=dd7b4b66-b631-481c-bd70-9ef289d41fc4; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2284234596%22%2C%22%24device_id%22%3A%2217cb36775769-0331a9fad34a298-4c3e2679-1382400-17cb3677577263%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%2C%22first_id%22%3A%22dd7b4b66-b631-481c-bd70-9ef289d41fc4%22%7D; sajssdk_2015_cross_new_user=1; Hm_lvt_9793f42b498361373512340937deb2a0=1635097475; Hm_lpvt_9793f42b498361373512340937deb2a0=1635098049; c_channel=0; c_csc=web; accessToken=avatarUrl%3Dhttps%253A%252F%252Fcdn.static.17k.com%252Fuser%252Favatar%252F16%252F96%252F45%252F84234596.jpg-88x88%253Fv%253D1635097622000%26id%3D84234596%26nickname%3Dcomdyore%26e%3D1650650015%26s%3D0b95c540d2065ede' 32 | } 33 | 34 | resp = session.get(url) 35 | resp.encoding='utf-8' 36 | 37 | json_text = resp.json() 38 | #print(json_text) 39 | json_list = json_text['data'] 40 | 41 | for book in json_list: 42 | print(book['bookName']) 43 | 44 | if __name__ == '__main__': 45 | getContent(login()) 46 | 47 | 48 | -------------------------------------------------------------------------------- /CrawlerClassCode/class3/video.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from requests.packages.urllib3.exceptions import InsecureRequestWarning 3 | 4 | def donwnloadVideo(contID): 5 | jsonUrl = f'https://www.pearvideo.com/videoStatus.jsp?contId={contID}' 6 | headers = { 7 | 'Referer':f'https://www.pearvideo.com/video_{contID}', 8 | 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0' 9 | } 10 | requests.packages.urllib3.disable_warnings(InsecureRequestWarning) 11 | r = requests.get(jsonUrl,headers=headers,verify=False) 12 | json_data = r.json() 13 | 14 | time = json_data['systemTime'] 15 | videoSrc = json_data['videoInfo']['videos']['srcUrl'] 16 | #print('time:',time,'videoSrc:',videoSrc) 17 | 18 | #"https://video.pearvideo.com/mp4/adshort/20211025/1635226203796-15787050_adpkg-ad_hd.mp4" 19 | #获取视频实际地址https://video.pearvideo.com/mp4/adshort/20211025/cont-1744464-15787050_adpkg-ad_hd.mp4"" 20 | #网页地址https://www.pearvideo.com/video_1744464 21 | contentUrl = f'https://www.pearvideo.com/video_{contID}' 22 | videoHz = contentUrl.split('_')[1] 23 | videoSrc = videoSrc.replace(time,f"cont-{videoHz}") 24 | 25 | #下载视频 26 | video = requests.get(videoSrc,headers=headers,verify=False).content 27 | with open(f"{videoHz}.mp4",'wb') as f: 28 | 29 | f.write(video) 30 | 31 | 32 | f.close() 33 | 34 | if __name__ == '__main__': 35 | 36 | #print("done") 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /CrawlerClassCode/class3/video_download.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from bs4 import BeautifulSoup 3 | from requests.packages.urllib3.exceptions import InsecureRequestWarning 4 | 5 | #contID_list = [] 6 | 7 | def mian(): 8 | i = 0 9 | url = 'https://www.pearvideo.com/category_8' 10 | headers = { 11 | 'Referer':'https://www.baidu.com', 12 | 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0' 13 | } 14 | 15 | # 16 | requests.packages.urllib3.disable_warnings(InsecureRequestWarning) 17 | content = requests.get(url,headers=headers,verify=False).text 18 | soup = BeautifulSoup(content,"html.parser") 19 | a_list = soup.find_all('a',class_='vervideo-lilink actplay') 20 | 21 | for a in a_list: 22 | contID = a.get('href').split('_')[1] 23 | #contID_list.append(contID) 24 | print(f'========= 正在下载{i+1}个视频 =========') 25 | donwnloadVideo(contID) 26 | i += 1 27 | print(f'成功下载{i}个视频') 28 | 29 | def donwnloadVideo(contID): 30 | jsonUrl = f'https://www.pearvideo.com/videoStatus.jsp?contId={contID}' 31 | headers = { 32 | 'Referer':f'https://www.pearvideo.com/video_{contID}', 33 | 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0' 34 | } 35 | requests.packages.urllib3.disable_warnings(InsecureRequestWarning) 36 | r = requests.get(jsonUrl,headers=headers,verify=False) 37 | json_data = r.json() 38 | 39 | time = json_data['systemTime'] 40 | videoSrc = json_data['videoInfo']['videos']['srcUrl'] 41 | #print('time:',time,'videoSrc:',videoSrc) 42 | 43 | #"https://video.pearvideo.com/mp4/adshort/20211025/1635226203796-15787050_adpkg-ad_hd.mp4" 44 | #获取视频实际地址https://video.pearvideo.com/mp4/adshort/20211025/cont-1744464-15787050_adpkg-ad_hd.mp4"" 45 | #网页地址https://www.pearvideo.com/video_1744464 46 | contentUrl = f'https://www.pearvideo.com/video_{contID}' 47 | videoHz = contentUrl.split('_')[1] 48 | videoSrc = videoSrc.replace(time,f"cont-{videoHz}") 49 | 50 | #下载视频 51 | video = requests.get(videoSrc,headers=headers,verify=False).content 52 | with open(f"{videoHz}.mp4",'wb') as f: 53 | print(f'{videoHz}.mp4') 54 | f.write(video) 55 | f.close() 56 | 57 | if __name__ == '__main__': 58 | main() 59 | 60 | 61 | -------------------------------------------------------------------------------- /CrawlerClassCode/class4/img/419e535e83c7192a99f7ee76d15f4043.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggfgh/Crawler/f6cecb6c8e906c7c33455ed07d412982e7136301/CrawlerClassCode/class4/img/419e535e83c7192a99f7ee76d15f4043.jpg -------------------------------------------------------------------------------- /CrawlerClassCode/class4/img/8b5586ee3febf914369de58aee65a370.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggfgh/Crawler/f6cecb6c8e906c7c33455ed07d412982e7136301/CrawlerClassCode/class4/img/8b5586ee3febf914369de58aee65a370.jpg -------------------------------------------------------------------------------- /CrawlerClassCode/class4/img/da6aec6d7e061dd6ea5da7cbe90e4abc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggfgh/Crawler/f6cecb6c8e906c7c33455ed07d412982e7136301/CrawlerClassCode/class4/img/da6aec6d7e061dd6ea5da7cbe90e4abc.jpg -------------------------------------------------------------------------------- /CrawlerClassCode/class4/json抓菜价_线程池.py: -------------------------------------------------------------------------------- 1 | import bs4 2 | import requests 3 | import json 4 | import csv 5 | import time 6 | from concurrent.futures import ThreadPoolExecutor 7 | import pymysql 8 | 9 | def insert(data): 10 | conn = pymysql.connect(host='10.10.10.139',user='root',password='root',database='spinder_data',charset="utf8") 11 | 12 | cursor = conn.cursor() 13 | 14 | sql = 'insert into caijia(c_name,l_price,avg_price,type,des,date) values(%s,%s,%s,%s,%s,%s)' 15 | 16 | try: 17 | cursor.execute(sql,data) 18 | conn.commit() 19 | except Exception as e: 20 | print("插入数据失败:",e) 21 | conn.rollback() #回退 22 | 23 | cursor.close() 24 | 25 | conn.close() 26 | 27 | def download_one_page(page): 28 | url = 'http://xinfadi.com.cn/getPriceData.html' 29 | 30 | headers = { 31 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0', 32 | "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", 33 | "Referer": "http://xinfadi.com.cn/priceDetail.html", 34 | } 35 | 36 | #去掉文本中的\\和/ 37 | #txt = (item.replace("\\",'').replace("/",'') for item in txt) 38 | #print(list(txt)) 39 | 40 | #每次获取的条目 41 | limit = 20 42 | 43 | #页面 44 | current = page 45 | 46 | data = { 47 | 'limit':limit, 48 | 'current':current 49 | } 50 | 51 | f = open("蔬菜.csv","a+",newline='',encoding='utf-8') 52 | csvWrite = csv.writer(f) 53 | 54 | resp = requests.post(url,data=data) 55 | dic_json = json.loads(resp.text) 56 | #print(dic_json) 57 | for item in dic_json['list']: 58 | 59 | name = item['prodName'] 60 | low = item['lowPrice'] 61 | avg = item['avgPrice'] 62 | prodCat = item['prodCat'] 63 | place = item['place'] 64 | date = item['pubDate'] 65 | 66 | insert([name, low, avg, prodCat, place, date]) 67 | print([name, low, avg, prodCat, place, date]) 68 | #csvWrite.writerow([name, low, avg, prodCat, place, date]) 69 | 70 | if __name__ == '__main__': 71 | start = time.time() 72 | try: 73 | 74 | # for page in range(1,200): 75 | # download_one_page(page) 76 | with ThreadPoolExecutor(100) as t: 77 | for i in range(5000,5600): 78 | t.submit(download_one_page,i) 79 | 80 | except Exception as e: 81 | print("ERROR:",e) 82 | 83 | end = time.time() 84 | 85 | print("下载完毕,总用时 %d s" %(end - start)) -------------------------------------------------------------------------------- /CrawlerClassCode/class4/multiprocess.py: -------------------------------------------------------------------------------- 1 | from multiprocessing import Process 2 | 3 | def func(): 4 | for i in range(1000): 5 | print("子进程",i) 6 | 7 | if __name__ == '__main__': 8 | p = Process(target=func) 9 | p.start() 10 | 11 | for i in range(1000): 12 | print("主进程",i) -------------------------------------------------------------------------------- /CrawlerClassCode/class4/novel/第一章 此间少年: -------------------------------------------------------------------------------- 1 | 神州历9999年秋,东海,青州城。 2 |   青州学宫,青州城圣地,青州城豪门贵族以及宗门世家内半数以上的强者,都从青州学宫走出。 3 |   因而,青州城之人皆以能够入学宫中修行为荣,旦有机会踏入学宫,必刻苦求学。 4 |   然而,似乎并非所有人都有此觉悟。 5 |   此时在青州学宫的一间学舍中,便有一位少年正趴在桌上熟睡。 6 |   讲堂之上,一身穿青衣长裙的少女也注意到了这一幕,俏脸上不由浮现一抹怒意,迈开脚步朝着正在睡梦中的少年走去。 7 |   秦伊,十七岁,青州学院正式弟子,外门弟子讲师,容颜美貌,身材火爆。 8 |   学舍中,一双双眼睛随着秦伊的动人身姿一起移动着,哪怕是生气,秦伊迈出的步伐依旧优雅。 9 |   “这家伙,竟然又在秦师姐的讲堂上睡觉。”似乎这才注意到那熟睡的身姿,周围许多少年都有些无语,显然,这已经不是第一次了。 10 |   “以秦师姐的容貌和身材,哪怕是看着她也足以令人赏心悦目,那家伙脑子里究竟装的什么。” 11 |   在诸多讲师当中,秦伊绝对是人气最高的讲师,没有之一,至于原因,只要看到她便能明白,不知多少人将之奉为女神,她的讲堂,从来都是将学舍挤满为止。 12 |   在秦伊的讲堂上睡觉?这简直是对女神的亵渎。 13 |   秦伊的步伐很轻,走到少年的身边之时没有发出一点声响,她站在桌前,看着眼前那酣睡中的面孔,她的美丽容颜上布满了寒霜。 14 |   “叶伏天。”一道轻柔的声音传出,不过却并非是从秦伊口中喊出的,而是来自叶伏天的身后。 15 |   似乎是在睡梦中听到有人喊自己,叶伏天的身子动了动,双手撑着脑袋,悠悠的睁开眼睛,朦胧的目光下,映入眼帘便是一道秀美身影! 16 |   “媳妇。”叶伏天情不自禁的低语了一声,他的声音很轻,像是在自言自语,然而在此刻安静的环境中,这声音依旧显得格外的突兀,只一瞬间,许多道目光凝固在了空气中,随即又化作愤怒。 17 |   “他竟然敢……公然轻薄秦师姐?” 18 |   “这厚颜无耻的家伙,混蛋。”一道道愤怒的目光像是化作利剑,使得叶伏天打了个冷颤,像是感觉不对劲,他的目光抬起,随后便看到了一张精致如玉却满是怒火的脸庞。 19 |   “额……”叶伏天一脸黑线,怎么是秦伊?喊他的人不是晴雪吗? 20 |   回头看了一眼,便见到一位十五岁的清纯少女正对着他怒目而视。 21 |   叶伏天扫了一眼少女,随即暗骂一声,被害惨了。 22 |   “秦师姐,我……”叶伏天刚想解释。 23 |   “叶伏天。”秦伊冷漠的将他打断,道:“青州学宫是在什么背景下创立?” 24 |   很显然,秦伊是要回避刚才的尴尬,转移话题,但她此刻的怒火,叶伏天却能够清楚的感受到,他甚至隐隐感觉到从秦伊身上流动出一缕缕剑意,锋利刺骨,刺痛着他的每一寸肌肤。 25 |   “三百年前,东凰大帝一统东方神州,下令天下诸侯创建武府学宫,兴盛武道,青州学宫便是在此背景下创立。”叶伏天回应道,当然他所说的是正史记载,在家族中他所看到的野史中还有另一个名字存在,然而,那禁忌之名,却决不允许被提及。 26 |   “修行有哪些职业?”秦伊再问。 27 |   “修行可分武道和术法,修武有战士、骑士、剑客等许多职业,修术法者有法师、丹师、炼器师等诸多职业,且法师又分多系,当然也有天赋异禀者武法兼修。”叶伏天回应。 28 |   “你似乎还遗漏了一种职业。”秦伊神色肃穆,很认真的问道。 29 |   “当然不会遗漏?”少年的脸上露出一抹神圣的光辉:“神州公认的最强职业,得上天眷顾者,天命法师,拥有上苍赐予的天赋,那些天赋罕见之人,如召唤师、驭兽师,星术师,绝大多数都出自天命法师,天命法师无论修行武法,都能比他人拥有更强的天资。” 30 |   周围诸人都心驰神往,天命法师,传奇职业,承天命,得上苍眷顾。 31 |   “不仅如此,即便是最普通的天命法师,也天生适合武法兼修。”秦伊目露憧憬,随后看向眼前的少年,又有些愤怒道:“没想到你对此了解不少。” 32 |   “当然。”叶伏天看着秦伊,认真的道:“我就是一名天命法师。” 33 |   “噗……”不远处一名正在喝水的少年猛的呛到,剧烈的咳嗽着,周围一双双目光望向叶伏天,像是看白痴般。 34 |   世间竟有如此厚颜无耻之人,不愧是青州学宫的传奇人物,不仅公然调戏秦师姐,如今又谎称自己是天命法师,为了吸引秦师姐的注意? 35 |   然而,他是什么人,入学宫修行三年,一直在觉醒第一境聚气境徘徊不前,身体孱弱,显然炼体都没有完成,如此平庸甚至堪称废柴的人物,说自己是天命法师? 36 |   这还要不要脸了? 37 |   秦伊气息又一次起伏,她愤怒的看着叶伏天:“既然你是天命法师,自然命宫有魂,将你的命宫之魂释放让我看看。” 38 |   “我的命魂还在沉睡,无法召唤而出,我在讲堂上入睡也是因为命魂的缘故。”叶伏天平静回应。 39 |   “叶伏天……”秦伊忽然间大声喊道,美眸死死的盯着眼前少年,道:“三年前,你十二岁入学宫,那时我还是外门弟子,参观你们天赋检测,你对灵气感知为天品,震惊学宫,许多师长关注,然而之后三年来,未有寸进,始终停留在觉醒第一重聚气境,终日无所事事,懒惰不堪,在讲堂上心不在焉,你究竟有没有修行?如今,你又谎称自己为天命法师,讲堂入睡也以此为借口。” 40 |   “三年来,无论是春闱还是秋闱大考,你全都弃权,直接名列学宫倒数第一,叶伏天,你究竟有没有廉耻之心?” 41 |   伴随着秦伊愤怒的咆哮,整间学舍变得寂静无声,落针可闻,诸人的目光凝望着秦伊激动的容颜,似乎,这还是他们第一次见到秦师姐如此模样。 42 |   叶伏天似乎也被镇住了,那双漆黑的眸子凝视着面前因愤怒而通红的精致容颜。 43 |   “三年了吗。”叶伏天心中低语,没想到不知不觉已经过去三年,而命宫中的家伙,还是一点没有变化,而且他有些意外,向来冷漠的冰山性感女神秦师姐,原来竟一直关注着他,从当年他踏入学宫检测出天品感知天赋就已经开始了。 44 |   空间一片死寂,秦伊美眸凝视眼前的少年,线条清晰的英俊面孔,干净深邃的眼睛灿若星辰,十五岁的年龄,除了体型偏瘦之外,挑不出其它毛病,再过三两年,必是一位美男子。 45 |   “我的语气是不是太重了些?”秦伊见叶伏天眼角似有几分落寞之意,不由得心中暗道,怒意便也消散了几分。 46 |   “还有一个月时间又到秋闱大考,这次你若还是弃权或者不合格,即便余生为你说情也没用了,学宫不会再允许你继续留下,你究竟明不明白?”秦伊继续道,学舍中的人目光一凝,看来学宫对那家伙是忍无可忍了。 47 |   终于,要被青州学宫逐出了吗?若是如此,恐怕将载入青州学宫史册了,毕竟能够被青州学宫逐出,也是及其罕见的。 48 |   “他走,我走。”在最后面,一道淡漠的声音传来,不少人望向那坐在角落中的少年,眼神复杂,有羡慕、嫉妒、也有崇拜、畏惧。 49 |   “学宫中已有决定,余生无需参加明年的春闱,可任意挑选学宫战楼、骑士团,以及术法宫任意一宫修行,他的未来,不能再受你连累了。”秦伊看着叶伏天叹息,他和余生两人的命运,终将走向完全不同的方向。 50 |   “连累?”叶伏天嘴角勾勒起一抹淡淡的笑容,有些玩世不恭。 51 |   “闭嘴……”坐在后面余生站起身来,那双眼眸透着璀璨的锋利光芒,刺向秦伊。 52 |   “坐下。”叶伏天头也没回,淡淡的说到,余生的目光一滞,看着前方的背影,随后安静的坐了下去,仿佛叶伏天的话对他而言,便是铁令。 53 |   “我决定…………”叶伏天脸上露出一抹略显轻狂的笑容,看着秦伊道:“正式参加今年的秋闱大考了。” 54 |   后面,余生的眼眸中闪过一道璀璨的光芒。 55 |   三年了,他终于,要认真了吗? 56 |   青州学宫三年修行,学宫之人皆都只知道他余生天赋绝伦,金系属性感知力天品,武道天赋也奇高,可法武兼修,虽是外门弟子,境界却比许多讲师还要高。 57 |   然而,谁又真的了解那沉睡的少年? 58 |   “你身体孱弱,依旧还停留在觉醒第一重聚气之境,即便参加秋闱大考,如何能过?”秦伊看着叶伏天,心中暗叹,即便如今奋起,怕是依旧晚了。 59 |   “若是过了呢?”叶伏天似乎一点没有自知之明,语气中有着强大的自信。 60 |   “你若能过,以后讲堂上你想做什么都行。”秦伊道。 61 |   ps:《太古神王》完结两个月后,新书发布,大家多多支持啊! -------------------------------------------------------------------------------- /CrawlerClassCode/class4/novel/第七章 刻箓师: -------------------------------------------------------------------------------- 1 | 山路上,不断有人下山,有人神采奕奕,也有人精神萎靡,很多人都在议论蟒妖出没一事。 2 |   师长已经下了定论,有亲眼目睹的人怀疑自己是否看错了,毕竟那些修炼成精的妖蟒,和龙是有些相似的。 3 |   叶伏天看到了一道熟悉的身影从山上走下,风晴雪火红色的衣衫有些灰尘,但那张漂亮的脸蛋却依旧干净,容光焕发,心情似乎很不错,正和身旁的慕容秋闲聊着。 4 |   见到风晴雪和慕容秋走下山,有一些人不由自主的看向了叶伏天,让叶伏天很是郁闷。 5 |   风晴雪显然也注意到了这一幕,看到了叶伏天,不过她的目光瞬间移开,似乎有意避开和叶伏天对视,也停止了说话。 6 |   旁边的慕容秋像是察觉到了什么般,他的眼眸顺着山路往下,落在了叶伏天的身上,十七岁的英俊面庞透着淡淡的高傲,含笑的眼神似有些不屑一顾,只是看了一眼,便将目光移开了。 7 |   叶伏天并没有将太多的注意放在那边,他对着身旁的余生道:“如果真的是龙,学宫是否会有意隐瞒?” 8 |   余生沉吟片刻,随后点了点头,认真的道:“会。” 9 |   “趁现在还没有完全清场,上山。”叶伏天开口说了声,脚步一踏,便朝着山路奔跑而去。 10 |   许多人看到这一幕都愣了下,风晴雪更是站在那发呆,目光死死的盯着跑向她的叶伏天,他不会受了刺激吧? 11 |   眼看叶伏天就要来到身边,风晴雪美眸盯着他,嘴唇微动,刚想要说什么,却见叶伏天直接从她身旁掠过,显然不是冲着她去的。 12 |   余生锋利的目光扫了一眼风晴雪和他身旁的慕容秋,擦肩而过。 13 |   “他们干什么?”诸人显然也意识到自己误会了,叶伏天和余生竟然这时候上山? 14 |   “疯了吗,之前不去,如今有蟒妖出没,大家都下山,他们反而往山上跑?”许多人不解,叶伏天也不知道,但他很想看看传说中的龙,大自在观想法可观飞禽走兽从而受益,如果观龙,会怎么样? 15 |   余生他也一样,想要看看龙长什么样。 16 |   上山的主路路口被封了,有青州学宫的师兄在那里守着,只准下山,不准上山,好在叶伏天和余生已有心理准备,没有靠过去,而是从小道绕路上山。 17 |   一路上,处处关卡,越是如此,两人好奇心越重,也更坚定了心中的猜测。 18 |   山上,丛林之中,两人悄悄潜行,余生问道:“这样摸索也难找到,我们去哪个方向?” 19 |   “哪里封锁的人最多,就去哪个方向。”叶伏天双眸放光,余生眼睛一亮,继续往封锁最严重的方向潜行。 20 |   时间一点点的过去,太阳落下,夜幕降临,更方便了两人的行动。 21 |   “好像人越来越少了,我们可能到了核心区域,就在这里等吧,碰运气了。”叶伏天靠在一棵大树上闭目养神,夜渐深,这片区域有着诡异的安静,仿佛没有妖兽在这一代活动。 22 |   忽然间,一道闪电划过夜空,将密林照亮得如同白昼般,这一刻,守在这片区域的人都抬起头,目露凝重之意。 23 |   要来了吗? 24 |   “轰隆隆……”雷鸣声传出,一道道闪电陆续出现,越来越频繁,叶伏天看到这诡异的场景有些兴奋,也有些紧张。 25 |   “龙,真的是龙。”有惊呼声传出,叶伏天从地上跳了起来,目光朝着不远处的空中望去,在那里,一头长达数千米的巨龙盘旋飞舞,刹那间便消失不见出现在另一处方位,轰鸣声越来越响,这片区域化作了雷电的世界。 26 |   “龙。”余生死死的盯着空中,无法用语言来形容此刻内心中的震撼。 27 |   上空,出现了一道道强者身影,他们身体周围有着璀璨的光芒,背生法相,极其威武,犹如绝世强者般傲然而立。 28 |   虚空之上,一道身影如同闪电般降临,此人中年模样,相貌极为英俊,看到他出现,不少强者都微微欠身,显然此人地位极尊。 29 |   “这不是龙。”这身影背负双手,抬头望向虚空,第一句话便使得诸人一阵心颤。 30 |   “这是龙形,龙韵,被刻意释放在这里展露出现。”中年眼神锋利至极,道:“能有此龙形龙韵,必是来自真龙,究竟有何方人物来到了天妖山。” 31 |   “难怪只露其形韵,而没有破坏力,若是真正的龙,恐怕我们早已被毁灭。”虚空中有强者开口道。 32 |   “即便不是真龙,有龙形在我青州城出现,也不知是福是祸。”中年目光有神,扫向下方,看到在不同方向竟有数位少年,不由得低声道:“真是些胆大的家伙。” 33 |   在下方,不仅只有叶伏天和余生偷偷来到了这里,还有其他人也没有离开,少年的内心总是充满了好奇,尤其是对传说之物。 34 |   “这群小兔崽子。”旁边一位强者低骂道,都封锁了这边,竟然还是被这些小家伙溜进来了。 35 |   此刻叶伏天心无旁骛,眼里只有虚空之上的龙,或神龙摆尾、或飞龙在天,神龙见首不见尾,那一幕幕,不断的冲击着他的内心。 36 |   大自在观想法运转,他的命宫中仿佛也出现了无尽雷电,出现了龙影。 37 |   可怕的雷系灵气朝着他身周汇聚,一道道闪电竟在他的身上游走,他的意识都仿佛要沦陷,眼瞳中,只剩下那头神龙。 38 |   眼前的一幕幕,像是要刻入他的脑海之中。 39 |   一道闪电忽然间降临,刺入他都眉心,那狂暴都龙影,烙印在他都瞳孔之中。 40 |   “嗤嗤……”恐怖的雷霆力量在叶伏天的身上游走,使得他躯体承受着极霸道的力量,忍不住发出低沉的嘶吼声,但此时他自己都仿佛无法从这种状态挣脱出来,那龙韵,竟然刻入脑海。 41 |   神龙摆尾而来,他看到了那威严无比的龙朝着他扑来,这一瞬间,叶伏天的身体微微颤动着,却无法移动分毫。 42 |   “小心。”余生像是感觉到了什么般,大吼一声,但已经晚了,那可怕的龙影竟疯狂冲入叶伏天的眉心,叶伏天发出惨烈的嘶吼声,仿佛一头真正的龙在急速的钻入他的脑海之中,带着无尽的雷霆。 43 |   “轰。”脑海剧烈一颤,叶伏天的意识渐渐涣散。 44 |   “你终于,长大了。”一道声音在叶伏天的脑海中响起,他的身体直挺挺的倒了下去,同时,这片天地的异象也消失不见。 45 |   “怎么回事?”虚空中的强者闪烁而来,他们目光凝视叶伏天,有一人低骂道:“刚才发生了什么?” 46 |   “这倒霉的小家伙,似乎被龙韵攻击了。”有人开口道。 47 |   “真是太大胆了,快看看有没有什么事。” 48 |   “他没事。”此时,英俊中年走了过来开口道,叶伏天身旁的余生抬头看向他,只见中年开口道:“将他暂交给我,我带他回去看看。” 49 |   “好。”诸人点头,余生则看向他,道:“前辈,我能否一起前往。” 50 |   “放心,他不会有事,我就在学宫中。”中年对着余生说道,他的眼神有着一股奇特的魔力,让人愿意相信他,余生点了点头道:“麻烦前辈了。” 51 |   ………… 52 |   叶伏天睁开眼睛,感觉到身上竟没有丝毫的痛感,不由得有些诧异。 53 |   意识进入命宫中,果然,在世界古树之上,有着一片雷电区域,一头龙盘旋在那,无比威严。 54 |   “竟然,进入了命宫。”叶伏天内心颤动着,在晕倒之后,他似乎听到了什么声音,又想不起来。 55 |   自从真正开始修行以来,已经晕过去两次,叶伏天想到这不由得苦笑,这还真是,够倒霉的,当然,如果每次昏迷都能够有这两次的收获,他不介意多来几回。 56 |   像是感觉到了什么般,叶伏天猛的坐了起来,发现身上的衣服不是自己的,而这里,显然也不是他所住的别院。 57 |   站起身来,叶伏天推开房门走了出去,只见这里是一处非常清净优雅的别院,前方有着一处亭台,在那里,有一位少女安静的坐在那,像是在画画,旁边,还有一位中年正优雅的品茶,这幅画面显得格外的宁静。 58 |   轻轻的走到亭台旁,他的目光落在少女所画的地方,那是一张特殊的纸,而少女不是在作画,而是在不断刻画着一些神奇的线条,有淡淡的灵气从中弥漫而出。 59 |   “这是,法箓。”叶伏天有些吃惊,眼前的少女,她竟然会刻法箓? 60 |   这么说来,她岂不是一名刻箓师,这未免也太妖孽了些吧? 61 |   “你见过?”英俊中年放下手中的茶杯,看向叶伏天道。 62 |   “没有,但在书中看到过。”叶伏天道:“这箓纸上正在刻一面盾,以金属性灵气刻画,应该是防御法术。” 63 |   “你能看到?”中年有些吃惊。 64 |   “嗯。”叶伏天点头,大自在观想法对灵气的感知极其敏锐。 65 |   “想不想学?”中年笑着问。 66 |   “想。”叶伏天点头,随即便对着中年躬身行礼,道:“弟子拜见老师。” 67 |   那动作,简直不要太快。 68 |   叶伏天当然清楚一名刻箓师的分量,比法师还要稀缺罕见的职业,地位极为高贵,一名刻箓师,必然也是天赋异禀的法师。 69 |   “你果然和传闻中一样无耻。”少女放下手中的笔,看着叶伏天道。 70 |   叶伏天不在意的笑了笑,看着少女那张惊艳的容颜,道:“妖精,我们又见面了。” 71 |   PS:谢谢悠悠、飘飘、小静、星海四位盟主,感谢所有打赏推荐的兄弟们,新书期成绩很重要,大家多多支持。 -------------------------------------------------------------------------------- /CrawlerClassCode/class4/novel/第三章 一日三境: -------------------------------------------------------------------------------- 1 | 青州学宫身为青州城圣地,占地极为广袤,倚山而建,背靠天妖山,在青州学宫中,哪怕是外门弟子,都有自己独立的别院。 2 |   叶伏天回到外门弟子居住的区域,自己的别院之中,余生安静的跟在他身后。 3 |   “余生,我打算放弃了。”此时,叶伏天停下脚步,低声说道。 4 |   “即便不觉醒天命,你依旧是天才。”余生看着前方的少年道,叶伏天说他是天命法师,诸人都以为是个笑话,只有余生知道,这一点不好笑。 5 |   叶伏天,他的确是天命法师。 6 |   “这我当然明白,只是有些不甘心啊。”叶伏天苦笑:“三年了,若是再这样下去,就真的要被你甩开了,看来,要好好努力了。” 7 |   “走吧,开始修行了。”叶伏天回头看了一眼比他高一个头的少年,余生体型比常人更大一块,天生就有一股强大的气场。 8 |   两人走到别院中修行之地,叶伏天盘膝坐下,只见他眼眸闭上,刹那间,周身流转着璀璨的气流,周围一小片天地的灵气像是疯了般,纷纷朝着叶伏天的身体涌去,余生坐在他身后安静的看着这一幕,此时的叶伏天犹如一可怕的漩涡,吞噬一切灵气,若是被其他人看到,怕是会惊为天人。 9 |   可怕的气流顺着叶伏天的身体,朝着他脑海中某处部位流动而去,那里是他的命宫。 10 |   命宫有魂,是为命魂,可称天命修行者。 11 |   此时,在叶伏天的命宫中,有着一棵参天古树,生长着茂密的翠绿枝叶,周围却是荒芜一片,当天地灵气涌入之时,古树贪婪的汲取着一切灵气,翠绿枝叶发出沙沙声响,无风自动。 12 |   在古树之下,凝聚出一道虚幻的身影,那是叶伏天的身影,他看着眼前的古树,低声道:“汲取了三年灵气,依旧毫无变化,只知索取,既然如此,从此以后,我不会再以灵气灌入。” 13 |   说罢,叶伏天的意识虚影消失,那些流入体内的天地灵气朝着四肢百骸而去,而不再流入命宫。 14 |   强大的天地灵气冲刷着肉身,准备炼体,但就在此刻,异变陡生,一股强大的吸扯力传来,刹那间灵气倒流,再次疯狂的朝着命宫方向流动而去。 15 |   这突如其来的变化使得叶伏天身体一颤,随即有着一抹强烈的不爽,三年来灵气全部送入命宫,却一点变化没有,如今,竟然还要强行夺取,阻止他修行? 16 |   想到这叶伏天想要对抗,然而,那股霸道的力量无视一切,疯狂的吸扯一切灵气,甚至,叶伏天体内的精气都被吸出,只是短短的瞬间,他的脸色就变得苍白了许多。 17 |   “混蛋。”叶伏天怒骂一声,伴随着灵气疯狂涌入命宫,他感觉到脑袋剧烈颤动着,像是命宫内发生了剧变,意识想要进入,却瞬间被一股狂暴的力量撕碎。 18 |   “啊……”一道低沉的嘶吼声从嘴中吐出,余生猛然间站起身来,盯着叶伏天身上的剧变,不仅是叶伏天身体,就连他周身聚集的天地灵气都疯狂的流向叶伏天,而且,周围的花草树木正在以极快的速度枯萎,像是想到了什么般,余生眼眸中闪过一道璀璨的锋芒,他走到叶伏天身后坐下,双手放在他的身上,果然,只一瞬间一股强大的吸力吞噬着他体内的灵气。 19 |   终于,要觉醒了吗? 20 |   ………… 21 |   叶伏天醒来的时候,只感觉身体极度虚弱,他睁开眼睛,阳光有些刺眼,显然已经过了一夜。 22 |   “这是,怎么回事?”叶伏天坐了起来,见到周围草木枯萎,余生也虚弱的坐在一旁调息。 23 |   想起昨天发生的事情,他闭上眼睛,意识进入命宫,随后,身体猛的颤了下,此刻,本荒芜的命宫中,苍穹之上竟有月光洒下,还有一片茫茫大地,似有山水,命魂古树矗立在大地上,迎风招展,枝叶繁茂,变得更加翠绿,像是布满了灵气。 24 |   “世界之树。”古树下出现了意识所化的叶伏天虚影,难道老爹没有骗自己? 25 |   老爹曾对自己说过,他的祖上有逆天修行的天命法师,命魂世界之树,可夺天地万物之灵,只是后来家族传承断绝,而他叶伏天,是唯一一位继承了祖上天赋的人。 26 |   “这么说来,大自在观想法岂不是也是真的?”叶伏天想起从小便倒背如流的大自在观想法,心头有些激动,随即闭目,口中有晦涩法诀吐出,很快,他变得心无旁骛,念头通达,意念随心所欲,驰骋于天地之间。 27 |   很快,在叶伏天的观想中,浓郁的天地灵气出现,他甚至能够从中看到不同色泽的灵气,那是最为纯粹的不同属性灵气,每一种色泽,代表着一种属性。 28 |   “火焰。”叶伏天意念锁定火焰色泽的灵气,那是火属性天地灵气,世界之树命魂化作了火焰色,耀眼夺目,顿时,外界火焰灵气凶猛的朝着叶伏天体内流动,游走于五脏六腑,那股灼热感极为强烈。 29 |   “木属性。”叶伏天运转大自在观想法,转而观想绿色灵气,顷刻间,木系灵气灌入身体当中,他体内耗损的精气神飞快的恢复着。 30 |   “金、土、风、水……”叶伏天不断尝试,良久,他终于停下,再次睁开了眼睛,傻傻的看着前方发呆。 31 |   “这是,真的吗?”叶伏天看着自己的双手,有些不敢相信。 32 |   “当然是真的,你是,全属性法师。”身后,余生双拳紧握,浑身上下因激动而青筋暴露,目光死死的盯着叶伏天道:“而且,是能够武法兼修全属性天命法师。” 33 |   “这样的话,我的天赋岂不是……”叶伏天双眸精芒闪烁。 34 |   “逆天。”余生道:“青州城绝没有第二人。” 35 |   一抹灿烂的笑容在唇角绽放,祖先的天赋上辈那么多人没有继承,却落在了自己的身上,这就是天命吗?天命法师,上承天命。 36 |   “走。”叶伏天忽然间站起身来,朝着别院外而去。 37 |   “去哪?”余生问道。 38 |   “后山。”叶伏天回应道,后山,指的是青州学宫背靠着的天妖山。 39 |   “后山妖兽横行,去那里做什么?”余生问。 40 |   “就在边缘区域,有你怕什么。”叶伏天说话之时人已经走出,余生没有多言,紧随其后。 41 |   天妖山乃是一片连绵山脉,地势险峻,山间妖兽横行,极少有人知道其究竟有多深,据称青州学宫倚山而建,就是为了防范天妖山的妖兽出山祸害,同时,也是学宫弟子历练之地。 42 |   正午时分,两位少年登上了天妖山边缘之地的一座山峰之巅,站在巨石之上,眺望下方巍峨学宫,叶伏天吐出一口浊气。 43 |   三年了,自知是天命法师的他怎甘心只修行武道,然而命魂一直未有变化,让他的骄傲外表下始终隐藏着一层落寞,如今,一切终于结束了,他将向着梦想前行,成为一名强大的天命修行者。 44 |   烈日当空,落在叶伏天的身上,少年抬头直视阳光,那眯着的眼睛透着强大的自信。 45 |   大自在观想法,它的精髓,在于观和想。 46 |   此刻,他要观想太阳。 47 |   叶伏天于山顶巨石上观想烈日,很快,太阳光线化作太阳之火,弥漫于叶伏天周身,随即钻入叶伏天身体当中,一股霸道无匹的烈日之火在体内游走,通五脏、达六腑,经四肢百骸,充盈全身。 48 |   余生目视前方,看到叶伏天化身火人,那双坚毅的眼眸露出一抹笑容,沉睡的真龙,终将苏醒。 49 |   噼里啪啦的声响传出,叶伏天的肌肤都被火焰烙得通红,在太阳之火的煅烧下,他的身体无时无刻不在蜕变。 50 |   良久,叶伏天的肌肤变得晶莹,像是有火光,他体内,则是出现了一条条火龙,朝着各处经脉撞击,发出轰隆隆的嗡鸣声响,动静极大,好在山顶无人,只有余生能够听见这狂暴声响。 51 |   炼体开脉如此大的动静,简直骇人。 52 |   不知不觉已近黄昏,太阳西落,叶伏天身体已被火焰包裹,体内似有狂风暴雨,骨骼不断发出咔嚓的声响,直到太阳消失,叶伏天才停下,眼眸缓缓睁开,竟有一道火光从眼瞳中射出。 53 |   “一日三境。”余生震撼开口,压抑三年,一朝爆发,借太阳之力煅烧肉身,连破炼体、开脉之境,踏入觉醒第四重之境,铁骨,一身铜皮铁骨。 54 |   “太霸道了。”叶伏天喃喃低语,寻常人要锻造一身铜皮铁骨,至少需要数月时间,他成为天命法师,以大自在观想法观想太阳之火锻造,再有命魂辅助,半日锻造出一身铁骨。 55 |   此刻的他只感觉浑身充满了力量,站起身来,叶伏天走到山顶的一颗巨大古树前,拳风呼啸,一拳轰在粗壮的大树躯干之上,顷刻间咔嚓的声响传出,躯干粉碎,眼前的大树四分五裂,随后轰然倒塌,拳头所落下的地方,一片焦黑。 56 |   “他人神力之境,也绝非你一拳之敌。”余生看到这一幕叹道,觉醒第五重神力之境,力大无穷,但叶伏天这一拳,绝对超越寻常武修神力之境所拥有的力量。 -------------------------------------------------------------------------------- /CrawlerClassCode/class4/novel/第二章 三年聚气: -------------------------------------------------------------------------------- 1 | 秦伊恶狠狠的盯着叶伏天,看到他脸上的笑容,不由得想起了三年前,那一年他十二岁,天赋检测时面对诸多学宫的大人物,他那干净的脸上挂着的笑容却是那样的自然、且骄傲,迥异于其他少年的紧张忐忑。 2 |   那次的检测结果,天地灵气感知力,天品;天生的武道修行者。 3 |   如今三年过去,除了感知天赋依旧还在,他的境界却没有一点进步,散漫、懒惰,甚至很少能在讲堂上看到他,但他的眼神却和三年前一样。 4 |   “若是你没有做到呢?”秦伊问道。 5 |   “秦师姐想如何都行?”叶伏天道。 6 |   “希望你不要影响余生的前程。”秦伊抬头看了一眼坐在后面的刚毅少年。 7 |   余生,金系属性感知力天品,八重觉醒百变境,比七重觉醒玄妙境界的她还要强一筹,他的未来,不应该被耽误。 8 |   “好。”叶伏天点头,只是,这可能吗? 9 |   秦伊走回讲台,美眸环视诸人,随后道:“距离秋闱还有一个月时间,希望你们能够抓紧时间,等到明年春闱,又将会有一批外门弟子正式踏入学宫,凌笑,你已经踏入六重觉醒无双境,风晴雪,你在五重觉醒神力境也停留了不少时间,希望在明年春闱大考时都能够再进一步。” 10 |   修行第一境为觉醒,又称九重觉醒,分别为:聚气、炼体、开脉;铁骨,神力、无双;玄妙、百变、归一。 11 |   若能在十八岁前经历七次觉醒,踏入玄妙之境,在春闱大考中只要表现不是太差,便能够真正成为青州学宫的正式弟子。 12 |   “秦师姐放心。”凌笑点头应道,风晴雪则是握了握拳,距离目标,越来越近了。 13 |   “散了吧。”秦伊轻声道,随后抬起脚步朝着学舍外走去,许多少年的目光也追随着那曼妙的身影而去,终于,当秦伊的背影消失之后,一道道恶狠狠的目光望向了叶伏天,这混账家伙,竟然轻薄他们心中的女神。 14 |   “叶伏天。”一道清冷的声音传出,将许多人的目光吸引过去,声音的主人正是坐在叶伏天身后之前提醒他的少女,风晴雪。 15 |   十五岁的她已出落得亭亭玉立,眼睛非常好看,五官精致,浑身上下洋溢着青春气息,给人清纯唯美之感。 16 |   “你怎么可以这样?”风晴雪眼神中有着几分愤怒,瞪着叶伏天。 17 |   叶伏天看着少女莫名的怒意,眉头一挑,随即笑道:“你不会吃醋了吧?” 18 |   风晴雪美眸一滞,有些无语的看着对方,继续道:“叶叔叔那里你怎么交代。” 19 |   “向父亲交代?”叶伏天眨了眨眼睛。 20 |   “你这脑袋整天想些什么呢,我们毕竟还小,娶媳妇的事情以后再考虑。”叶伏天语重心长的道,此言一出,顿时又是满堂寂静,许多少年只感觉怒火中烧。 21 |   这混账,怎么可以这样无耻,不久前才公然轻薄了女神秦师姐,如今又对十五岁的清纯少女风晴雪说出如此不堪的话语。 22 |   这还要不要脸了? 23 |   风晴雪愣住了,随后脑海中也想起叶叔叔曾经对着自己父亲开过一个极不正经的玩笑,俏脸瞬间变得通红,这无耻的混蛋,是不是故意曲解她的意思? 24 |   “我的意思是这次秋闱之后你若是被逐出学宫,怎么像叶叔叔交代。”风晴雪瞪着他,这家伙脑子里装的是什么? 25 |   显然,她可不相信只有觉醒一重境的叶伏天,能够通过即将到来的秋闱大考。 26 |   “怎么可能。”叶伏天看着少女的模样,淡淡的摇了摇头。 27 |   “三年,一直停留在觉醒第一重,却依旧我行我素,谈笑自若,我也想问一声,叶伏天,廉耻二字,你究竟知不知道怎么写?”一道冷峻的声音突兀的想起,许多人回头,看向坐在风晴雪后面的少年,凌笑。 28 |   觉醒第六重无双之境,走风系法师路线的凌笑,在青州学宫外门弟子十五岁这一年龄,绝对是天赋非常出众的,明年便有机会通过春闱大考正式踏入学宫。 29 |   凌笑说话的时候甚至没有抬头去看叶伏天一眼,他的目光落在风晴雪身上,继续道:“最底层的存在,却言语轻薄于一位耀眼的天才少女,究竟是哪来的勇气和自信,倒是应了一句话,无知者,无畏。” 30 |   凌笑说出了许多人想说却不敢说的话,他们都讽刺的看向叶伏天,这家伙,论无耻程度,的确无人能及。 31 |   余生不知道何时走到了叶伏天身边,当他站在那的时候,顿时给人以强大的气场,那些肆无忌惮的讽刺眼神也收敛了许多。 32 |   “余生哥。”风晴雪轻轻的喊了声。 33 |   “嗯。”余生随意的点了点头,他的目光却盯着凌笑,透着强大的压迫力。 34 |   “无知者,无畏?”叶伏天并没有因凌笑的讽刺而恼羞成怒,这样的事情,这三年来经历了不少,总有些人喜欢踩着他人来证明自己的优越,尤其是当着美女的面。 35 |   “你认为自己知道很多?”叶伏天淡淡的道。 36 |   “对于修行,我所知道的,自然不是你能比的。”凌笑平静说道,一个觉醒第一重境界,难得才会在讲堂上出现的废柴,能不无知吗? 37 |   “一位战士,要如何才能够战胜火、金双系术法师?”叶伏天忽然间提问,凌笑一愣,随即讽刺道:“你是在秀自己的智商吗,莫说是火、金双属性法师,即便是其中任意一种单系法师,只要不白痴到让战士近身,独战的话都几乎处于不败之地。” 38 |   法师能够使用术法,单独对战优于战士,这是毋庸置疑的,战士的胜率极低。 39 |   “白痴,若是战士的境界更高,自然就能战胜。”叶伏天嘲讽的道,凌笑一愣,脸色沉了下来,周围的人也都看着叶伏天,这提问未免也太无耻了吧? 40 |   “你提出不同职业的战斗,自然是默认以同境界为前提,如此小道,有意义吗?”凌笑讽刺道。 41 |   “同境界么,那么这战士如果是位体修,且修行身法呢?”叶伏天再问,学舍中许多人都愣了下,露出思考之色,体修爆发力强,如果再修行身法,必然能够短时间靠近术法师近战。 42 |   “你所说的是火、金双属性法师,火焰术法裹身,再配合金系的强大防御和攻击力,即便近身也不会弱于体修。”凌笑冷笑道。 43 |   “这体修如若再修行九重裂这样的战技,配合体修的爆发力,你认为金属性的防御有用?”叶伏天露出一抹轻蔑之意:“至于法师的攻击,你应该明白毫无意义。” 44 |   凌笑眼神凝重了几分,的确,一位修行身法的体修必然能够避开术法的正面攻击,从理论上而言,叶伏天是对的。 45 |   “这终究只是纸上谈兵而已,没任何实际意义。”凌笑自然不能认输。 46 |   “没错,法师怎么可能输给战士。”有人附和道。 47 |   “人云亦云,还自诩博学讽刺他人无知,那我再问你最简单的问题,觉醒第一重聚气之境,不同人修行可有差别?”叶伏天又问道。 48 |   “武道修行感知天地灵气,以此来聚气,法师对单一属性灵气感知力更敏感,但也更加纯粹霸道,因而是以单属性灵气聚气,两者自然不一样,如若都是武道修行,那么没什么差别,如果是法师聚气,因为属性不同,聚气境自然有差别。”凌笑缓缓开口,将诸多因素都考虑其中。 49 |   “白痴。”叶伏天轻蔑的扫了凌笑一眼,随后便转身离开。 50 |   “你什么意思?”凌笑皱眉看着叶伏天的背影:“无言以对了,便佯装胜利离去?可笑。” 51 |   “这家伙真能装。”有人讽刺道。 52 |   然而就在他们说话之时,背对着他们的叶伏天身上忽然间出现了一道耀眼的光芒,那是气流,于周身流转,宛若一道璀璨光幕,顿时身后的讽刺目光直接凝固在了那里,神色变得格外的精彩。 53 |   叶伏天就是聚气之境,他在用实际告诉诸人,他的聚气之境,就与众不同。 54 |   凌笑的眼神略显阴沉,气流周身,光芒四射,这真的是觉醒第一境聚气境? 55 |   余生踏步跟随叶伏天一起离开,很快身影消失在了门外,在他们离去之后,学舍内一片哗然。 56 |   “这败类聚气境竟然真的和别人不一样。” 57 |   “那又如何,三年时间依旧停留在聚气境,当然会有点不一样,若是我们也和那废物一样,同样能够做到。” 58 |   “说的没错,三年聚气,不知道他哪来的底气,有什么资格那样嚣张。” 59 |   “竟然敢对秦师姐和风晴雪说出那样的话语,可恶,这人渣。” 60 |   “凌笑,不要太在意了,纸上谈兵再漂亮,若是正面遇上你,你一根手指都能捏死他。”有人对着凌笑大声道,立即有许多人附和。 61 |   凌笑若有所思,随即露出一抹灿烂的笑颜,没错,一个卑微的存在,何必太在意。 62 |   “晴雪,那家伙太不自重了,我知道你和他自幼关系不错,但还是和他保持一定的距离吧。”风晴雪身旁,她的好友慕容清劝道,她一直非常看不惯叶伏天,境界那么低,竟然还有脸洋洋自得。 63 |   “那家伙,的确有些过分。”风晴雪有些生气的道。 64 |   “晴雪。”慕容清见到风晴雪语气并没有太在意,不由得认真道:“你能不能清醒一些,你已经随时可能成为学宫正式弟子,应该好好思考将来了,他的行为可是会影响你的名誉,然而你却一点不计较,这让其他人怎么看?因为一个那样的人,值得吗?” 65 |   风晴雪美眸一凝,她倒没有想那么多。 66 |   “该成熟点了,以后少接触他,最好是和他划清界限。”慕容清继续劝道。 67 |    -------------------------------------------------------------------------------- /CrawlerClassCode/class4/novel/第五章 风晴雪的决定: -------------------------------------------------------------------------------- 1 | 转眼间,二十余天过去,后山有两道身影迈步往下,回到青州学宫。 2 |   叶伏天身上有不小变化,双眸变得更为有神,身材也更好了些,走在学宫青石路上,他有种恍然如梦之感,像是离开了很久。 3 |   “这家伙躲了这么久终于回来了。” 4 |   “秋闱大考还有八天时间,大概想躲也躲不掉了。” 5 |   学宫中不少人见到叶伏天都窃窃私语,二十多天前秦伊讲堂上发生的事情早已经传开,这三年不破一境的‘传奇人物’竟然当众对秦师姐无礼,后又欺负风晴雪,叶伏天三个字如今在青州学宫可是极为响亮。 6 |   “似乎有人找我麻烦?”叶伏天如今的听觉更为敏锐,即便是低声议论都能听见。 7 |   “你觉得呢?”余生同情的看了他一眼,无论是秦伊还是风晴雪,在青州学宫人气都是极高,追求者不少,尤其是秦伊,毕竟她已是十七岁的青春年华,这家伙对两人无礼,想找他算账的人怎么会少。 8 |   “没事,反正有你在。”叶伏天耸了耸肩。 9 |   “你现在可以自己解决了吧?”余生郁闷的道,如今叶伏天已经神力巅峰之境,战力可能比觉醒第六重无双境还要强横。 10 |   “要低调。”叶伏天背负着双手大摇大摆的前行,余生看着前方欠揍的身影无语,以前觉醒第一重境界喊着自己是天命法师,如今真的是天命法师了,反倒要低调?还能更无耻吗? 11 |   两人回到别院不久,果然便有人朝着他们所在的别院方向走来,而且,还不止一拨人。 12 |   两拨人似乎也是巧遇,相遇之时相互看了一眼,眼神锋利,于空中交汇碰撞,随后都走向了那座别院。 13 |   “是武道宫骑士团的人和术法宫的人。”许多人朝着这边涌来,纷纷露出异芒,这些到来之人都是青州学宫正式弟子,来自骑士团和术法宫,绝不是来争风吃醋那么简单。 14 |   青州学宫武道宫有战楼、剑阁以及骑士团,术法宫有七大行宫,其中一行到来之人身穿银色衣衫,熠熠生辉,正是来自以培养强大骑士为名的骑士团。 15 |   另一方人,则是身穿金色衣衫,正好与银色相辉映,这是来自是术法宫金行宫的法师。 16 |   “莫蓝山师兄,三星荣耀骑士;寒夜师兄,金系两星荣耀法师,他们竟然同时来了。”有人认出了两方为首的人,心头微凛,随即明白了两方人马为何而来。 17 |   真是,好大的面子啊! 18 |   武道宫和术法宫同时来人,自然不是来找叶伏天的。 19 |   别院之中,叶伏天站在一旁,看着两方人面前站着的余生,脸上挂着一抹淡淡的笑意,这始终站在自己身后的家伙,他的光辉,终究是无法被掩盖的,而且将来,将会更加耀眼,对于这一点,他无比的坚信,就像余生相信他一样。 20 |   之前讲堂之上,秦伊师姐说余生无需参加明年春闱便可任意挑选武道宫和术法宫,那时他便想,上面的人是否会主动出手招揽,如今,果然来了。 21 |   “你先出去吧。”莫蓝山淡淡的开口,叶伏天自然明白这句话是对他所说,微微一笑,也不在意,便走出了别院。 22 |   别院外此刻聚集了不少人,青州学宫外门弟子数千,每年能够被学宫主动招揽为内门弟子的人数不超过双手之数,羡慕嫉妒的人自然不会少。 23 |   “余生即将成为学宫正式弟子,而他却将被逐出学宫,真是笑话。”诸人见只有叶伏天一人在,倒没有掩盖自己的声音,如今学宫中对他不爽的人可是非常多。 24 |   “靠着余生庇护,才三年无忧,否则,他恐怕早已无法在学宫中待下去。” 25 |   “我到是有些期待,此次秋闱大考,他会有着怎样的表现。”有人笑着道。 26 |   “与其在这里担心我,不如好好想想你们自己,该如何应付接下来的秋闱大考,届时若是表现太糟糕,怕是会很没面子。”叶伏天身体倚靠在墙壁之上,随意的说道。 27 |   “语气真嚣张。” 28 |   “果然传闻不虚。”许多目光盯着叶伏天,见到一直追随在身后的余生将成为学宫正式弟子,他竟然就没有一点的羞耻之心? 29 |   叶伏天闭上眼睛,懒得去听那些声音,没过多久,别院中有人走出,是以莫蓝山为首的骑士团之人,他们从叶伏天身旁走过,随后,莫蓝山的脚步停顿了下。 30 |   “我听说余生的父亲是你家族中的一位管事?”莫蓝山淡淡的问道,他没有回头,目光也不知道看向哪里。 31 |   “是的。”叶伏天点头道。 32 |   “俗世的身世果然会束缚人的眼界,不过好在随着年龄的增长自然会越来越明白,终究不是一个世界的人,你现在有多骄傲,将来就会有多卑微,那些曾经和你有过交集的存在,将来,你连仰视的资格都没有。”莫蓝山冷淡说道,话音落下,便又重新迈步,身影渐渐远去。 33 |   从头到尾,他都没有正眼看叶伏天一眼,像是,不屑一顾。 34 |   叶伏天看着那离去的背影有些疑惑,他相信,余生在没有问过自己意见之前不会轻易决定,而莫蓝山既然知道自己和余生之间的关系,为何还会这样讽刺自己?似乎,自己和他从没有过交集吧? 35 |   术法宫的人也出来了,寒夜看着前方消失的身影,随后目光落在叶伏天身上,笑着道:“你有胆。” 36 |   “额……”叶伏天无言以对,这事竟然已经传入到学宫正式弟子里面了? 37 |   “莫蓝山是武道宫的骑士团的人,秦伊虽在剑阁修行,但也算是在武道宫中修行。”寒夜留下一句话便离开了,叶伏天目光一闪,顿时心如明镜,原来如此。 38 |   叶伏天回到别院之中,余生看到他走来便想开口。 39 |   “不用想了,这样便想要让你做出选择,未免太对不起你的天赋了,都不选,若是没有后续,那么,秋闱之后,他们自然会明白你是怎样的天才!”叶伏天很随意的说道,余生一愣,见叶伏天根本就没有在意这件事,显然心中早已有自己的想法,不由得点了点头。 40 |   他相信他,胜过相信自己。 41 |   ………… 42 |   距离秋闱大考还有七天时间,清晨,钟声在青州学宫响起。 43 |   一道道身影走出别院,朝着同一处方向汇聚而去。 44 |   每年的这时候,青州学宫都会召集外门弟子,宣布一些关于秋闱的事情,同时也是秋闱到来之前的检阅。 45 |   青州学宫外门演武场极大,可轻易容纳数万人,即便是学宫外门弟子陆续前来,依旧显得空旷。 46 |   外门讲师们已经提前到了,秦伊今天穿着一袭紧身劲装,英姿飒爽。 47 |   “那家伙来了。”就在此时,人群中有一阵小范围的喧哗,许多人望向同一处方向,那里有两道身影走来。 48 |   “听说昨天武道宫和术法宫有师兄亲自前去招募余生,这样的待遇,没有几人能有,那家伙有什么资格走在余生的前面?”许多人看着前方那‘传奇人物’极为不爽,余生的未来必然会是大人物,而叶伏天呢?怕是最卑微的存在。 49 |   不过叶伏天似乎一点没有觉悟,他和余生的关系,其他人怎么会懂。 50 |   “秦师姐。”叶伏天径直走向秦伊,双眸闪亮,以秦师姐的容颜,难怪莫蓝山这样的荣耀骑士会对他这么一个‘小人物’出言羞辱了。 51 |   秦伊见到叶伏天脸色一沉,道:“这些天你去哪里了?” 52 |   “自然是修行去了。”叶伏天道:“既然答应了秦师姐,当然要努力通过秋闱大考。” 53 |   秦伊见叶伏天不像说谎,脸色缓和了几分,若是真能够激励他努力修行,只要秋闱大考不是太差,或许能求求情让学宫再给他一些时间。 54 |   “有没有踏入炼体境?”秦伊开口问道。 55 |   “师姐,我已经踏入了神力境界了。”叶伏天认真的点了点头。 56 |   然而听到他的话秦伊脸色瞬间冷了下来,恶狠狠的瞪着,她开始还想为他求情,竟然相信了他的话。 57 |   “噗呲……”旁边也有人笑了起来,凌笑不知何时站在不远处,看着叶伏天道:“秦伊师姐,这样的人,何必去理会。” 58 |   “叶伏天,真的没时间了,你如果还想留在学宫,接下来的七天,就先努力踏入炼体境吧。”秦伊有些失望,想到三年前的天赋检测,感觉太可惜。 59 |   叶伏天似乎能够感受到秦伊的心情,他的脸上却露出灿烂的笑容,至少,师姐是真希望他好。 60 |   “放心吧师姐,我不会让你失望的。”叶伏天嘴角勾起一抹骄傲的弧度,清晨的阳光落在那还略显稚嫩的英俊面孔上,煞是好看。 61 |   秦伊心中微暖,却听叶伏天又道:“师姐答应我的条件,可不要忘记了呢。” 62 |   “你真是……”秦伊气得跺了跺脚,转身走开,终究也只是十七岁。 63 |   许多人都看得有些痴了,随后越发愤怒的看着叶伏天,眼神中还有几分嫉妒,大概是嫉妒叶伏天能够如此肆无忌惮的和秦伊师姐玩笑…… 64 |   “何必在这种人身上浪费时间。”一位讲师走到秦伊身边低声道。 65 |   秦伊看了他一眼,道:“其实他天赋很好,到现在我都不明白,为何会三年不破聚气境,或许,这次秋闱大考,真的会有奇迹?” 66 |   “真不明白你为何还对他心存幻想。”旁边的讲师摇了摇头,看向叶伏天的眼神显得很不爽。 67 |   此时叶伏天也有些郁闷,对着身旁的余生道:“为什么说实话总是没人信呢?” 68 |   余生无语的看了他一眼,二十多天,从聚气到神力,谁能信? 69 |   “明年春天你我都会正式入学宫,要不要帮晴雪那丫头一起?”叶伏天问道。 70 |   余生看了一眼风晴雪,随即点了点头,若是能和叶伏天一起修行,风晴雪明年春闱前是有机会踏足觉醒第七重玄妙境的。 71 |   叶伏天找到了风晴雪所在的地方,便朝着那边走了过去,许多人不由自主的让开,自然是因为余生站在他身后。 72 |   不过在靠近风晴雪的时候,却有一道身影挡在了面前,风晴雪的好友慕容清。 73 |   “有事吗?”慕容清冷淡的问道。 74 |   “我找晴雪。”叶伏天笑道。 75 |   “我知道,有什么事情,你就在这里说吧。”慕容清又道。 76 |   叶伏天抬起头,无视了慕容清,看向风晴雪道:“我有话对你说。” 77 |   “你在那里说也一样。”风晴雪目光有些闪躲,似乎不敢看叶伏天的眼睛。 78 |   “晴雪,这是什么意思?”叶伏天疑惑道。 79 |   “不懂吗,意思是晴雪不希望和你走的太近,注意点分寸。”慕容清冷冷的道。 80 |   叶伏天瞳孔微微收缩,眼神遽然间变得锋利起来,仿佛,格外的认真,然而风晴雪却一直避开没有看他。 81 |   “算了。”叶伏天眉头渐渐舒展,轻声道。 82 |   “伏天想让你以后和他一起修行。”旁边的余生忽然间开口说道,他的眼神同样锋利。 83 |   叶伏天目光一滞,看向身旁的余生,他向来不是多话的人,但此刻的余生,似乎,很生气。 84 |   风晴雪这才抬头看向这边,见到余生那锐利的目光,怯生生的喊道:“余生哥。” 85 |   许多道目光朝着这边看来,叶伏天,邀风晴雪一起修行?可笑,这家伙真是痴人说梦,然而说出这话的人是余生,一时间倒也没人敢插嘴。 86 |   “我知道晴雪很尊重你,但是让晴雪和叶伏天一起修行,你认为,叶伏天,他配吗?”慕容清看着余生道。 87 |   余生根本就没有正眼看她,直接无视了她的话,依旧看着风晴雪道:“我想知道你的想法。” 88 |   风晴雪粉拳紧握,身体都轻微的颤动着,她看着余生,随后看向叶伏天,认真的摇了摇头道:“余生哥,我们都已经成年了,还是保持一点距离。” 89 |   说话这句话,她长长的吐出口气,仿佛刚做出了一个重要的决定,变得轻松了许多,但她也知道,她会失去一些东西。 90 |   叶伏天也一直在等待着答案,见到风晴雪的决定之后,他苦笑着摇了摇头,果然是长大了呢! 91 |    -------------------------------------------------------------------------------- /CrawlerClassCode/class4/novel/第八章 万众瞩目: -------------------------------------------------------------------------------- 1 | 眼前的少女正是青州学宫传奇少女,花解语。 2 |   之所以为传奇,除容颜无双之外,还因她每年春闱秋闱文试都第一,从第一年踏入学宫便如此。 3 |   “妖精?”旁边中年疑惑的看着叶伏天,花解语美眸瞪了叶伏天一眼。 4 |   “老师,美之极,若妖。”叶伏天笑着解释道,中年和花解语关系显然不一般,自然要说好听的话。 5 |   “伶牙俐齿。”中年微笑品茶,看着叶伏天道:“传业授道皆可称师,以后你想要学什么,可以来找我,称我一声老师也不为过。” 6 |   花解语美眸凝望自己的父亲,父亲多年不曾收一弟子,今日竟然为叶伏天破例,难道对他的天赋就这么看好? 7 |   “弟子叶伏天见过老师。”叶伏天再次行礼。 8 |   中年点了点头,道:“我向来不注重这些繁文缛节,秋闱大考即将要开始了,你先行回去准备下吧。” 9 |   “今天就是秋闱?”叶伏天一愣,睡了这么久? 10 |   “咚、咚、咚。”像是为了回应他的话,青州学宫的钟声响起,回荡在天地间。 11 |   叶伏天抬头,朝着远方望去,终于,开始了吗? 12 |   “解语,你送送伏天。”中年开口说道,花解语看了叶伏天一眼,只见叶伏天脸上有几分得意。 13 |   “走吧。”花解语转身朝外走去。 14 |   “我衣服还没换。”叶伏天道,身上的长衫应该是老师的。 15 |   “自己回去换。”花解语声音冷淡,叶伏天追上去,道:“我应该称你师姐还是师妹?” 16 |   “都不行。” 17 |   “那我还是继续称妖精吧。”叶伏天不在意的耸了耸肩:“妖精,你现在什么修为境界了。” 18 |   花解语没有理会。 19 |   “听说你是天命法师,真的假的?”叶伏天又问,依旧没有回应。 20 |   “你谈过恋爱吗?”叶伏天又道:“不回答我便当你默认了。” 21 |   “没有。”花解语轻咬嘴唇,盯着叶伏天。 22 |   “我也没有,缘分啊。”叶伏天看着花解语生气的模样,却是灿烂一笑。 23 |   花解语停下脚步,叶伏天回头看着她,清晨的阳光落在少女绚丽的容颜上,那浅浅的笑容,惊艳了时光。 24 |   “你真的,很无耻。”花解语说完便转身离去。 25 |   叶伏天看着花解语的背影,嘴角勾起一抹灿烂的弧度。 26 |   ………… 27 |   今日的青州学宫比往常都要热闹,学宫大门之外,不断有人汇聚而来。 28 |   青州学宫每年秋闱,青州城都会有许多大人物前来,还有学生的家族长辈,他们都有资格入学宫观礼。 29 |   不能进去的人,也会在外门等候着,想要知道这次秋闱大考又会有哪些惊艳的人名出现。 30 |   秋闱大考虽只是一群少年儿郎参加,年龄最大者不过十八,然而,这些在秋闱大考中表现出众的少年,将来许多都会成为青州城的大人物,这点毋庸置疑,那些到来的青州城有名人物,当年,也曾和许多学员一样,在这里参加青州学宫的秋闱大考。 31 |   因而,说是举城瞩目,一点不为过。 32 |   “青州学宫传奇少女花解语三年文试第一,修行天赋绝佳,不知这次又有怎样惊艳的表现。” 33 |   “杨修三年文试第二,这次不知能否动摇花解语的地位。” 34 |   “慕容商会公子慕容秋已经觉醒第九重归一境界,早已能成为正式弟子,传闻他迟迟不入是因为想要拿下一个无可争议的秋闱第一,但这次,应该是他最后一次尝试。” 35 |   “不要忘了叶府那位管事之子余生,绝不能小觑,若非是因为叶家那位纨绔,怕是今年春闱就已经成为学宫正式弟子了,他年龄才十五岁而已。” 36 |   外面之人议论纷纷,竟对青州学宫外门弟子极为熟悉,如数家珍,青州学宫在青州城的影响力可见一斑。 37 |   叶伏天回到别院,余生见他安然归来放下心来,打量着他道:“没事吧?” 38 |   “不仅没事,而且……”叶伏天一笑,顿时周身雷光闪耀,发出噼里啪啦的声响,一条条雷光在周身游走,随心所欲。 39 |   “觉醒第六重,无双境。”余生看着叶伏天,不仅得到了雷霆之力,竟然,还破境了? 40 |   莫非,那龙韵入体,反而成全了叶伏天? 41 |   “你现在可以修行简单法术了。”余生道。 42 |   “没时间了,先参加秋闱吧。”叶伏天道。 43 |   “嗯,叶叔听说你要参加秋闱大考,这次会前来观礼。” 44 |   “父亲要来?”叶伏天目光一闪,随即笑着点头,也好,这次,给老爹一个惊喜吧。 45 |   叶伏天换了身衣服,随后两人便离开别院,朝着演武场方向走去。 46 |   此刻,演武场中,有三千条案,摆放整齐,场面壮观。 47 |   正前方,阶梯之上,出现了许多学宫正式弟子,以及青州学宫的师长。 48 |   两旁看台之上,座无虚席,青州城观礼的大人物和一些学生家长,都已经提前到了。 49 |   叶伏天的到来吸引了不少人的目光,许多人看着他露出古怪的神色。 50 |   几天前叶伏天追求风晴雪被拒,风晴雪当天就和慕容秋结伴试炼,叶伏天受到刺激上山结果被妖蟒攻击受伤之事早已经传得沸沸扬扬,如今这传奇人物可谓越发传奇了。 51 |   不过这家伙命真硬,被妖蟒攻击竟然完好无损。 52 |   “那日你被攻击之后,青州学宫宣称是被妖蟒攻击。”余生在叶伏天耳边说道,叶伏天点头表示知道了,同时,他的目光落在看台上的一处地方,脸上露出一抹笑容。 53 |   “走。”身形一闪,叶伏天朝着看台那边走去。 54 |   看台某处方向,一行人坐在一块,叶百川正和身旁不远处的一位中年闲聊着,见到叶伏天走来,不由得大声道:“听说这次你要参加秋闱大考,我亲自前来观礼,要是让老子太丢脸,以后别说你是我叶百川的儿子。” 55 |   叶伏天一脸黑线,看着那粗犷中年,道:“大庭广众下能不能给我留点面子?” 56 |   “你竟然知道要面子了?”叶百川睁大眼睛看着自己这儿子,这家伙脸皮有多厚他这当爹的可是一清二楚。 57 |   “家门不幸。”叶伏天扶着额头,郁闷的道。 58 |   “别给我装,小子,你是不是哪里得罪我儿媳妇了?”叶百川看着叶伏天问道,叶伏天一愣,目光朝着身旁不远处那位中年望去,在他身旁,风晴雪安静的坐在那,没有看这边。 59 |   “叶百川,我什么时候答应过你,少给我乱攀关系。”风如海对着叶百川道。 60 |   “风伯父。”叶伏天揉了揉眉心,感觉有些乱啊。 61 |   “伏天,最近修行怎么样,有没有长进些?”风如海问道。 62 |   “嗯,自然有些长进,不然也不会参加这次秋闱。”叶伏天轻轻点头。 63 |   “有进步便好,年轻人应该努力修行,不要像你爹那样满脑子胡思乱想。”风如海瞪了一眼叶百川道。 64 |   “知道了。”叶伏天笑着点头。 65 |   “余生,这次,期待你的表现。”风如海又看向余生道。 66 |   “嗯。”余生表现有些冷淡。 67 |   “好了,你们都下去准备吧。”风如海随意的道,几人都点了点头,叶伏天和余生转身离开,随后,风晴雪才从另一方向下去。 68 |   “这几个小家伙怎么回事,闹矛盾了?”叶百川皱了皱眉,叶伏天和风晴雪两人在一起都是要拌嘴的,这次有些反常,一句话都没有说。 69 |   周围看台许多人随意闲聊着,虽然今天只是文试,但到来的宾客依旧显得很有兴致,对于起步阶段的修行者,知识的重要性能和天赋比肩,为修行打好扎实的基础,修行知识渊博之人,往往有机会以弱胜强。 70 |   青州学宫学员陆续入场,各自挑选位置,显得颇为壮观。 71 |   叶伏天和余生也入场,选了一处位置并排落座,看着不断入场的学员,叶伏天深吸口气,这是他踏入学宫以来第一次参加秋闱大考,心头,略有波澜。 72 |   “花解语。”此时,一位少女漫步入场,刹那间吸引了无数目光。 73 |   少女穿着简单,却依旧光彩照人,无人能够盖过。 74 |   “好美。”青州学宫的学员赞道。 75 |   “十五岁容颜便如此妖孽,再过三年,祸国殃民。”看台上有人惊叹道,更可怕的是,这少女天赋极佳,一些大人物甚至知道,少女的身世,也非常惊人。 76 |   “据说慕容秋那小子失败了。”在看台之上,慕容商会的一位大人物看着那惊艳少女低声道,略显得有些失望。 77 |   “正常,以她的身份天赋,青州城同龄人怕是没人能被她看上,慕容秋这家伙去年就该正式入学宫,白耽误了不少时间。”旁边有人回应道,那位大人物点了点头。 78 |   “还真是妖孽啊。”叶伏天也看到了花解语,一入场便万众瞩目,除她之外,没有第二人能够做到了吧。 79 |   花解语在原地驻足,似乎在找位置,片刻后,她抬起脚步,朝着某处方向而行,许多已经坐好的学员见到花解语路过都略有些紧张,隐隐期盼着花解语能够坐在自己身边,然而,这也只是想想而已。 80 |   终于,花解语的脚步停下,诸人的目光也随之停下,下一刻,那吸引无数道目光的惊艳少女,缓缓的坐下。 81 |   许多人看向花解语身旁,暗骂哪个家伙如此好运,当人群看到花解语身旁之人的刹那,时间都仿佛停顿了下,无数人脸上的表情凝固,心情在风中凌乱。 82 |   PS:新书期每天两更,会非常稳定,多年人品保证,放心阅读! 83 |    -------------------------------------------------------------------------------- /CrawlerClassCode/class4/novel/第六章 有龙出没: -------------------------------------------------------------------------------- 1 | 风晴雪的回答在许多人的意料之中,叶伏天竟然痴心妄想到想要和风晴雪一起修行,这是变相的追求吗?真是没有一点自知之明。 2 |   虽然很多人都知道两人关系不错,大概是因为多年的友谊,但这并不代表能够越界,风晴雪那一句我们已经成年,大概是表明了自己的态度。 3 |   “被打脸了吧?”许多人露出幸灾乐祸的表情,像是看到了一出好戏。 4 |   而且,完全没有给自己留一点余地。 5 |   看到众人的表情叶伏天怎么会不明白他们在想什么,真实一段狗血的剧情,摇了摇头,转身离开。 6 |   “你这样大庭广众下问,真是一点选择的余地都不给她留啊。”叶伏天轻声道。 7 |   “从她默许慕容清挡在你面前,就已经表明了一些态度,你们这么多年的友情,她说要和你保持距离,这算什么,绝交吗?”余生沉着脸,像是一头暴怒的雄狮。 8 |   “年轻总是容易被人蛊惑,她毕竟才十五岁,懂什么。”叶伏天似乎一点没有被打脸的觉悟,相反,竟想要替风晴雪解释什么。 9 |   “你别忘记她的话,她的态度如此决然,又何尝给你留了一点颜面,既然已经有了决定,那么,这段友谊便到此为止了。”余生斩钉截铁的说道,他比任何人都了解叶伏天,玩世不恭的面具之下却是火热的心,尤其是对于身边的人,他想要不计较风晴雪刚才所做的一切,再给她机会。 10 |   但他不允许,他必须要替叶伏天守护一些东西,比如,他的骄傲,以及自尊,他当然明白,风晴雪刚才错过了什么。 11 |   他不会忘记父亲对叶伏天说过的话,人在落魄时容易看清一些事情,这些,都无需去在意,当有一天你光芒万丈,整个世界都将会为你让路。 12 |   ………… 13 |   就在此时,演武场传来一阵喧哗之声,将人群的注意力吸引过去,叶伏天和余生目光转而望向那里,只见演武场前方,有几道身影御空而来,他们竟然背生双翼,在虚空中拍打着,停在了演武场上空。 14 |   “是术法宫的师兄,风系法师,以风属性法术凝聚翅膀,于空中飞翔。”许多人都露出羡慕之意,觉醒之境是突破人肉体的极限,让灵气和肉体完美契合,只有当踏入荣耀境界,成为一名荣耀法师,才能随心所欲的释放各种法术。 15 |   在神州大陆,法师的地位,高于武道修行者。 16 |   在荣耀境界就御空飞行,只有风系法师才能够做到。 17 |   “天妖山已经清理出一片区域,在这片区域,不会有超越觉醒境界的妖兽出现,接下来的七天时间,是秋闱之前的秋猎时间,你们可以前去进行狩猎,以此检验自己一年来的修行成果,同时磨炼自己的实战能力和应对危险的能力。” 18 |   一位漂浮于空的风系法术开口说道:“你们迟早要走出学宫,没有经历过铁与血的试炼,终究无法真正得到成长。” 19 |   “当然,秋猎的安危依旧必须放在第一位,因而希望你们能够结伴而行,相互照应。” 20 |   诸人纷纷点头,每年秋闱前的秋猎,青州学宫会进行清场,比平时更安全,即便如此,有一些大胆之人,在平时也会进入天妖山历练自己。 21 |   “除此之外,秋闱大考到来时,青州学宫会开放,青州城有不少人会前来观礼,你们的长辈可能也会来,届时,好好表现,不要让他们失望。”那位术法宫的师兄继续道,这些诸人自然都已经知道,每年的春闱和秋闱,都是青州学宫最重要的大事,同样,对于青州城而言也是大事。 22 |   相比于春闱,秋闱更盛大一些,春闱更主要的目的是挑选正式弟子,只有少数人才是焦点。 23 |   “好了,都去准备吧。”那人挥了挥手,随后一行人背后羽翼煽动,离开了这边,似乎正是朝着后山而去。 24 |   演武场瞬间热闹了起来,许多人聚在一起,商量着秋猎一事。 25 |   这次秋猎的试炼机会,不能错过。 26 |   “叶伏天,你有什么想法?”秦伊隔空对着叶伏天问道。 27 |   “秦师姐是指?”叶伏天看向秦伊。 28 |   “秋猎是一次机会,你和余生一起,应该很安全,可以借此机会磨练下,看是否能够破境。”秦伊道。 29 |   “不了。”叶伏天摇了摇头:“这次秋猎我不打算参加了。” 30 |   毕竟不久前才从后山下来,没必要再去。 31 |   秦伊美眸瞪着他道:“你年龄还小,不要因为一些打击就影响自己的心境,变得颓废。” 32 |   想到之前叶伏天被风晴雪拒绝时的落寞背影,秦伊担心他会受太大打击。 33 |   叶伏天眼睛眨了下,知道秦伊误会了,眼眸扫了一眼秦伊傲人的身材,低声道:“师姐,其实,我不小了。” 34 |   秦伊一愣,看着叶伏天的眼神,随即怒而转身,道:“你没救了。” 35 |   叶伏天见到秦伊生气的模样,脸上的笑容越发的灿烂,笑着喊道:“秦师姐,谢谢。” 36 |   秦伊脚步停顿了下,随后继续往前迈步。 37 |   “很不错,可以考虑。”余生低声道,叶伏天疑惑的看着他:“考虑什么?” 38 |   “不是你的候选人吗?”余生很认真的看着叶伏天。 39 |   “额……”叶伏天揉了揉脑袋,近朱者赤,近墨者黑啊。 40 |   ………… 41 |   青州学宫热闹了起来,浩浩荡荡的队伍朝着后山出发,许多人都意气风发,这样的场景每年都会出现,几天后,这些朝气蓬勃的身影,有不少会变得颓废,也有许多内心会蒙上阴影,当然,也免不了受伤。 42 |   围猎时期,青州学宫会进行清场,但依旧有七级、八级甚至九级的强大妖兽,这些妖兽,会成为部分人的噩梦。 43 |   围猎,是一次试炼,也是一场洗礼。 44 |   天妖山脚下,不断有人结伴前来,一起踏入天妖山,此时,便有一行身影来到了山脚下。 45 |   “风晴雪。”许多人注意到了那一行人中的少女,穿着一袭火红色衣衫的她英姿飒爽,容颜也在衣服的映衬下显得娇艳动人,更添了几分魅力。 46 |   “她身边的那人是谁?”有人注意到风晴雪身旁,除了她的朋友慕容清之外,竟还有一名男子,气质非凡。 47 |   “那是慕容秋,慕容清的堂兄,慕容商会嫡系子孙,修为觉醒第九重归一,他竟然和风晴雪一起进行秋猎试炼,难怪了……” 48 |   许多人想起某个被惨烈拒绝的可怜家伙,不由得摇了摇头,真是没有自知之明啊。 49 |   成年,保持距离?那慕容秋又算什么? 50 |   若是被那家伙知道,不知道会是怎样都心情。 51 |   “那家伙受到打击,怕是这次秋闱大考又要弃考了。”人群见到慕容秋和风晴雪一道踏上后山,低声议论着。 52 |   这件事叶伏天不久后便从他人的口中听到了,有些郁闷莫名其妙的成为了这狗血故事的悲剧男主角,虽然他从没有过要追求风晴雪的想法,但心中依旧有着一点点的不爽,无关爱情,只是纯粹的不爽。 53 |   当然,他也不会太在意,接下来的时间,主要还是用在修行上,争取在秋闱到来时实力再进一步。 54 |   数日后,别院中,叶伏天安静的修行,炽热无比的太阳之火环绕身躯,洗炼着叶伏天的经脉骨骼,他如今拥有太阳命魂,自然修行火属性为主。 55 |   之前在后山试炼,观草木能感知到浓郁的木属性灵气,观瀑布流水能感知到水属性灵气,但都无法和观太阳那样,造就太阳命魂。 56 |   难道,是他太贪心了?毕竟那种境遇可遇不可求。 57 |   脚步声传来,叶伏天停止修行,抬头看向余生,问道:“怎么了?” 58 |   若不是有什么事情,余生不会来打搅他修行。 59 |   “这两天有不少人从后山下来,学宫中有一则传闻闹得沸沸扬扬。”余生道。 60 |   “什么传闻?”叶伏天有些好奇。 61 |   “青州学宫清场封禁之地,有人称,看到了龙。”余生目光灼灼。 62 |   “龙。”叶伏天眼眸闪过一道璀璨光芒,封禁之地是为围猎而准备的,竟然有人看到了龙? 63 |   莫说是封禁之地,即便是整个天妖山出现了龙,也绝对是轰动性的消息,如果是真的,恐怕会让青州城地震。 64 |   龙,气运的象征,妖中之圣,堪比人中帝皇圣贤。 65 |   “你认为是真是假?”叶伏天对着余生道。 66 |   “有几人称亲眼所见,如今,青州学宫甚至准备逆清场,让学宫弟子回来,如果学宫真这么做,那么极有可能为真。”余生道。 67 |   “出去走走。”叶伏天站起身来朝着别院外走去,这数天来,已经有不少学员回来了,也有人和叶伏天一样没有去,大概是知道境界低微太过危险,随意一头妖兽都无法对付。 68 |   两人来到后山之时,发现有许多人从山上下来,成群结队,显然有些不正常。 69 |   叶伏天和余生对视了一眼,有人看向下山的人问道:“发生什么事了?” 70 |   “有利害妖兽闯入封禁之地,师长们让我们下山,不要再去。”有人回应道。 71 |   “什么利害妖兽,师长不能直接斩杀吗?”有人吃惊道。 72 |   “据说是一条雷蟒,修行多年,妖气可怕,暂时没有拿下。” 73 |   诸人议论纷纷,叶伏天和余生对视了一眼,隐隐觉得有些不对劲,是蛇,还是龙? 74 |   ps:有推荐票的兄弟们投下啊! -------------------------------------------------------------------------------- /CrawlerClassCode/class4/novel/第四章 太阳命魂: -------------------------------------------------------------------------------- 1 | 叶伏天看着自己一拳之威,略有些出神,随后像是想起了什么般,他眼睛闭上,意识进入命宫。 2 |   意识虚影出现在世界古树之下,目光满是震撼。 3 |   此刻,翠绿古树隐隐有着一层火焰光泽,像是充满火属性灵气,而真正令叶伏天震惊的是,苍穹之上,竟出现一轮烈日,散发着火焰光辉,虽远没有真正的太阳那般耀眼,但依旧震撼人心。 4 |   大自在观想法,观山得山、观水得水,他观想烈日修行,如今,命宫出现太阳。 5 |   “夺天地万物之造化,这功法好强。”叶伏天心中感叹,他开始观想命宫中的太阳,顿时,他感觉自身化作烈日,天地间火焰灵气凶猛涌入身体,继而流入命宫之中,进入世界古树。 6 |   命宫古树化作火焰色泽,悬挂于古树上的太阳更为璀璨。 7 |   “好热。”叶伏天感觉自己处于太阳火炉之中,体内经脉骨骼不断承受着太阳之火的淬炼。 8 |   “命宫有魂,是为命魂。”叶伏天喃喃低语,想到一种可能,他意念一动,刹那间,他的脑后竟出现太阳光环,将周围照亮,他那英俊的面孔竟有几分神圣的光泽。 9 |   “命魂是太阳?”身旁余生问道。 10 |   叶伏天豁然间睁开目光,太阳光环消失不见,他看着余生的神色有些怪异,低声道:“我好像,能造命魂……” 11 |   他发现,命宫中的太阳,分明就是一种命魂,不仅能够借之修行,还能够显化出来。 12 |   余生眼睛瞪得很大,盯着叶伏天,认真的道:“能帮我也造一个吗?” 13 |   叶伏天一脸黑线,这家伙,思维跳跃也太快了吧,难道不该是疑惑、震惊吗?竟然,叫他帮造一个…… 14 |   “脑洞很大。”叶伏天认真的点了点头,随后转身离开这边。 15 |   余生挠了挠头,看着叶伏天道:“去哪?” 16 |   “修行,观飞禽走兽。”叶伏天朗声说道,意气风发,他观想太阳,引太阳之火,连续破境,然而接下来从铁骨到神力之境,就需要靠身体的协调和力量的运用了,只有能够随心所欲的发力,精气神合一,随意一拳一脚都能爆发出惊人的力量,方算是神力之境。 17 |   天妖山妖兽遍地,哪怕只是最外围都是如此。 18 |   进入天妖山没多久,叶伏天和余生就看到前方有一头四级妖兽妖风豹。 19 |   “余生,你拦住它,不要让它甩开我。”叶伏天喊了一声,身体便直奔而出,在他话音落下的刹那,余生健步如飞,大地都为之一颤,那妖风豹像是感受到了威胁,转身疾驰而行,犹如一道闪电般。 20 |   “意随心生、行随意动,大道自然,不受行动所限,不受天地所拘。”叶伏天口中吐出大自在观想法的法诀,他飞奔的同时脑海中观想出那妖风豹狂奔的虚影,仿佛妖风豹的每一个动作,都在他脑海中重复放慢,无比清晰。 21 |   随后,他的身体开始模拟妖风豹的动作,奔跑在半空中的同时右腿微微弯曲,在落点的刹那全部的力量仿佛都聚于右腿上,猛的弹出,犹如破空的闪电,但刚开始时他的动作显得有些不那么流畅自然,很快就被妖风豹甩开,好在余生早已经奔向前方将妖风豹拦截住阻挡妖风豹逃跑的步伐。 22 |   “不仅是发力,还借助了风。”叶伏天能够感知到妖风豹身体周围的风属性力量,他的身体周围,像是也有风相随,沙沙的声响不断,他的动作越来越流畅,半个时辰后,竟然真的如同妖风豹般奔跑随风。 23 |   “余生,可以了。”叶伏天脚步停下,余生这才放过了那头妖风豹。 24 |   “你这模仿能力太强了。”余生开口说道,他一直注意叶伏天的身形,半个时辰,竟然如同妖风豹般奔跑。 25 |   “我能感知到风之灵力,只要掌握好发力技巧就能模仿妖风豹的速度,但这还不够,这几天要辛苦你了。”叶伏天笑着道,余生没有说什么,回到他身后默默的跟着。 26 |   接下来的一些天,叶伏天一直在天妖山中修行,观悟妖猴身法、狮虎力量,甚至追逐飞禽,每天都在进步,在踏入天妖山的第十天,他也踏入了觉醒第五重神力之境。 27 |   这一天,叶伏天和余生走在密林深处,地面在轻微的颤动着,周围的树木都微微摇晃,时而有狂暴的吼声传来。 28 |   两人对视一眼,朝着声音的来源走去,震动感变得越来越强,终于,他们看到了一头狂暴无比的巨兽,体型庞大,高五米。 29 |   “九级妖兽暴力猿。”余生目露锋芒,这妖兽能威胁到他了,更让他们吃惊的是,在这头狂暴的妖猿前面,竟然站着一位身材婀娜的少女。 30 |   少女一身白衣如雪,长发随风而舞,衣袂飘动,那容颜完美到无法挑剔,虽还略显年轻,但已有红颜祸水之姿。 31 |   “是她,花解语。”叶伏天看着那张容颜心中惊叹其美,这位青州学宫的传奇少女,他焉能不认识。 32 |   “要去帮忙吗?”余生道。 33 |   “等等,暴力猿受伤了。”叶伏天开口道,妖猿身上有很多伤口,然而那少女却安然无恙。 34 |   “吼。”一声暴吼声传出,暴力猿朝着花解语踏步,那庞大无比的身躯仿佛能够轻易将少女捏死,只见花解语身轻如燕,直接飞落在一棵树上。 35 |   暴力猿竟直接将大树撞倒,随后连根拔起,朝着空中的花解语扫荡而去,力量之强简直恐怖。 36 |   少女在空中闪烁,一片片树叶随风而舞,犹如旋涡般朝着暴力猿卷去,每一片树叶竟带着呼啸的破空之音,非常锋利。 37 |   暴力猿抡起大树疯狂横扫,树叶狂乱而飞,而那大树也不断出现裂痕,仿佛随时可能断裂成无数节。 38 |   地面飞沙走砾,无数碎石飞起,花解语的身形飘落在另一棵树上,只见她闭上眼睛,顿时那飞舞的碎石竟也急速朝着暴力猿击去,每一块碎石都像是锋利的暗器,虽无法完全破开暴力猿的防御,但依旧不断在他坚硬的肌肤上留下血痕。 39 |   更可怕的是,虚空中有碎石在灵气的裹挟下化作了一根根锋利至极的长矛,指向正发狂的暴力猿。 40 |   “法术。”叶伏天心中震惊,下一刻,他看到那锋利的长矛划破虚空,刺入了暴力猿的眼睛之中,痛苦的巨吼声传出,暴力猿转身朝着远处逃去,一棵棵大树直接被撞倒。 41 |   少女并没有去追,白衣身影飘然落地,犹如仙女般。 42 |   “看够了吗?”花解语淡淡的说道,叶伏天和余生走了出来,有些惊叹的看着眼前这位同龄少女。 43 |   “厉害,你是多属性法师?”叶伏天问道。 44 |   “我认识你。”花解语没有回答,而是看着叶伏天。 45 |   “我这么有名吗?”叶伏天笑道,能被青州学宫的传奇美女认识,大概也是一种荣幸吧。 46 |   “三年前,青州学宫入门测试,我们第一次见面时你说的话,我听到了。” 47 |   “咳咳……”叶伏天露出一抹尴尬之色,不过瞬间又恢复如常,道:“我说过什么了吗?” 48 |   花解语看着叶伏天,随即嫣然一笑,让叶伏天看得有些痴了。 49 |   “像妖精吗?”花解语浅笑说道,随后便缓缓转身,朝着密林中走去。 50 |   “像。”叶伏天愣了瞬间,随后看着那背影很认真的点头。 51 |   “被你说中了。”余生看着花解语消失的身影。 52 |   叶伏天回想起三年前的那一幕,他见到十二岁的花解语时对着余生道:“这萝莉十二岁就长得这么妖孽,再过几年肯定是个妖精。” 53 |   “听说她已经觉醒第九重境界了,武法兼修,但刚才的攻击法术离体,觉醒九重境都很难做到,还有传闻称她可能是天命修行者,早已被学宫大人物看中,将会收为弟子,追求者如云,却没有人能够直视其容颜及天赋。”余生轻声道。 54 |   “心动了?”叶伏天看着余生道。 55 |   余生看着叶伏天摇了摇头,随后认真的道:“我觉得,可以做你媳妇。” 56 |   “额……”叶伏天抬起手对着余生的脑袋拍了下:“满脑子想什么呢?” 57 |   说着,他也转身,脚步朝前而行,嘴角勾勒起一抹灿烂笑容,道:“不过,说的挺有道理,候选吧。” 58 |   身后的余生听到这句话脚步一个踉跄,瞪了前面的家伙一眼,还候选?无耻啊。 -------------------------------------------------------------------------------- /CrawlerClassCode/class4/requests异步.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import aiohttp 3 | import aiofiles,time 4 | import requests 5 | 6 | urls = [ 7 | "http://kr.shanghai-jiuxin.com/file/2021/1105/419e535e83c7192a99f7ee76d15f4043.jpg", 8 | "http://kr.shanghai-jiuxin.com/file/2021/1105/8b5586ee3febf914369de58aee65a370.jpg", 9 | "http://kr.shanghai-jiuxin.com/file/2021/0222/da6aec6d7e061dd6ea5da7cbe90e4abc.jpg" 10 | ] 11 | 12 | async def aiodownload(url): 13 | 14 | img_name = url.split('/')[-1] 15 | #requests 16 | 17 | async with aiohttp.ClientSession() as session: 18 | 19 | async with session.get(url) as r: 20 | # r.content.read() #r.text() r.json() 21 | 22 | #文件的异步操作aiofiles 23 | img = await r.content.read() 24 | 25 | async with aiofiles.open(".\\img\\"+str(img_name),mode='wb') as f: 26 | await f.write(img) 27 | # f.write(await r.content.read()) #读取内容是异步的 28 | 29 | def normaldownload(url): 30 | 31 | img_name = url.split('/')[-1] 32 | r = requests.get(url) 33 | 34 | with open(img_name,'wb') as f: 35 | f.write(r.content) 36 | 37 | async def main(): 38 | tasks = [] 39 | for url in urls: 40 | tasks.append(asyncio.create_task(aiodownload(url))) 41 | #print(aiodownload(url)) 42 | 43 | await asyncio.wait(tasks) 44 | 45 | if __name__ == "__main__": 46 | start = time.time() 47 | asyncio.run(main()) 48 | # for url in urls: 49 | # normaldownload(url) 50 | end = time.time() 51 | print("cost time %f" %(end - start)) -------------------------------------------------------------------------------- /CrawlerClassCode/class4/thread_pool.py: -------------------------------------------------------------------------------- 1 | from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor 2 | 3 | def fn(name): 4 | for i in range(1000): 5 | print(name,i) 6 | 7 | if __name__ == '__main__': 8 | 9 | with ThreadPoolExecutor(1000000) as t: 10 | for i in range(10): 11 | t.submit(fn,name=f"线程{i}") 12 | print("end") -------------------------------------------------------------------------------- /CrawlerClassCode/class4/ts/0.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggfgh/Crawler/f6cecb6c8e906c7c33455ed07d412982e7136301/CrawlerClassCode/class4/ts/0.ts -------------------------------------------------------------------------------- /CrawlerClassCode/class4/ts/1.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggfgh/Crawler/f6cecb6c8e906c7c33455ed07d412982e7136301/CrawlerClassCode/class4/ts/1.ts -------------------------------------------------------------------------------- /CrawlerClassCode/class4/ts/2.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggfgh/Crawler/f6cecb6c8e906c7c33455ed07d412982e7136301/CrawlerClassCode/class4/ts/2.ts -------------------------------------------------------------------------------- /CrawlerClassCode/class4/ts/3.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggfgh/Crawler/f6cecb6c8e906c7c33455ed07d412982e7136301/CrawlerClassCode/class4/ts/3.ts -------------------------------------------------------------------------------- /CrawlerClassCode/class5/__pycache__/chaojiying.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggfgh/Crawler/f6cecb6c8e906c7c33455ed07d412982e7136301/CrawlerClassCode/class5/__pycache__/chaojiying.cpython-37.pyc -------------------------------------------------------------------------------- /CrawlerClassCode/class5/_无头浏览器.py: -------------------------------------------------------------------------------- 1 | from selenium.webdriver import Chrome 2 | from selenium.webdriver.support.select import Select 3 | from selenium.webdriver.chrome.options import Options 4 | import time 5 | 6 | chrome_option = Options() 7 | chrome_option.add_argument('--headless') 8 | chrome_option.add_argument('--disable-gpu') 9 | web = Chrome(options=chrome_option) 10 | 11 | web.get('https://graph.qq.com/oauth/show?which=Login&display=pc&response_type=code&client_id=101375548&redirect_uri=http%3A%2F%2Fi.fkw.com%2FbindQQAccountNew.jsp%3FmodeType%3Dpc&state=82&scope=get_user_info,get_info') 12 | time.sleep(2) 13 | 14 | # # 定位到下拉列表 15 | # sel_el = web.find_element_by_xpath('//*[@id="OptionDate"]') 16 | # # 对元素进行包装,包装成下拉菜单 17 | # sel = Select(sel_el) 18 | # # 让浏览器调整选项 19 | # for i in range(len(sel.options)): # i就是每一个下拉框的索引位置 20 | # sel.select_by_index(i) # 按照索引进行切换 21 | # time.sleep(2) 22 | # table = web.find_element_by_xpath('//*[@id="TableList"]') 23 | # print(table.text) 24 | # print("=================================") 25 | # print('over') 26 | 27 | # web.close() 28 | 29 | # 获取浏览器处理后的代码 30 | 31 | print(web.page_source) -------------------------------------------------------------------------------- /CrawlerClassCode/class5/a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggfgh/Crawler/f6cecb6c8e906c7c33455ed07d412982e7136301/CrawlerClassCode/class5/a.jpg -------------------------------------------------------------------------------- /CrawlerClassCode/class5/chaojiying.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding:utf-8 3 | 4 | import requests 5 | from hashlib import md5 6 | 7 | class Chaojiying_Client(object): 8 | 9 | def __init__(self, username, password, soft_id): 10 | self.username = username 11 | password = password.encode('utf8') 12 | self.password = md5(password).hexdigest() 13 | self.soft_id = soft_id 14 | self.base_params = { 15 | 'user': self.username, 16 | 'pass2': self.password, 17 | 'softid': self.soft_id, 18 | } 19 | self.headers = { 20 | 'Connection': 'Keep-Alive', 21 | 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', 22 | } 23 | 24 | def PostPic(self, im, codetype): 25 | """ 26 | im: 图片字节 27 | codetype: 题目类型 参考 http://www.chaojiying.com/price.html 28 | """ 29 | params = { 30 | 'codetype': codetype, 31 | } 32 | params.update(self.base_params) 33 | files = {'userfile': ('ccc.jpg', im)} 34 | r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers) 35 | return r.json() 36 | 37 | def ReportError(self, im_id): 38 | """ 39 | im_id:报错题目的图片ID 40 | """ 41 | params = { 42 | 'id': im_id, 43 | } 44 | params.update(self.base_params) 45 | r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers) 46 | return r.json() 47 | 48 | 49 | if __name__ == '__main__': 50 | chaojiying = Chaojiying_Client('comedy', '123.com', '924865') #用户中心>>软件ID 生成一个替换 96001 51 | im = open('C:\\Users\\Oringals\\Desktop\\python\\crawler\\class 5\\a.jpg', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要// 52 | print (chaojiying.PostPic(im, 1902)) #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加() 53 | 54 | -------------------------------------------------------------------------------- /CrawlerClassCode/class5/chaojiying_Python/__pycache__/chaojiying.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggfgh/Crawler/f6cecb6c8e906c7c33455ed07d412982e7136301/CrawlerClassCode/class5/chaojiying_Python/__pycache__/chaojiying.cpython-37.pyc -------------------------------------------------------------------------------- /CrawlerClassCode/class5/chrome.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.chrome.options import Options 3 | 4 | #创建一个浏览器对象 5 | chrome_options = Options() 6 | chrome_options.add_argument("--headless") 7 | chrome_options.add_argument("--gpu") 8 | 9 | browser = webdriver.Chrome(options=chrome_options) 10 | browser.get('http://www.baidu.com') 11 | 12 | print(browser.title) 13 | -------------------------------------------------------------------------------- /CrawlerClassCode/class5/login_auto_无头浏览器基础操作.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.common.keys import Keys 3 | from selenium.webdriver.chrome.options import Options 4 | import time 5 | 6 | start = time.time() 7 | 8 | chrome_options = Options() 9 | chrome_options.add_argument('--disable-gpu') 10 | #chrome_options.add_argument('--headless') 11 | 12 | web = webdriver.Chrome(options=chrome_options) 13 | web.get('https://lagou.com') 14 | 15 | #找到元素 16 | el = web.find_element_by_xpath('//*[@id="changeCityBox"]/p[1]/a') 17 | el.click() #点击事件 18 | 19 | #避免错误 20 | time.sleep(1) 21 | 22 | #找到输入框 23 | web.find_element_by_xpath('//*[@id="search_input"]').send_keys("渗透测试",Keys.ENTER) 24 | time.sleep(1) 25 | 26 | # 查找存放的数据 27 | li_list = web.find_elements_by_xpath('//*[@id="s_position_list"]/ul/li') 28 | 29 | for li in li_list: 30 | job_name = li.find_element_by_tag_name("h3").text 31 | job_money = li.find_element_by_xpath('./div[1]/div[1]/div[2]/div/span').text 32 | place = li.find_element_by_xpath('./div/div[2]/div/a').text 33 | with open(".\\lagou.txt",'a') as f: 34 | print(job_name,job_money,place) 35 | f.write(f"{job_name},{job_money},{place}\n") 36 | 37 | end = time.time() 38 | print('cost time %s s' %(end - start)) -------------------------------------------------------------------------------- /CrawlerClassCode/class5/窗口之间的切换.py: -------------------------------------------------------------------------------- 1 | from selenium.webdriver.chrome.options import Options 2 | from selenium.webdriver import Chrome 3 | import time 4 | from selenium.webdriver.common.keys import Keys 5 | 6 | #无头设置 7 | chrome_options = Options() 8 | chrome_options.add_argument("--headless") 9 | #chrome_options.add_argument("--proxy-server=http://113.238.142.208:3128") 10 | chrome_options.add_argument("--disable-gpu") 11 | 12 | web = Chrome(options=chrome_options) 13 | web.get('https://www.vulbox.com/') 14 | 15 | web.find_element_by_xpath('/html/body/div[1]/header/div/div[2]/a').click() 16 | time.sleep(1) 17 | web.find_element_by_xpath('/html/body/div/div/div/div/header/div/ul/li[1]/div/span/a').click() 18 | time.sleep(1) 19 | 20 | # web.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[1]/div[1]/div[1]/div[1]/a/h3').click() 21 | 22 | # 如何进入到新窗口 23 | # selenium默认不切换窗口 24 | web.switch_to.window(web.window_handles[-1]) 25 | 26 | #在新窗口中提取内容 27 | job_detail = web.find_element_by_xpath('/html/body/div/div/div/div/div[2]/div[1]/div[2]/div/div[3]/div[1]/div[2]/div[1]/div/ul/li[1]/div/div/a/div[2]/div/h4/span').text 28 | print(job_detail) 29 | 30 | #关掉子窗口 31 | web.close() 32 | 33 | #变更selenium的窗口 34 | web.switch_to.window(web.window_handles[0]) 35 | print(web.find_element_by_xpath('/html/body/div/div/div/div/div[1]/div[1]/section[1]/div[4]/div[3]/div/div/div/div/div/div/table/tbody/tr[1]/td[3]/div/div/span[2]').text) 36 | web.close() 37 | 38 | # 获取iframe中的内容 39 | # 拿到iframe,切换到iframe,获取数据 40 | # iframe = web.find_element_by_xpath('iframe xpath') 41 | # web.switch_to.frame(iframe) 42 | # web.swith_to.default_content() #切换回原页面(测试) 43 | # result = web.find_element_by_xpath('xpath').text 44 | # print(result) -------------------------------------------------------------------------------- /CrawlerClassCode/class5/超级鹰处理验证码.py: -------------------------------------------------------------------------------- 1 | from selenium.webdriver import Chrome 2 | from selenium.webdriver.common.keys import Keys 3 | from time import sleep 4 | from selenium.webdriver.chrome.options import Options 5 | import chaojiying 6 | 7 | opt = Options() 8 | opt.add_argument('--headless') 9 | opt.add_argument('--disable-gpu') 10 | web = Chrome(options=opt) 11 | 12 | web.get('https://uim.infinitus.com.cn/login?service=https://edealer.infinitus.com.cn/login/cas&appId=edealer-front&nextstep=https://gbss.infinitus.com.cn/front/gbss-portal-web/dealer/nextstep/1&forward=https://edealer.infinitus.com.cn/front?isFromWWW=1') 13 | # web.find_element_by_xpath('//*[@id="login-btn"]').click() 14 | 15 | #输入账号 16 | web.find_element_by_xpath('//*[@id="userName"]').send_keys('15113205893') 17 | sleep(2) 18 | 19 | #输入密码 20 | web.find_element_by_xpath('//*[@id="password"]').send_keys('123123') 21 | sleep(2) 22 | 23 | # 点击协议 24 | web.find_element_by_xpath('//*[@id="agreeToAgreement"]').click() 25 | 26 | # 识别验证码 27 | img = web.find_element_by_xpath('//*[@id="loginCode"]').screenshot_as_png 28 | chaojiying = chaojiying.Chaojiying_Client('comedy', '123.com', '924865') 29 | dic = chaojiying.PostPic(img,1902) 30 | verify_code = dic['pic_str'] 31 | print(verify_code) 32 | sleep(2) 33 | 34 | # 输入验证码 35 | web.find_element_by_xpath('//*[@id="captchaResponse"]').send_keys(verify_code) 36 | sleep(2) 37 | 38 | #点击登录 39 | web.find_element_by_xpath('//*[@id="loginBtn"]').click() 40 | sleep(10) 41 | 42 | #//*[@id="groupbox_pad_"]/div[2]/div[1]/div 43 | #//*[@id="EDEALER_MY_CUSTOMER_WALLET"] 44 | web.find_element_by_xpath('//*[@id="EDEALER_MY_CUSTOMER_WALLET"]').click() 45 | text = web.find_element_by_xpath('//*[@id="groupbox_pad_"]/div[2]/div[1]/div').text 46 | print(text) 47 | sleep(2) 48 | 49 | web.close() -------------------------------------------------------------------------------- /CrawlerClassCode/proxy/Queue/Queue.py: -------------------------------------------------------------------------------- 1 | import threading 2 | import time 3 | from queue import Queue 4 | 5 | -------------------------------------------------------------------------------- /CrawlerClassCode/proxy/UA.py: -------------------------------------------------------------------------------- 1 | from fake_useragent import UserAgent 2 | 3 | ua = UserAgent(path='C:\\Users\\Oringals\\Desktop\\python\\crawler\\proxy\\user-agent.json') 4 | # ie浏览器的user agent 5 | print(ua.ie) 6 | 7 | # opera浏览器 8 | print(ua.opera) 9 | 10 | # chrome浏览器 11 | print(ua.chrome) 12 | 13 | #随机生成UA 14 | print(ua.random) 15 | -------------------------------------------------------------------------------- /CrawlerClassCode/proxy/UA.py~: -------------------------------------------------------------------------------- 1 | from fake_useragent import UserAgent 2 | 3 | ua = UserAgent(path='C:\\Users\\Oringals\\Desktop\\python\\crawler\\proxy\\user-agent.json') 4 | # ie浏览器的user agent 5 | print(ua.ie) 6 | 7 | # opera浏览器 8 | print(ua.opera) 9 | 10 | # chrome浏览器 11 | print(ua.chrome) 12 | 13 | #随机生成UA 14 | print(ua.random) -------------------------------------------------------------------------------- /CrawlerClassCode/proxy/proxy_crawler.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | def get_real_ip(): 4 | url = 'http://httpbin.org/ip' 5 | proxy = {'http':'222.74.202.229:8080'} 6 | r = requests.get(url,proxies=proxy) 7 | print(r.text) 8 | 9 | if __name__ == '__main__': 10 | get_real_ip() 11 | 12 | -------------------------------------------------------------------------------- /CrawlerClassCode/proxy/proxy_list.txt: -------------------------------------------------------------------------------- 1 | 183.247.211.151:30001 2 | 58.47.159.147:8001 3 | 117.161.75.82:3128 4 | 45.128.220.194:59394 5 | 124.204.33.162:8000 6 | 185.110.208.37:8080 7 | 223.96.90.216:8085 8 | 111.2.196.130:9091 9 | 81.71.122.208:3000 10 | 120.220.220.95:8085 11 | 43.255.39.81:59394 12 | 58.20.235.180:9091 13 | 112.6.117.135:8085 14 | 111.43.79.98:8085 15 | 124.70.46.14:3128 16 | 159.75.25.176:81 17 | 183.213.28.64:3128 18 | 45.128.220.20:59394 19 | 103.148.210.246:8080 20 | 58.209.234.8:3389 21 | 47.103.30.183:8080 22 | 113.238.142.208:3128 23 | 118.190.244.234:3128 24 | 1.119.196.202:1080 25 | 206.253.164.110:80 26 | 117.157.197.18:3128 27 | 112.6.117.178:8085 28 | 103.149.162.194:80 29 | 120.26.123.95:8010 30 | 121.206.45.91:4216 31 | 8.218.161.168:1080 32 | 124.204.33.162:8000 33 | 58.47.159.147:8001 34 | 183.21.81.88:40539 35 | 111.43.79.98:8085 36 | 112.124.52.17:8080 37 | 123.128.12.87:30001 38 | 118.190.244.234:3128 39 | 120.220.220.95:8085 40 | 58.20.235.180:9091 41 | 183.213.28.64:3128 42 | 183.247.211.151:30001 43 | 120.52.73.44:18080 44 | 114.55.53.151:3128 45 | 125.73.131.137:9091 46 | 112.6.117.135:8085 47 | 47.93.249.75:8100 48 | 47.89.36.17:10286 49 | 183.247.215.218:30001 50 | 36.134.91.82:8888 51 | 124.70.46.14:3128 52 | 58.251.94.56:6666 53 | 221.4.245.242:9091 54 | 47.103.30.183:8080 55 | 124.204.33.162:8000 56 | 58.47.159.147:8001 57 | 183.21.81.88:40539 58 | 111.43.79.98:8085 59 | 112.124.52.17:8080 60 | 123.128.12.87:30001 61 | 118.190.244.234:3128 62 | 120.220.220.95:8085 63 | 58.20.235.180:9091 64 | 183.213.28.64:3128 65 | 183.247.211.151:30001 66 | 120.52.73.44:18080 67 | 114.55.53.151:3128 68 | 125.73.131.137:9091 69 | 112.6.117.135:8085 70 | 47.93.249.75:8100 71 | 47.89.36.17:10286 72 | 183.247.215.218:30001 73 | 36.134.91.82:8888 74 | 124.70.46.14:3128 75 | 58.251.94.56:6666 76 | 221.4.245.242:9091 77 | 47.103.30.183:8080 78 | 124.204.33.162:8000 79 | 58.47.159.147:8001 80 | 183.21.81.88:40539 81 | 111.43.79.98:8085 82 | 112.124.52.17:8080 83 | 123.128.12.87:30001 84 | 118.190.244.234:3128 85 | 120.220.220.95:8085 86 | 58.20.235.180:9091 87 | 183.213.28.64:3128 88 | 183.247.211.151:30001 89 | 120.52.73.44:18080 90 | 114.55.53.151:3128 91 | 125.73.131.137:9091 92 | 112.6.117.135:8085 93 | 47.93.249.75:8100 94 | 47.89.36.17:10286 95 | 183.247.215.218:30001 96 | 36.134.91.82:8888 97 | 124.70.46.14:3128 98 | 58.251.94.56:6666 99 | 221.4.245.242:9091 100 | 47.103.30.183:8080 101 | -------------------------------------------------------------------------------- /CrawlerClassCode/proxy/proxy_pool_crawler.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import json 3 | import pprint 4 | 5 | url = 'http://10.10.10.136:5010/all' 6 | 7 | def getallProxy()->list: 8 | r = requests.get(url) 9 | #pprint.pprint(r.json()) 10 | return r.json() 11 | 12 | if __name__ == '__main__': 13 | proxy_list = getallProxy() 14 | #print(proxy_list) 15 | for proxy in proxy_list: 16 | print(proxy['proxy']) 17 | with open('proxy_list.txt','a') as f: 18 | f.write(proxy['proxy']+'\n') 19 | 20 | -------------------------------------------------------------------------------- /CrawlerClassCode/proxy/proxy_pool_crawler.py~: -------------------------------------------------------------------------------- 1 | import requests 2 | import json 3 | import pprint 4 | 5 | url = 'http://10.10.10.136:5010/all' 6 | 7 | def getallProxy()->list: 8 | r = requests.get(url) 9 | #pprint.pprint(r.json()) 10 | return r.json() 11 | 12 | if __name__ == '__main__': 13 | proxy_list = getallProxy() 14 | #print(proxy_list) 15 | for proxy in proxy_list: 16 | print(proxy['proxy']) 17 | with open('proxy_list.txt','a') as f: 18 | f.write(proxy['proxy']+'\n') 19 | -------------------------------------------------------------------------------- /CrawlerClassCode/proxy/user-agent.json: -------------------------------------------------------------------------------- 1 | {"browsers": {"chrome": ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/44.0.2403.155 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36", "Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36", "Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2117.157 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/4E423F", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36 Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.517 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1623.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36", "Mozilla/5.0 (X11; CrOS i686 4319.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1467.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1500.55 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36", "Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36", "Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17"], "internetexplorer": ["Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko", "Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko", "Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 7.0; InfoPath.3; .NET CLR 3.1.40767; Trident/6.0; en-IN)", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/4.0; InfoPath.2; SV1; .NET CLR 2.0.50727; WOW64)", "Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)", "Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 5.2; Trident/6.0)", "Mozilla/4.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)", "Mozilla/1.22 (compatible; MSIE 10.0; Windows 3.1)", "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))", "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; chromeframe/12.0.742.112)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; Tablet PC 2.0; InfoPath.3; .NET4.0C; .NET4.0E)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; yie8)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET CLR 1.1.4322; .NET4.0C; Tablet PC 2.0)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; FunWebProducts)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/13.0.782.215)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/11.0.696.57)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) chromeframe/10.0.648.205", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.1; SV1; .NET CLR 2.8.52393; WOW64; en-US)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; chromeframe/11.0.696.57)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0; GTB7.4; InfoPath.3; SV1; .NET CLR 3.1.76908; WOW64; en-US)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.8.36217; WOW64; en-US)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; .NET CLR 2.7.58687; SLCC2; Media Center PC 5.0; Zune 3.4; Tablet PC 3.6; InfoPath.3)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; SLCC1; .NET CLR 1.1.4322)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 3.0.04506.30)", "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.0; Trident/4.0; FBSMTWB; .NET CLR 2.0.34861; .NET CLR 3.0.3746.3218; .NET CLR 3.5.33652; msn OptimizedIE8;ENUS)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.3; .NET4.0C; .NET4.0E; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MS-RTC LM 8)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 3.0)"], "firefox": ["Mozilla/5.0 (X11; Linux i686; rv:64.0) Gecko/20100101 Firefox/64.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0", "Mozilla/5.0 (X11; Linux i586; rv:63.0) Gecko/20100101 Firefox/63.0", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.10; rv:62.0) Gecko/20100101 Firefox/62.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:10.0) Gecko/20100101 Firefox/62.0", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.13; ko; rv:1.9.1b2) Gecko/20081201 Firefox/60.0", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/58.0.1", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/58.0", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:52.59.12) Gecko/20160044 Firefox/52.59.12", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20060814 Firefox/51.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20120121 Firefox/46.0", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.66.18) Gecko/20177177 Firefox/45.66.18", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1", "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0", "Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:28.0) Gecko/20100101 Firefox/31.0", "Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/29.0", "Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0", "Mozilla/5.0 (X11; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0", "Mozilla/5.0 (Windows NT 6.1; rv:27.3) Gecko/20130101 Firefox/27.3", "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:27.0) Gecko/20121011 Firefox/27.0", "Mozilla/5.0 (Windows NT 6.2; rv:20.0) Gecko/20121202 Firefox/26.0", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0", "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0", "Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/23.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:23.0) Gecko/20131011 Firefox/23.0", "Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/22.0", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:22.0) Gecko/20130328 Firefox/22.0", "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20130405 Firefox/22.0", "Mozilla/5.0 (Microsoft Windows NT 6.2.9200.0); rv:22.0) Gecko/20130405 Firefox/22.0", "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1", "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:21.0.0) Gecko/20121011 Firefox/21.0.0", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20130331 Firefox/21.0", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20130514 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.2; rv:21.0) Gecko/20130326 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130401 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130331 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130330 Firefox/21.0"], "safari": ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A", "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10", "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; da-dk) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1", "Mozilla/5.0 (Windows; U; Windows NT 6.1; tr-TR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; ko-KR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr-FR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; sv-se) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ko-kr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; it-it) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-fr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; es-es) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-gb) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; de-de) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; sv-SE) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/534.16+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-ch) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; de-de) AppleWebKit/534.15+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ar) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Android 2.2; Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-HK) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 6.0; tr-TR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 6.0; nb-NO) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-cn) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"], "opera": ["Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16", "Opera/9.80 (Macintosh; Intel Mac OS X 10.14.1) Presto/2.12.388 Version/12.16", "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14", "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14", "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02", "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00", "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00", "Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00", "Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00", "Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0", "Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62", "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52", "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51", "Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50", "Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50", "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11", "Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11", "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11", "Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10", "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10", "Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10", "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1", "Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01", "Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01", "Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; sv) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 5.1; U;) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.7.62 Version/11.01", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101213 Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01", "Mozilla/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01", "Mozilla/5.0 (Windows NT 6.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; de) Opera 11.01", "Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00", "Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.37 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; ko) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; en-GB) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1 x64; U; en) Presto/2.7.62 Version/11.00"]}, "randomize": {"0": "chrome", "1": "chrome", "2": "chrome", "3": "chrome", "4": "chrome", "5": "chrome", "6": "chrome", "7": "chrome", "8": "chrome", "9": "chrome", "10": "chrome", "11": "chrome", "12": "chrome", "13": "chrome", "14": "chrome", "15": "chrome", "16": "chrome", "17": "chrome", "18": "chrome", "19": "chrome", "20": "chrome", "21": "chrome", "22": "chrome", "23": "chrome", "24": "chrome", "25": "chrome", "26": "chrome", "27": "chrome", "28": "chrome", "29": "chrome", "30": "chrome", "31": "chrome", "32": "chrome", "33": "chrome", "34": "chrome", "35": "chrome", "36": "chrome", "37": "chrome", "38": "chrome", "39": "chrome", "40": "chrome", "41": "chrome", "42": "chrome", "43": "chrome", "44": "chrome", "45": "chrome", "46": "chrome", "47": "chrome", "48": "chrome", "49": "chrome", "50": "chrome", "51": "chrome", "52": "chrome", "53": "chrome", "54": "chrome", "55": "chrome", "56": "chrome", "57": "chrome", "58": "chrome", "59": "chrome", "60": "chrome", "61": "chrome", "62": "chrome", "63": "chrome", "64": "chrome", "65": "chrome", "66": "chrome", "67": "chrome", "68": "chrome", "69": "chrome", "70": "chrome", "71": "chrome", "72": "chrome", "73": "chrome", "74": "chrome", "75": "chrome", "76": "chrome", "77": "chrome", "78": "chrome", "79": "chrome", "80": "chrome", "81": "chrome", "82": "chrome", "83": "chrome", "84": "chrome", "85": "chrome", "86": "chrome", "87": "chrome", "88": "chrome", "89": "chrome", "90": "chrome", "91": "chrome", "92": "chrome", "93": "chrome", "94": "chrome", "95": "chrome", "96": "chrome", "97": "chrome", "98": "chrome", "99": "chrome", "100": "chrome", "101": "chrome", "102": "chrome", "103": "chrome", "104": "chrome", "105": "chrome", "106": "chrome", "107": "chrome", "108": "chrome", "109": "chrome", "110": "chrome", "111": "chrome", "112": "chrome", "113": "chrome", "114": "chrome", "115": "chrome", "116": "chrome", "117": "chrome", "118": "chrome", "119": "chrome", "120": "chrome", "121": "chrome", "122": "chrome", "123": "chrome", "124": "chrome", "125": "chrome", "126": "chrome", "127": "chrome", "128": "chrome", "129": "chrome", "130": "chrome", "131": "chrome", "132": "chrome", "133": "chrome", "134": "chrome", "135": "chrome", "136": "chrome", "137": "chrome", "138": "chrome", "139": "chrome", "140": "chrome", "141": "chrome", "142": "chrome", "143": "chrome", "144": "chrome", "145": "chrome", "146": "chrome", "147": "chrome", "148": "chrome", "149": "chrome", "150": "chrome", "151": "chrome", "152": "chrome", "153": "chrome", "154": "chrome", "155": "chrome", "156": "chrome", "157": "chrome", "158": "chrome", "159": "chrome", "160": "chrome", "161": "chrome", "162": "chrome", "163": "chrome", "164": "chrome", "165": "chrome", "166": "chrome", "167": "chrome", "168": "chrome", "169": "chrome", "170": "chrome", "171": "chrome", "172": "chrome", "173": "chrome", "174": "chrome", "175": "chrome", "176": "chrome", "177": "chrome", "178": "chrome", "179": "chrome", "180": "chrome", "181": "chrome", "182": "chrome", "183": "chrome", "184": "chrome", "185": "chrome", "186": "chrome", "187": "chrome", "188": "chrome", "189": "chrome", "190": "chrome", "191": "chrome", "192": "chrome", "193": "chrome", "194": "chrome", "195": "chrome", "196": "chrome", "197": "chrome", "198": "chrome", "199": "chrome", "200": "chrome", "201": "chrome", "202": "chrome", "203": "chrome", "204": "chrome", "205": "chrome", "206": "chrome", "207": "chrome", "208": "chrome", "209": "chrome", "210": "chrome", "211": "chrome", "212": "chrome", "213": "chrome", "214": "chrome", "215": "chrome", "216": "chrome", "217": "chrome", "218": "chrome", "219": "chrome", "220": "chrome", "221": "chrome", "222": "chrome", "223": "chrome", "224": "chrome", "225": "chrome", "226": "chrome", "227": "chrome", "228": "chrome", "229": "chrome", "230": "chrome", "231": "chrome", "232": "chrome", "233": "chrome", "234": "chrome", "235": "chrome", "236": "chrome", "237": "chrome", "238": "chrome", "239": "chrome", "240": "chrome", "241": "chrome", "242": "chrome", "243": "chrome", "244": "chrome", "245": "chrome", "246": "chrome", "247": "chrome", "248": "chrome", "249": "chrome", "250": "chrome", "251": "chrome", "252": "chrome", "253": "chrome", "254": "chrome", "255": "chrome", "256": "chrome", "257": "chrome", "258": "chrome", "259": "chrome", "260": "chrome", "261": "chrome", "262": "chrome", "263": "chrome", "264": "chrome", "265": "chrome", "266": "chrome", "267": "chrome", "268": "chrome", "269": "chrome", "270": "chrome", "271": "chrome", "272": "chrome", "273": "chrome", "274": "chrome", "275": "chrome", "276": "chrome", "277": "chrome", "278": "chrome", "279": "chrome", "280": "chrome", "281": "chrome", "282": "chrome", "283": "chrome", "284": "chrome", "285": "chrome", "286": "chrome", "287": "chrome", "288": "chrome", "289": "chrome", "290": "chrome", "291": "chrome", "292": "chrome", "293": "chrome", "294": "chrome", "295": "chrome", "296": "chrome", "297": "chrome", "298": "chrome", "299": "chrome", "300": "chrome", "301": "chrome", "302": "chrome", "303": "chrome", "304": "chrome", "305": "chrome", "306": "chrome", "307": "chrome", "308": "chrome", "309": "chrome", "310": "chrome", "311": "chrome", "312": "chrome", "313": "chrome", "314": "chrome", "315": "chrome", "316": "chrome", "317": "chrome", "318": "chrome", "319": "chrome", "320": "chrome", "321": "chrome", "322": "chrome", "323": "chrome", "324": "chrome", "325": "chrome", "326": "chrome", "327": "chrome", "328": "chrome", "329": "chrome", "330": "chrome", "331": "chrome", "332": "chrome", "333": "chrome", "334": "chrome", "335": "chrome", "336": "chrome", "337": "chrome", "338": "chrome", "339": "chrome", "340": "chrome", "341": "chrome", "342": "chrome", "343": "chrome", "344": "chrome", "345": "chrome", "346": "chrome", "347": "chrome", "348": "chrome", "349": "chrome", "350": "chrome", "351": "chrome", "352": "chrome", "353": "chrome", "354": "chrome", "355": "chrome", "356": "chrome", "357": "chrome", "358": "chrome", "359": "chrome", "360": "chrome", "361": "chrome", "362": "chrome", "363": "chrome", "364": "chrome", "365": "chrome", "366": "chrome", "367": "chrome", "368": "chrome", "369": "chrome", "370": "chrome", "371": "chrome", "372": "chrome", "373": "chrome", "374": "chrome", "375": "chrome", "376": "chrome", "377": "chrome", "378": "chrome", "379": "chrome", "380": "chrome", "381": "chrome", "382": "chrome", "383": "chrome", "384": "chrome", "385": "chrome", "386": "chrome", "387": "chrome", "388": "chrome", "389": "chrome", "390": "chrome", "391": "chrome", "392": "chrome", "393": "chrome", "394": "chrome", "395": "chrome", "396": "chrome", "397": "chrome", "398": "chrome", "399": "chrome", "400": "chrome", "401": "chrome", "402": "chrome", "403": "chrome", "404": "chrome", "405": "chrome", "406": "chrome", "407": "chrome", "408": "chrome", "409": "chrome", "410": "chrome", "411": "chrome", "412": "chrome", "413": "chrome", "414": "chrome", "415": "chrome", "416": "chrome", "417": "chrome", "418": "chrome", "419": "chrome", "420": "chrome", "421": "chrome", "422": "chrome", "423": "chrome", "424": "chrome", "425": "chrome", "426": "chrome", "427": "chrome", "428": "chrome", "429": "chrome", "430": "chrome", "431": "chrome", "432": "chrome", "433": "chrome", "434": "chrome", "435": "chrome", "436": "chrome", "437": "chrome", "438": "chrome", "439": "chrome", "440": "chrome", "441": "chrome", "442": "chrome", "443": "chrome", "444": "chrome", "445": "chrome", "446": "chrome", "447": "chrome", "448": "chrome", "449": "chrome", "450": "chrome", "451": "chrome", "452": "chrome", "453": "chrome", "454": "chrome", "455": "chrome", "456": "chrome", "457": "chrome", "458": "chrome", "459": "chrome", "460": "chrome", "461": "chrome", "462": "chrome", "463": "chrome", "464": "chrome", "465": "chrome", "466": "chrome", "467": "chrome", "468": "chrome", "469": "chrome", "470": "chrome", "471": "chrome", "472": "chrome", "473": "chrome", "474": "chrome", "475": "chrome", "476": "chrome", "477": "chrome", "478": "chrome", "479": "chrome", "480": "chrome", "481": "chrome", "482": "chrome", "483": "chrome", "484": "chrome", "485": "chrome", "486": "chrome", "487": "chrome", "488": "chrome", "489": "chrome", "490": "chrome", "491": "chrome", "492": "chrome", "493": "chrome", "494": "chrome", "495": "chrome", "496": "chrome", "497": "chrome", "498": "chrome", "499": "chrome", "500": "chrome", "501": "chrome", "502": "chrome", "503": "chrome", "504": "chrome", "505": "chrome", "506": "chrome", "507": "chrome", "508": "chrome", "509": "chrome", "510": "chrome", "511": "chrome", "512": "chrome", "513": "chrome", "514": "chrome", "515": "chrome", "516": "chrome", "517": "chrome", "518": "chrome", "519": "chrome", "520": "chrome", "521": "chrome", "522": "chrome", "523": "chrome", "524": "chrome", "525": "chrome", "526": "chrome", "527": "chrome", "528": "chrome", "529": "chrome", "530": "chrome", "531": "chrome", "532": "chrome", "533": "chrome", "534": "chrome", "535": "chrome", "536": "chrome", "537": "chrome", "538": "chrome", "539": "chrome", "540": "chrome", "541": "chrome", "542": "chrome", "543": "chrome", "544": "chrome", "545": "chrome", "546": "chrome", "547": "chrome", "548": "chrome", "549": "chrome", "550": "chrome", "551": "chrome", "552": "chrome", "553": "chrome", "554": "chrome", "555": "chrome", "556": "chrome", "557": "chrome", "558": "chrome", "559": "chrome", "560": "chrome", "561": "chrome", "562": "chrome", "563": "chrome", "564": "chrome", "565": "chrome", "566": "chrome", "567": "chrome", "568": "chrome", "569": "chrome", "570": "chrome", "571": "chrome", "572": "chrome", "573": "chrome", "574": "chrome", "575": "chrome", "576": "chrome", "577": "chrome", "578": "chrome", "579": "chrome", "580": "chrome", "581": "chrome", "582": "chrome", "583": "chrome", "584": "chrome", "585": "chrome", "586": "chrome", "587": "chrome", "588": "chrome", "589": "chrome", "590": "chrome", "591": "chrome", "592": "chrome", "593": "chrome", "594": "chrome", "595": "chrome", "596": "chrome", "597": "chrome", "598": "chrome", "599": "chrome", "600": "chrome", "601": "chrome", "602": "chrome", "603": "chrome", "604": "chrome", "605": "chrome", "606": "chrome", "607": "chrome", "608": "chrome", "609": "chrome", "610": "chrome", "611": "chrome", "612": "chrome", "613": "chrome", "614": "chrome", "615": "chrome", "616": "chrome", "617": "chrome", "618": "chrome", "619": "chrome", "620": "chrome", "621": "chrome", "622": "chrome", "623": "chrome", "624": "chrome", "625": "chrome", "626": "chrome", "627": "chrome", "628": "chrome", "629": "chrome", "630": "chrome", "631": "chrome", "632": "chrome", "633": "chrome", "634": "chrome", "635": "chrome", "636": "chrome", "637": "chrome", "638": "chrome", "639": "chrome", "640": "chrome", "641": "chrome", "642": "chrome", "643": "chrome", "644": "chrome", "645": "chrome", "646": "chrome", "647": "chrome", "648": "chrome", "649": "chrome", "650": "chrome", "651": "chrome", "652": "chrome", "653": "chrome", "654": "chrome", "655": "chrome", "656": "chrome", "657": "chrome", "658": "chrome", "659": "chrome", "660": "chrome", "661": "chrome", "662": "chrome", "663": "chrome", "664": "chrome", "665": "chrome", "666": "chrome", "667": "chrome", "668": "chrome", "669": "chrome", "670": "chrome", "671": "chrome", "672": "chrome", "673": "chrome", "674": "chrome", "675": "chrome", "676": "chrome", "677": "chrome", "678": "chrome", "679": "chrome", "680": "chrome", "681": "chrome", "682": "chrome", "683": "chrome", "684": "chrome", "685": "chrome", "686": "chrome", "687": "chrome", "688": "chrome", "689": "chrome", "690": "chrome", "691": "chrome", "692": "chrome", "693": "chrome", "694": "chrome", "695": "chrome", "696": "chrome", "697": "chrome", "698": "chrome", "699": "chrome", "700": "chrome", "701": "chrome", "702": "chrome", "703": "chrome", "704": "chrome", "705": "chrome", "706": "chrome", "707": "chrome", "708": "chrome", "709": "chrome", "710": "chrome", "711": "chrome", "712": "chrome", "713": "chrome", "714": "chrome", "715": "chrome", "716": "chrome", "717": "chrome", "718": "chrome", "719": "chrome", "720": "chrome", "721": "chrome", "722": "chrome", "723": "chrome", "724": "chrome", "725": "chrome", "726": "chrome", "727": "chrome", "728": "chrome", "729": "chrome", "730": "chrome", "731": "chrome", "732": "chrome", "733": "chrome", "734": "chrome", "735": "chrome", "736": "chrome", "737": "chrome", "738": "chrome", "739": "chrome", "740": "chrome", "741": "chrome", "742": "chrome", "743": "chrome", "744": "chrome", "745": "chrome", "746": "chrome", "747": "chrome", "748": "chrome", "749": "chrome", "750": "chrome", "751": "chrome", "752": "chrome", "753": "chrome", "754": "chrome", "755": "chrome", "756": "chrome", "757": "chrome", "758": "chrome", "759": "chrome", "760": "chrome", "761": "chrome", "762": "chrome", "763": "chrome", "764": "chrome", "765": "chrome", "766": "chrome", "767": "chrome", "768": "chrome", "769": "chrome", "770": "chrome", "771": "chrome", "772": "chrome", "773": "chrome", "774": "chrome", "775": "chrome", "776": "chrome", "777": "chrome", "778": "chrome", "779": "chrome", "780": "chrome", "781": "chrome", "782": "chrome", "783": "chrome", "784": "chrome", "785": "chrome", "786": "chrome", "787": "chrome", "788": "chrome", "789": "chrome", "790": "chrome", "791": "chrome", "792": "chrome", "793": "chrome", "794": "chrome", "795": "chrome", "796": "chrome", "797": "chrome", "798": "chrome", "799": "chrome", "800": "chrome", "801": "chrome", "802": "chrome", "803": "internetexplorer", "804": "internetexplorer", "805": "internetexplorer", "806": "internetexplorer", "807": "internetexplorer", "808": "internetexplorer", "809": "internetexplorer", "810": "internetexplorer", "811": "internetexplorer", "812": "internetexplorer", "813": "internetexplorer", "814": "internetexplorer", "815": "internetexplorer", "816": "internetexplorer", "817": "internetexplorer", "818": "internetexplorer", "819": "internetexplorer", "820": "internetexplorer", "821": "internetexplorer", "822": "internetexplorer", "823": "internetexplorer", "824": "internetexplorer", "825": "internetexplorer", "826": "internetexplorer", "827": "internetexplorer", "828": "internetexplorer", "829": "internetexplorer", "830": "internetexplorer", "831": "internetexplorer", "832": "internetexplorer", "833": "internetexplorer", "834": "internetexplorer", "835": "internetexplorer", "836": "internetexplorer", "837": "internetexplorer", "838": "internetexplorer", "839": "firefox", "840": "firefox", "841": "firefox", "842": "firefox", "843": "firefox", "844": "firefox", "845": "firefox", "846": "firefox", "847": "firefox", "848": "firefox", "849": "firefox", "850": "firefox", "851": "firefox", "852": "firefox", "853": "firefox", "854": "firefox", "855": "firefox", "856": "firefox", "857": "firefox", "858": "firefox", "859": "firefox", "860": "firefox", "861": "firefox", "862": "firefox", "863": "firefox", "864": "firefox", "865": "firefox", "866": "firefox", "867": "firefox", "868": "firefox", "869": "firefox", "870": "firefox", "871": "firefox", "872": "firefox", "873": "firefox", "874": "firefox", "875": "firefox", "876": "firefox", "877": "firefox", "878": "firefox", "879": "firefox", "880": "firefox", "881": "firefox", "882": "firefox", "883": "firefox", "884": "firefox", "885": "firefox", "886": "firefox", "887": "firefox", "888": "firefox", "889": "firefox", "890": "firefox", "891": "firefox", "892": "firefox", "893": "firefox", "894": "firefox", "895": "firefox", "896": "firefox", "897": "firefox", "898": "firefox", "899": "firefox", "900": "firefox", "901": "firefox", "902": "firefox", "903": "firefox", "904": "firefox", "905": "firefox", "906": "firefox", "907": "firefox", "908": "firefox", "909": "firefox", "910": "firefox", "911": "firefox", "912": "firefox", "913": "firefox", "914": "firefox", "915": "firefox", "916": "firefox", "917": "firefox", "918": "firefox", "919": "firefox", "920": "firefox", "921": "firefox", "922": "firefox", "923": "firefox", "924": "firefox", "925": "firefox", "926": "firefox", "927": "firefox", "928": "firefox", "929": "firefox", "930": "firefox", "931": "firefox", "932": "firefox", "933": "firefox", "934": "firefox", "935": "safari", "936": "safari", "937": "safari", "938": "safari", "939": "safari", "940": "safari", "941": "safari", "942": "safari", "943": "safari", "944": "safari", "945": "safari", "946": "safari", "947": "safari", "948": "safari", "949": "safari", "950": "safari", "951": "safari", "952": "safari", "953": "safari", "954": "safari", "955": "safari", "956": "safari", "957": "safari", "958": "safari", "959": "safari", "960": "safari", "961": "safari", "962": "safari", "963": "safari", "964": "safari", "965": "safari", "966": "safari", "967": "safari", "968": "opera", "969": "opera", "970": "opera", "971": "opera", "972": "opera", "973": "opera", "974": "opera", "975": "opera", "976": "opera", "977": "opera", "978": "opera", "979": "opera", "980": "opera", "981": "opera", "982": "opera", "983": "opera", "984": "opera"}} -------------------------------------------------------------------------------- /CrawlerClassCode/request/get.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | url = 'http://10.10.10.139/post.php' 4 | 5 | getPara = { 6 | "wd": "林俊杰" 7 | } 8 | 9 | headers = { 10 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.47" 11 | } 12 | 13 | res = requests.get(url = url,params=getPara,headers=headers) 14 | print(res.text) 15 | print(res.url) 16 | input() -------------------------------------------------------------------------------- /CrawlerClassCode/request/post.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | postData = { 4 | "username":"admin", 5 | "passwd":"123.com" 6 | } 7 | 8 | url = 'http://10.10.10.139/post.php' 9 | 10 | res = requests.post(url,data=postData) 11 | print(res.text) 12 | print(res.url) 13 | input() -------------------------------------------------------------------------------- /CrawlerClassCode/request/timeout.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | url = "https://www.baidu.com" 4 | 5 | try: 6 | res = requests.get(url,timeout=3) 7 | print(res.text) 8 | 9 | except Exception as e: 10 | print("timeout") -------------------------------------------------------------------------------- /CrawlerClassCode/request/upFile.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | url = 'http://10.10.10.139/upload-labs/Pass-01/index.php' 4 | 5 | uploadFile = { 6 | "upload_file":open("get.py","rb") 7 | } 8 | 9 | postData = { 10 | "submit":"上传" 11 | } 12 | 13 | res = requests.post(url = url,files = uploadFile,data = postData) 14 | print(res.text) 15 | print(res.url) 16 | print(res.status_code) 17 | input() -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## 这里有什么? 4 | * 这些是我在2021年10月-12月学爬虫时写的一些小demo,以及在挖漏洞时写的一些收集信息的爬虫,比如爬取必应搜索结果的URL,各大高校的漏洞信息爬取,子域名暴破。当然,代码都是基本的功能实现。 5 | 6 | ## 你可以了解到的技术 7 | * 如何自动发送HTTP请求获取页面源代码 8 | * 如何解析网页源代码 9 | * 无头浏览器技术 10 | -用代码控制浏览器的行为 11 | * 多线程技术 12 | -实现快速的信息获取 13 | * 队列 14 | - 数据的存储与获取 15 | * 异步 16 | - 更高效的利用时间 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /edu_vul_search/README.md: -------------------------------------------------------------------------------- 1 | 2 | ## 简介 3 | * 该脚本用来批量收集Edu_Src的信息 4 | ## 环境 5 | * python >=3.7 6 | ## 参数 7 | - -p 爬取的页数 8 | - -t 线程数 9 | - -o 文件保存路径 10 | - -n 0: 搜索模式 1: 爬取模式 11 | -------------------------------------------------------------------------------- /edu_vul_search/eduVul.txt: -------------------------------------------------------------------------------- 1 | 甘肃省教育厅存在SQL注入漏洞 2 | 四川省教育厅存在敏感信息泄露 3 | 甘肃省教育厅存在SQL注入漏洞 4 | 广西中医药大学赛恩斯新医药学院存在弱口令 5 | 四川省教育厅存在敏感信息泄露 6 | 安徽医学高等专科学校存在SQL注入漏洞 7 | 甘肃省教育厅存在SQL注入漏洞 8 | 广西中医药大学赛恩斯新医药学院存在弱口令 9 | 四川省教育厅存在敏感信息泄露 10 | 四川省教育厅存在敏感信息泄露 11 | 安徽医学高等专科学校存在SQL注入漏洞 12 | 甘肃省教育厅存在SQL注入漏洞 13 | 广西中医药大学赛恩斯新医药学院存在弱口令 14 | 河北省教育厅存在SQL注入漏洞 15 | �院存在弱口令 16 | 宁夏大学存在敏感信息泄露 17 | 四川省教育厅存在敏感信息泄露 18 | 安徽医学高等专科学校存在SQL注入漏洞 19 | � 20 | 甘肃省教育厅存在SQL注入漏洞 21 | 河北省教育厅存在SQL注入漏洞 22 | 甘肃省教育厅存在SQL注入漏洞 23 | 宁夏大学存在敏感信息泄露 24 | �漏洞 25 | 四川省教育厅存在敏感信息泄露 26 | 北京信息职业技术学院存在敏感信息泄露 27 | 四川省教育厅存在敏感信息泄露 28 | �漏洞 29 | 温州肯恩大学存在SQL注入漏洞 30 | 甘肃省教育厅存在SQL注入漏洞 31 | 广西中医药大学赛恩斯新医药学院存在弱口令 32 | 邯郸职业技术学院存在SQL注入漏洞 33 | 广西中医药大学赛恩斯新医药学院存在弱口令 34 | 北京理工大学珠海学院存在SQL注入漏洞 35 | � 36 | 四川省教育厅存在敏感信息泄露 37 | 安徽医学高等专科学校存在SQL注入漏洞 38 | 河北省教育厅存在SQL注入漏洞 39 | 邯郸职业技术学院存在SQL注入漏洞 40 | 广西中医药大学赛恩斯新医药学院存在弱口令 41 | 北京理工大学珠海学院存在SQ宁夏大学存在敏感信息泄露 42 | 温州肯恩大学存在SQL注入漏洞 43 | 大连海洋大学存在SQL注入漏洞 44 | 安徽医学高等专科学校存在SQL注入漏洞 45 | 河北省教育厅存在SQL注入漏洞 46 | �洞 47 | 河北省教育厅存在SQL注入漏洞 48 | 北京理工大学珠海学院存在SQL注入漏洞 49 | 宁夏大学存在敏感信息泄露 50 | 北京信息职业技术学院存在敏�北京信息职业技术学院存在敏感信息泄露 51 | 重庆市教育委员会存在SQL注入漏洞 52 | � 53 | 河北省教育厅存在SQL注入漏洞 54 | 邯郸职业技术学院存在SQL注入漏洞 55 | 北京理工大学珠海学院存在SQL注入漏洞 56 | 河南工业大学存在SQL注入漏洞 57 | 邯郸职业技术学院存在SQL注入漏洞 58 | 大连海洋大学存在SQL注入漏洞 59 | �入漏洞 60 | 北京信息职业技术学院存在敏感信息泄露 61 | 重庆市教育委员会存在SQL注入漏洞 62 | 江西财经职业学院存在敏感信息泄露 63 | 河南工业大学存在SQL注入漏洞 64 | 邯郸职业技术学院存在SQL注入漏洞 65 | 广东交通职业技术学院存在SQL注入漏洞 66 | 大连海洋大学存在SQL注入漏洞 67 | 江西财经职业学院存在敏感信息泄露 68 | 温州肯恩大学存在SQL注入漏洞 69 | 河南工业大学存在SQL注入漏洞 70 | �洞 71 | 重庆市教育委员会存在SQL注入漏洞 72 | 广东交通职业技术学院存在SQL注入漏洞 73 | 北京理工大学珠海学院存在SQL注入漏洞 74 | 江西财经职业学院存在敏感信�大连海洋大学存在SQL注入漏洞 75 | 重庆市教育委员会存在SQL注入漏洞 76 | 河南工业大学存在SQL注入漏洞 77 | �入漏洞 78 | 大连海洋大学存在SQL注入漏洞 79 | 江西财经职业学院存在敏感信息泄露 80 | 江西财经职业学院存在敏感信息泄露 81 | 河南工业大学存在SQL注入漏洞 82 | 广东交通职业技术学院存在SQL注入漏洞 83 | 江西财经职业学院存在敏感信息泄露 84 | 广东交通职业技术学院存在SQL注入漏洞 85 | -------------------------------------------------------------------------------- /edu_vul_search/edu_vul_spider.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2022-4-11 3 | # @Author : YaoW 4 | # @Email: comedyyou@163.com 5 | # @File: edu_vul_spider.py 6 | # @Software: VS Code 7 | import requests 8 | import time 9 | from lxml import etree 10 | import sys 11 | from concurrent.futures import ThreadPoolExecutor 12 | from argparse import ArgumentParser 13 | 14 | arg = ArgumentParser(description='baidu_url_collection') 15 | arg.add_argument('keyword',help='关键字') 16 | arg.add_argument('-p', '--page', help='page count', dest='pagecount', type=int,default=30) 17 | arg.add_argument('-t', '--thread', help='the thread_count', dest='thread_count', type=int, default=10) 18 | arg.add_argument('-o', '--outfile', help='the file save result', dest='outfile', default='eduVul.txt') 19 | arg.add_argument('-n','--no-request',help='1:gather info, 0:do not gather info',dest='sign',type=int,default=1) 20 | option = arg.parse_args() 21 | 22 | def get_vuln_info(page): 23 | """ 24 | 漏洞信息收集模块 25 | """ 26 | url = f'https://src.sjtu.edu.cn/list/?page={option.pagecount}' 27 | headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0'} 28 | 29 | resp = requests.get(url,headers=headers,timeout=5) 30 | soup = etree.HTML(resp.text) 31 | results = soup.xpath('//tr[@class="row"]/td[2]/a/text()') 32 | results = '\n'.join(results) 33 | results = results.split() 34 | 35 | for result in results: 36 | print(result) 37 | with open(option.outfile,'a',encoding='utf-8') as f: 38 | f.write(result+'\n') 39 | time.sleep(0.1) 40 | 41 | def checkVul(keyword): 42 | """ 43 | 指定特定的高校,匹配其漏洞信息 44 | """ 45 | print('-' * 20 + ' check vul information ' + '-' * 20) 46 | with open(option.outfile,'rb') as f: 47 | for line in f.readlines(): 48 | try: 49 | line = line.decode('utf-8') 50 | line = line.replace('\n', '') 51 | if keyword in line: 52 | print(line) 53 | with open('target.txt','a',encoding='utf-8') as f: 54 | f.write(line) 55 | except: 56 | continue 57 | 58 | def main(): 59 | if(option.sign == 1): 60 | with ThreadPoolExecutor(option.thread_count) as t: 61 | for i in range(1,int(option.pagecount)+1): 62 | t.submit(get_vuln_info,i) 63 | checkVul(option.keyword) 64 | 65 | else: 66 | checkVul(option.keyword) 67 | 68 | if __name__ == '__main__': 69 | start = time.time() 70 | main() 71 | end = time.time() 72 | print('cost time: %s s' %(end - start)) 73 | -------------------------------------------------------------------------------- /edu_vul_search/target.txt: -------------------------------------------------------------------------------- 1 | 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 北京交通大学存在弱口令 江南大学存在垂直权限绕过 江南大学存在垂直权限绕过 江南大学存在垂直权限绕过 江南大学存在垂直权限绕过 江南大学存在垂直权限绕过 江南大学存在垂直权限绕过 江南大学存在垂直权限绕过 江南大学存在垂直权限绕过 江南大学存在垂直权限绕过 江南大学存在垂直权限绕过 江南大学存在垂直权限绕过 江南大学存在垂直权限绕过 江南大学存在垂直权限绕过 江南大学存在垂直权限绕过 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 上海市教育委员会存在其他漏洞 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 南京财经大学存在敏感信息泄露 江苏省教育厅存在XSS漏洞 江苏省教育厅存在XSS漏洞 江苏航运职业技术学院存在文件上传漏洞 江苏省教育厅存在XSS漏洞 江苏航运职业技术学院存在文件上传漏洞 江苏航运职业技术学院存在文件上传漏洞 江苏省教育厅存在XSS漏洞 江苏省教育厅存在XSS漏洞 江苏航运职业技术学院存在文件上传漏洞 江苏航运职业技术学院存在文件上传漏洞 江苏航运职业技术学院存在文件上传漏洞 江苏航运职业技术学院存在文件上传漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 南京工程学院存在SQL注入漏洞 北京信息职业技术学院存在敏感信息泄露 北京理工大学珠海学院存在SQL注入漏洞 北京理工大学珠海学院存在SQ宁夏大学存在敏感信息泄露 北京理工大学珠海学院存在SQL注入漏洞 北京理工大学珠海学院存在SQL注入漏洞 北京信息职业技术学院存在敏感信息泄露 北京理工大学珠海学院存在SQL注入漏洞 河北省教育厅存在SQL注入漏洞 河北省教育厅存在SQL注入漏洞 河北省教育厅存在SQL注入漏洞 河北省教育厅存在SQL注入漏洞 河北省教育厅存在SQL注入漏洞 河北省教育厅存在SQL注入漏洞 江西财经职业学院存在敏感信息泄露 江西财经职业学院存在敏感信息泄露 江西财经职业学院存在敏感信息泄露 江西财经职业学院存在敏感信息泄露 江西财经职业学院存在敏感信息泄露 河南工业大学存在SQL注入漏洞 河南工业大学存在SQL注入漏洞 河南工业大学存在SQL注入漏洞 河南工业大学存在SQL注入漏洞 河南工业大学存在SQL注入漏洞 广东交通职业技术学院存在SQL注入漏洞 广东交通职业技术学院存在SQL注入漏洞 广东交通职业技术学院存在SQL注入漏洞 广东交通职业技术学院存在SQL注入漏洞 广西中医药大学赛恩斯新医药学院存在弱口令 广西中医药大学赛恩斯新医药学院存在弱口令 广西中医药大学赛恩斯新医药学院存在弱口令 北京信息职业技术学院存在敏感信息泄露 广西中医药大学赛恩斯新医药学院存在弱口令 邯郸职业技术学院存在SQL注入漏洞 广西中医药大学赛恩斯新医药学院存在弱口令 北京理工大学珠海学院存在SQL注入漏洞 邯郸职业技术学院存在SQL注入漏洞 广西中医药大学赛恩斯新医药学院存在弱口令 北京理工大学珠海学院存在SQ宁夏大学存在敏感信息泄露 北京理工大学珠海学院存在SQL注入漏洞 邯郸职业技术学院存在SQL注入漏洞 北京理工大学珠海学院存在SQL注入漏洞 邯郸职业技术学院存在SQL注入漏洞 北京信息职业技术学院存在敏感信息泄露 江西财经职业学院存在敏感信息泄露 邯郸职业技术学院存在SQL注入漏洞 广东交通职业技术学院存在SQL注入漏洞 江西财经职业学院存在敏感信息泄露 广东交通职业技术学院存在SQL注入漏洞 北京理工大学珠海学院存在SQL注入漏洞 江西财经职业学院存在敏感信息泄露 江西财经职业学院存在敏感信息泄露 广东交通职业技术学院存在SQL注入漏洞 江西财经职业学院存在敏感信息泄露 广东交通职业技术学院存在SQL注入漏洞 -------------------------------------------------------------------------------- /jd_conduct_search/jd_crawler.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from lxml import etree 3 | from urllib import parse 4 | import csv 5 | 6 | url = 'https://search.jd.com/Search' 7 | keyword = input("[*] 你想查询的书籍(类型):") 8 | start = int(input("[*]start page:")) 9 | end = int(input("[*]end page:")) 10 | 11 | #创建保存数据的文件 12 | f = open("jd_product.csv","w",encoding='gbk') 13 | csvWrite = csv.writer(f) 14 | 15 | for page in range(start,end+1): 16 | para = { 17 | "keyword": keyword, 18 | "page": page, 19 | } 20 | #参数url编码 21 | text = parse.urlencode(para) 22 | headers = { 23 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36" 24 | } 25 | response = requests.get(url,headers=headers,params=text) 26 | 27 | #解析 28 | html = etree.HTML(response.text) 29 | 30 | #拿到每个商品的li 31 | lis = html.xpath("/html/body/div[5]/div[2]/div[2]/div[1]/div/div[2]/ul/li") 32 | 33 | #从每本书的li中进行解析 34 | for li in lis: 35 | price = li.xpath("./div/div[2]/strong/i/text()") 36 | title = li.xpath("./div/div[3]/a/em//text()") #//text()获取子节点的所有内容 37 | img_src = li.xpath("./div/div[1]/a/img/@data-lazy-img") 38 | info = li.xpath("./div/div[7]/i[1]/text()") #是否自营 39 | 40 | #取出列表中的值 41 | title_str = ''.join(title) 42 | price_str = '¥' + ''.join(price) 43 | info_str = ''.join(info) 44 | 45 | csvWrite.writerow([title_str,info_str,price_str]) 46 | print(title_str,info_str,price_str) 47 | 48 | print('[*] done') 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /job_info_search/job_seach.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import pprint 3 | import jsonpath 4 | import json 5 | import re 6 | from bs4 import BeautifulSoup 7 | #https://jinshi.zbj.com 8 | url = 'https://jinshi.zbj.com/api/unwanted/index2021/QftInfoService/getQftSearchInfo' 9 | key_word = input('[*] 想要查询的服务:') 10 | headers = { 11 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", 12 | 13 | "Referer":'https://taiyuan.zbj.com/search/f/?kw={keyword}' 14 | } 15 | 16 | para = { 17 | 'searchType': 1, 18 | 'catType': 2, 19 | 'cityId': 3803, 20 | 'keyword':key_word, 21 | 'currentPage':2, 22 | 'size': 32, 23 | } 24 | 25 | 26 | resp = requests.get(url,headers=headers,params=para) 27 | json_data = resp.json() 28 | #pprint.pprint(json_data) 29 | 30 | #解析想要的数据 31 | name_list = jsonpath.jsonpath(json_data,'$..brandName') 32 | title_list = jsonpath.jsonpath(json_data,'$..title') 33 | price_list = jsonpath.jsonpath(json_data,'$..price') 34 | provinceName_list = jsonpath.jsonpath(json_data,'$..provinceName') 35 | title_list = jsonpath.jsonpath(json_data,'$..title') 36 | cityName_list = jsonpath.jsonpath(json_data,'$..cityName') 37 | 38 | title_result_list = [] 39 | #处理title中的标签 40 | for title in title_list: 41 | soup = BeautifulSoup(title,"html.parser") 42 | result = soup.text 43 | title_result_list.append(result) 44 | #print(title_result_list) 45 | 46 | #对应元素输出 47 | a = zip(name_list,title_result_list,price_list,provinceName_list,cityName_list) 48 | for i in a: 49 | print(i) 50 | -------------------------------------------------------------------------------- /translator/README.md: -------------------------------------------------------------------------------- 1 | 2 | ## 介绍 3 | * 该脚本调用百度翻译接口,返回响应的json数据 4 | 5 | ## 使用 6 | ``` 7 | Usage: python translator.py 8 | Example: python translator.py success 9 | ``` 10 | -------------------------------------------------------------------------------- /translator/translator.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2022-4-11 3 | # @Author : YaoW 4 | # @Email: comedyyou@163.com 5 | # @File: translator.py 6 | # @Software: VS Code 7 | 8 | import requests 9 | import sys 10 | 11 | def parse(url,keyword): 12 | """ 13 | url: 14 | 爬取的目标地址 15 | keyword: 16 | 需要翻译的文字 17 | """ 18 | data = {"kw": keyword} 19 | 20 | response = requests.post(url=url,data=data,timeout=5) 21 | 22 | json_data = response.json()['data'] 23 | 24 | if(json_data==''): 25 | print("Not found this word!") 26 | else: 27 | print(json_data) 28 | 29 | with open("translator_log.txt",'a') as f: 30 | f.write(str(json_data)) 31 | 32 | response.close() 33 | 34 | def banner(): 35 | banner = """Usage: python translator.py """ 36 | print(banner) 37 | 38 | def main(): 39 | url = 'https://fanyi.baidu.com/sug' 40 | 41 | if(len(sys.argv)<=1): 42 | banner() 43 | else: 44 | keyword = sys.argv[1] 45 | parse(url, keyword) 46 | 47 | if __name__ =='__main__': 48 | main() 49 | -------------------------------------------------------------------------------- /translator/translator_log.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggfgh/Crawler/f6cecb6c8e906c7c33455ed07d412982e7136301/translator/translator_log.txt -------------------------------------------------------------------------------- /url_gather/README.md: -------------------------------------------------------------------------------- 1 | 2 | ### 介绍 3 | * 使用该脚本,结合GoogleHacking语法,可以快速搜集大量含有漏洞特征的URL 4 | * 爬取的是baidu & bing的搜索结果 5 | * 主要用于批量化寻找含有SQL注入的脆弱站点,结合sqlmap & sqlmapapi进行批量化验证. 6 | * 参数说明 7 | ``` 8 | -t --threads 线程数 9 | -p --page 爬取结果的页数 10 | -o --outfile 结果的保存路径 11 | -h 显示帮助信息 12 | ``` 13 | ### python环境 14 | * python >=3.7 15 | ### 使用步骤 16 | 更新pip
17 | - python -m pip install --upgrade pip 18 | 19 | 安装依赖项
20 | - pip install -r requirement.txt 21 | 22 | 23 | -------------------------------------------------------------------------------- /url_gather/baidu_crawler.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import re 3 | import threading 4 | import time 5 | from bs4 import BeautifulSoup as bs 6 | from queue import Queue 7 | from argparse import ArgumentParser 8 | 9 | arg = ArgumentParser(description='baidu_url_collection') 10 | arg.add_argument('keyword',help='inurl:.asp?id=1') 11 | arg.add_argument('-p', '--page', help='page count', dest='pagecount', type=int) 12 | arg.add_argument('-t', '--thread', help='the thread_count', dest='thread_count', type=int, default=10) 13 | arg.add_argument('-o', '--outfile', help='the file save result', dest='outfile', default='result.txt') 14 | result = arg.parse_args() 15 | 16 | headers = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)'} 17 | 18 | class Bd_url(threading.Thread): 19 | def __init__(self, que): 20 | threading.Thread.__init__(self) 21 | self._que = que 22 | 23 | def run(self): 24 | while not self._que.empty(): 25 | URL = self._que.get() 26 | try: 27 | self.bd_url_collect(URL) 28 | except Exception as e: 29 | print ('Exception: ',e) 30 | pass 31 | 32 | def bd_url_collect(self, url): 33 | 34 | r = requests.get(url, headers=headers, timeout=5) 35 | 36 | soup = bs(r.content, 'lxml', from_encoding='utf-8') 37 | bqs = soup.find_all(name='a', attrs={'data-click':re.compile(r'.'), 'class':None}) 38 | for bq in bqs: 39 | 40 | r = requests.get(bq['href'], headers=headers, timeout=5) 41 | if r.status_code == 200: 42 | print(r.url) 43 | 44 | with open(result.outfile, 'a') as f: 45 | f.write(r.url + '\n') 46 | 47 | def main(): 48 | thread = [] 49 | thread_count = result.thread_count 50 | que = Queue() 51 | for i in range(0,(result.pagecount)): 52 | que.put('https://www.baidu.com/s?wd=' + result.keyword + '&pn=' + str(i)) 53 | 54 | for i in range(thread_count): 55 | thread.append(Bd_url(que)) 56 | 57 | for i in thread: 58 | i.start() 59 | 60 | for i in thread: 61 | i.join() 62 | 63 | if __name__ == '__main__': 64 | 65 | start = time.perf_counter() 66 | main() 67 | end = time.perf_counter() 68 | 69 | urlcount = len(open(result.outfile,'r').readlines()) 70 | 71 | with open(result.outfile, 'a') as f: 72 | f.write('--------use time:' + str(end-start) + '-----total url: ' + str(urlcount) + '----------------') 73 | 74 | 75 | print("total url: " + str(urlcount)) 76 | print(str(end - start) + "s") 77 | 78 | f.close() 79 | -------------------------------------------------------------------------------- /url_gather/bing_spider.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import re 3 | import time 4 | import threading 5 | from argparse import ArgumentParser 6 | from queue import Queue 7 | from lxml import etree 8 | 9 | headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0"} 10 | 11 | arg = ArgumentParser(description='bing_url_collection') 12 | arg.add_argument('keyword',help='inurl:.asp?id=1') 13 | arg.add_argument('-p','--page',help='page count',dest='pagecount',type=int) 14 | arg.add_argument('-t','--thread',help='the thread_count',dest='thread_count',type=int,default=10) 15 | arg.add_argument('-o','--outfile',help='the file save result',dest='outfile',default='bing_url.txt') 16 | result = arg.parse_args() 17 | 18 | class By_url(threading.Thread): 19 | def __init__(self,que): 20 | threading.Thread.__init__(self) # 继承 21 | self._que = que 22 | 23 | # run函数自动执行 24 | def run(self): 25 | while not self._que.empty(): 26 | URL = self._que.get() 27 | try: 28 | self.by_url_collect(URL) 29 | except Exception as e: 30 | print('Exception:',e) 31 | continue 32 | # /h2/a 33 | def by_url_collect(self,url): 34 | resp = requests.get(url,headers=headers,timeout=5) 35 | soup = etree.HTML(resp.text) 36 | #
10: 35 | print("cdn存在") 36 | else: 37 | print("cdn不存在") 38 | 39 | #端口扫描 40 | # ports = ['21','22','23','443','445','3389'] 41 | # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 42 | 43 | # for port in ports: 44 | # result = server.connect_ex((ip,int(port))) 45 | # if result == 0: 46 | # print('port %s open' %port) 47 | # else: 48 | # print('port %s close' %port) 49 | 50 | # whois查询 51 | def whois_check(url): 52 | data = whois.whois(url) 53 | print(data) 54 | 55 | # 保存数据 56 | def saveFile(url): 57 | with open('child.txt','a') as f: 58 | f.write(url+'\n') 59 | 60 | # 子域名查询 61 | def checkZym(url): 62 | try: 63 | # 200 301 302 64 | ip = socket.gethostbyname(url) 65 | print(url+' -> '+ip) 66 | saveFile(url) 67 | 68 | except Exception as e: 69 | #print("Error:",e) 70 | pass 71 | 72 | 73 | def readurlDic(domain): 74 | domain = domain.replace('http://','') 75 | domain = domain.replace('https://','') 76 | domain = domain.replace('www.','') 77 | 78 | for zym_data in open('dic.txt','r'): 79 | zym_data = zym_data.replace('\n', '') 80 | child_url = zym_data + '.' + domain 81 | url_list.append(child_url) 82 | 83 | def main(): 84 | check = sys.argv[1] 85 | if check == '-h' or check == '--help': 86 | usage() 87 | 88 | url = sys.argv[2] 89 | #print(sys.argv) 90 | readurlDic(url) 91 | if check == '-a' or check == '--all': 92 | searchIp(url) 93 | checkCdn(url) 94 | whois_check(url) 95 | for url in url_list: 96 | checkZym(url) 97 | #print(url_list) 98 | #checkZym(url) 99 | 100 | if check == '-w' or check == '--whois': 101 | whois_check(url) 102 | 103 | if check == '-i' or check == '--ip': 104 | searchIp(url) 105 | 106 | if check == '-c' or check == '--cdn': 107 | checkCdn(url) 108 | 109 | if check == '--child': 110 | with ThreadPoolExecutor(10) as t: 111 | for url in url_list: 112 | #print(url) 113 | t.submit(checkZym,url) 114 | 115 | if __name__ == '__main__': 116 | try: 117 | main() 118 | except Exception as e: 119 | usage() 120 | print(f'Error:({e}'+')') 121 | 122 | 123 | 124 | --------------------------------------------------------------------------------