├── .gitignore ├── data ├── cbd.xlsx └── cookies.json ├── img ├── html.png ├── slide.png ├── dataapi.png ├── dataapi1.png ├── iframe.png └── dataexcel.png ├── HtmlDataProcess ├── result.xlsx └── html_to_excel.py ├── requirements.txt ├── Pipfile ├── main_spider.py ├── readme.md ├── merchant_spider.py ├── data_process.py ├── ele_login.py └── Pipfile.lock /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ -------------------------------------------------------------------------------- /data/cbd.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Windy810/ElemeSpider/HEAD/data/cbd.xlsx -------------------------------------------------------------------------------- /img/html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Windy810/ElemeSpider/HEAD/img/html.png -------------------------------------------------------------------------------- /img/slide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Windy810/ElemeSpider/HEAD/img/slide.png -------------------------------------------------------------------------------- /img/dataapi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Windy810/ElemeSpider/HEAD/img/dataapi.png -------------------------------------------------------------------------------- /img/dataapi1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Windy810/ElemeSpider/HEAD/img/dataapi1.png -------------------------------------------------------------------------------- /img/iframe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Windy810/ElemeSpider/HEAD/img/iframe.png -------------------------------------------------------------------------------- /img/dataexcel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Windy810/ElemeSpider/HEAD/img/dataexcel.png -------------------------------------------------------------------------------- /HtmlDataProcess/result.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Windy810/ElemeSpider/HEAD/HtmlDataProcess/result.xlsx -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | certifi==2021.5.30 2 | charset-normalizer==2.0.4 3 | idna==3.2 4 | numpy==1.21.1 5 | pandas==1.3.1 6 | python-dateutil==2.8.2 7 | pytz==2021.1 8 | requests==2.26.0 9 | selenium==3.141.0 10 | six==1.16.0 11 | urllib3==1.26.6 12 | -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | selenium = "*" 8 | requests = "*" 9 | pandas = "*" 10 | 11 | [dev-packages] 12 | 13 | [requires] 14 | python_version = "3.7" 15 | -------------------------------------------------------------------------------- /main_spider.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2021/8/7 14:30 3 | # @FileName: main_spider.py 4 | # @Software: VSCode 5 | # @Comments: 饿了么爬虫,爬取商品信息|主函数 6 | 7 | import ele_login 8 | import merchant_spider 9 | import data_process 10 | 11 | if __name__=="__main__": 12 | # 自动登录并记录cookie 13 | ele_login.login_and_cookie_get() 14 | mycookie = ele_login.cookie_process() 15 | 16 | # 手动输入商家ID 17 | # ID格式为:E11239979582907458257 18 | inputid = input("请输入商家ID:") 19 | # 爬取信息 20 | merchant_spider.merchant_spider(inputid,mycookie) 21 | 22 | # 将爬取数据处理为excel格式 23 | data_process.json_to_excel() 24 | -------------------------------------------------------------------------------- /HtmlDataProcess/html_to_excel.py: -------------------------------------------------------------------------------- 1 | import re 2 | import pandas as pd 3 | 4 | #读取本地的html文件 5 | path=r"./cbd.html" 6 | fp = open(path,'rb') 7 | html = fp.read().decode('utf-8') 8 | 9 | #对html进行解析 10 | #([\s\S]*使用正则提取所有的字符串,?表示使用使用非贪婪模式 11 | goodslist=re.findall(r'([\s\S]*?)',html) 12 | #-?\d+\.?\d*e?-?\d*?提取所有的数字,包括小数 13 | # currentpricelist=re.findall(r'¥(-?\d+\.?\d*e?-?\d*?)',html) 14 | text=re.sub('\s+'," ",html) 15 | description=re.findall(r'

([\s\S]*?)

',text) 16 | # description=re.sub('\s+'," ",description) 17 | print(description) 18 | #将list转为datafarme 19 | goods=pd.DataFrame(goodslist) 20 | descriptions=pd.DataFrame(description) 21 | #横向拼接 22 | result=pd.concat([goods,descriptions],axis=1) 23 | #更改dataframe列名称 24 | result.columns=['商品名','描述信息'] 25 | #保存文件 26 | result.to_excel(r"./result.xlsx",index=None) -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # 饿了么商品信息爬虫 2 | 3 | ## 编写说明 4 | 5 | 详细编写及演示过程见博客:[饿了么爬虫](https://windy810.github.io/blog/2021-08-07-eleme/) 6 | 7 | ## 代码说明 8 | 9 | 1. 主目录下的脚本用于在已知[商家数据api名称](https://github.com/Windy810/ElemeSpider/blob/master/img/dataapi1.png)的情况下(如样例中为batch_shop),才能正常获取,如能找到其他类型商户的api,可以直接对url进行修改 10 | 2. 或者考虑第二种通用解法,登录获取页面html后,直接对html进行数据解析(见[/HtmlDataProcess](https://github.com/Windy810/ElemeSpider/tree/master/HtmlDataProcess)) 11 | 12 | ## 环境要求 13 | 14 | 1. python环境:python3.9 15 | 2. 运行环境:Linux(Debian) 16 | 3. 所需软件:selenium,chrome 17 | 18 | ## 环境安装 19 | 20 | 1. 下载chromedriver: 21 | `wget https://chromedriver.storage.googleapis.com/2.38/chromedriver_linux64.zip` 22 | 2. 解压到/usr/bin 23 | 3. 下载chrome: 24 | `wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb ` 25 | 4. 安装chrome: 26 | `dpkg -i google-chrome-stable_current_amd64.deb` 27 | 28 | ## 运行 29 | 30 | `python3 main_spider.py` 31 | -------------------------------------------------------------------------------- /merchant_spider.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2021/8/6 12:12 3 | # @FileName: merchant_spider.py 4 | # @Software: VSCode 5 | # @Comments: 饿了么爬虫,爬取商品信息|此函数用于爬取固定商家内商品信息 6 | 7 | import requests 8 | import json 9 | 10 | 11 | def merchant_spider(merchantID, mycookie): 12 | 13 | # 样例格式 14 | # merchantID = E11239979582907458257 15 | # mycookie = KQAAAAEesy9K7AAGDwBbLyKEmp8S7L5nCS8HfVsyodeBoyI9Ym_U0kFd 16 | url = 'https://h5.ele.me/pizza/shopping/restaurants/{m}/batch_shop'.format( 17 | m=merchantID) 18 | cookie = { 19 | 'SID': mycookie, 20 | } 21 | header = { 22 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 23 | 'Chrome/71.0.3578.98 Safari/537.36', 24 | 'Referer': 'https://h5.ele.me/pizza/shopping/restaurants/E14594189798467046744/batch_shop?user_id=4810026826&code=0.7331059914485989&extras=%5B%22activities%22%2C%22albums%22%2C%22license%22%2C%22identification%22%2C%22qualification%22%5D&terminal=h5&latitude=28.103027&longitude=112.99572', 25 | } 26 | response = requests.get(url, headers=header, cookies=cookie) 27 | 28 | # 将获取的值写入文件 29 | with open('./data/cbd.json', 'w') as f: 30 | f.write(json.dumps(response.json(), ensure_ascii=False)) 31 | -------------------------------------------------------------------------------- /data_process.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2021/8/7 13:44 3 | # @FileName: data_process.py 4 | # @Software: VSCode 5 | # @Comments: 饿了么爬虫,爬取商品信息|此脚本用于数据处理 6 | 7 | import json 8 | import pandas as pd 9 | 10 | 11 | def json_to_excel(): 12 | # 获取json数据 13 | with open("./data/cbd.json", "r") as f: 14 | load_data = json.load(f) 15 | 16 | # 定义商品类型及名字、描述、主要原料等 17 | menudata = load_data["menu"] 18 | foodname = [] 19 | fooddescription = [] 20 | foodmaterials = [] 21 | category = [] 22 | 23 | # 循环获取数据 24 | for i in menudata: 25 | foods = i["foods"] 26 | for j in foods: 27 | foodname.append(j["name"]) 28 | fooddescription.append(j["description"]) 29 | foodmaterials.append(j["materials"]) 30 | category.append(i["name"]) 31 | 32 | # 处理数据格式 33 | categorycol = pd.DataFrame(category) 34 | foodnamecol = pd.DataFrame(foodname) 35 | foodmaterialscol = pd.DataFrame(foodmaterials) 36 | # 横向拼接 37 | result = pd.concat( 38 | [categorycol, foodnamecol, foodmaterialscol], axis=1) 39 | # 更改dataframe列名称 40 | result.columns = ['所属类别', '商品名', '主要原料'] 41 | # 保存为excel文件 42 | result.to_excel(r"./data/cbd.xlsx", index=None) 43 | -------------------------------------------------------------------------------- /ele_login.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2021/8/7 13:04 3 | # @FileName: ele_login.py 4 | # @Software: VSCode 5 | # @Comments: 饿了么爬虫,爬取商品信息|此函数用于登录及cookie获取 6 | 7 | import json 8 | import time 9 | 10 | from selenium import webdriver 11 | from selenium.webdriver.support.ui import WebDriverWait 12 | from selenium.webdriver import ActionChains 13 | from selenium.webdriver.support import expected_conditions as EC 14 | 15 | def login_and_cookie_get(): 16 | # 设置selenium启动浏览器的配置项 17 | chrome_options = webdriver.ChromeOptions() 18 | chrome_options.add_argument("--no-sandbox") 19 | chrome_options.add_argument("--disable-blink-features=AutomationControlled") 20 | # 反反爬虫:掩盖selenium浏览器指纹,可在控制台通过window.navigator.webdriver查看得false 21 | chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) 22 | # chrome升级至v59以后,可用如下headless的方式使得不显示浏览器界面 23 | # chrome_options.add_argument('--headless') 24 | # chrome_options.add_argument('--disable-gpu') 25 | driver = webdriver.Chrome(chrome_options=chrome_options) 26 | 27 | # 隐式等待 28 | driver.implicitly_wait(10) 29 | # 设置需访问的界面 30 | driver.get("https://tb.ele.me/wow/msite/act/login") 31 | 32 | # 等到登录页面出现再操作 33 | WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it("alibaba-login-box")) 34 | # print(driver.page_source) 35 | 36 | # 获取并自动填充手机号 37 | phone = driver.find_element_by_xpath('//input[@id="fm-sms-login-id"]') 38 | phonenumber = input('请输入手机号,回车键确认:') 39 | phone.send_keys(phonenumber) 40 | 41 | # 发送验证码按钮 42 | driver.find_element_by_xpath("//a[@class='send-btn-link']").click() 43 | 44 | # 以前的协议同意按钮 45 | # driver.find_element_by_css_selector("input[@id='fm-agreement-checkbox']").click() 46 | 47 | # 验证码发送前的滑块验证 48 | WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it("baxia-dialog-content")) 49 | fuck=driver.find_element_by_xpath('//span[@id="nc_2_n1z"]') 50 | action =ActionChains(driver) 51 | action.click_and_hold(fuck) 52 | action.move_by_offset(300,0) 53 | action.release().perform() 54 | 55 | # 验证码输入及填充 56 | # 此次需返回父级iframe,才能获取到验证码输入等元素 57 | vali = input('请输入验证码,回车键确认:') 58 | driver.switch_to.parent_frame() 59 | driver.find_element_by_xpath('//input[@id="fm-smscode"]').send_keys(vali) 60 | # 点击登录 61 | driver.find_element_by_xpath("//button[@type='submit']").click() 62 | 63 | # 应该是之前的滑块速度问题或者是浏览器指纹导致需要二次滑块验证 64 | time.sleep(3) 65 | WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it("baxia-dialog-content")) 66 | fuck=driver.find_element_by_xpath('//span[@id="nc_2_n1z"]') 67 | action =ActionChains(driver) 68 | action.click_and_hold(fuck) 69 | action.move_by_offset(280,0) 70 | action.release().perform() 71 | 72 | # 再次点击登录 73 | driver.switch_to.parent_frame() 74 | driver.find_element_by_xpath("//button[@type='submit']").click() 75 | 76 | # 获取cookie并写入cookies.json文件 77 | time.sleep(5) 78 | #获取cookie 79 | dictCookies=driver.get_cookies() 80 | #json字符串编码 81 | jsonCookies=json.dumps(dictCookies) 82 | with open('./data/cookies.json','w')as f: 83 | f.write(jsonCookies) 84 | print('cookie加载完毕') 85 | 86 | def cookie_process(): 87 | with open("./data/cookies.json","r") as f: 88 | load_data = json.load(f) 89 | for i in load_data: 90 | if(i["name"]=="SID"): 91 | mycookie = i["value"] 92 | return mycookie 93 | # print(cookies) -------------------------------------------------------------------------------- /data/cookies.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "domain": ".ele.me", 4 | "expiry": 1643865473, 5 | "httpOnly": false, 6 | "name": "tfstk", 7 | "path": "/", 8 | "secure": false, 9 | "value": "cpDPBg2KS1BXzL2B68weFUuz6NfRZgioxtr_Zj3T5WTwSkVlip_LmHr30ka9n7f.." 10 | }, 11 | { 12 | "domain": ".ele.me", 13 | "expiry": 1643865473, 14 | "httpOnly": false, 15 | "name": "l", 16 | "path": "/", 17 | "secure": false, 18 | "value": "eBSeqrCVgL-PaD2QBOfwourza77OSIRAguPzaNbMiOCP_71M56YCB6hECXYHC3GOh6opR3Jg7Ec7BeYBYS4WfLwGhm8WYHkmn" 19 | }, 20 | { 21 | "domain": ".ele.me", 22 | "expiry": 1659878272.430934, 23 | "httpOnly": true, 24 | "name": "USERID", 25 | "path": "/", 26 | "secure": true, 27 | "value": "4810026826" 28 | }, 29 | { 30 | "domain": ".ele.me", 31 | "expiry": 1659878272.430926, 32 | "httpOnly": true, 33 | "name": "SID", 34 | "path": "/", 35 | "secure": true, 36 | "value": "KQAAAAEesy9K7AAGTQBfVBOs8OJQrosOXiOu2SEjjYsXu_kq48I9cRKh" 37 | }, 38 | { 39 | "domain": ".ele.me", 40 | "expiry": 1628947072.430916, 41 | "httpOnly": false, 42 | "name": "unb", 43 | "path": "/", 44 | "secure": true, 45 | "value": "2205936855488" 46 | }, 47 | { 48 | "domain": ".ele.me", 49 | "httpOnly": false, 50 | "name": "csg", 51 | "path": "/", 52 | "secure": true, 53 | "value": "2c05d338" 54 | }, 55 | { 56 | "domain": ".ele.me", 57 | "httpOnly": true, 58 | "name": "cookie2", 59 | "path": "/", 60 | "secure": true, 61 | "value": "14133959021d41bc0484fd6f6ab39a79" 62 | }, 63 | { 64 | "domain": ".ele.me", 65 | "httpOnly": true, 66 | "name": "_samesite_flag_", 67 | "path": "/", 68 | "secure": true, 69 | "value": "true" 70 | }, 71 | { 72 | "domain": ".ele.me", 73 | "expiry": 1643865473, 74 | "httpOnly": false, 75 | "name": "isg", 76 | "path": "/", 77 | "secure": true, 78 | "value": "BLy8zD2j8UGFy8UdUUU9P7iIjVNutWDfRPiUUZY9yKeKYVzrvsUwbzJTRYMZKZg3" 79 | }, 80 | { 81 | "domain": ".ele.me", 82 | "expiry": 1659849474.35583, 83 | "httpOnly": true, 84 | "name": "x5check_ele", 85 | "path": "/", 86 | "secure": false, 87 | "value": "VbpcrkLnAG4fkr0lszEEJXnN7QxQ7bD0Q3OOC7aQXaI%3D" 88 | }, 89 | { 90 | "domain": ".ele.me", 91 | "httpOnly": false, 92 | "name": "_tb_token_", 93 | "path": "/", 94 | "secure": true, 95 | "value": "e3033b5ebbe6b" 96 | }, 97 | { 98 | "domain": ".ele.me", 99 | "expiry": 1659878272.430894, 100 | "httpOnly": true, 101 | "name": "t_eleuc4", 102 | "path": "/", 103 | "secure": true, 104 | "value": "id4=0%40BA%2FvuHCrrRj%2BqQmqsr0TJZMhpYT0gH%2FsfrHBzA%3D%3D" 105 | }, 106 | { 107 | "domain": ".ele.me", 108 | "expiry": 1628399849, 109 | "httpOnly": false, 110 | "name": "xlly_s", 111 | "path": "/", 112 | "secure": true, 113 | "value": "1" 114 | }, 115 | { 116 | "domain": ".ele.me", 117 | "expiry": 4070880000, 118 | "httpOnly": false, 119 | "name": "ubt_ssid", 120 | "path": "/", 121 | "secure": false, 122 | "value": "z7iyyi3ulnfjdkkhxzil5uzdissqoiwn_2021-08-07" 123 | }, 124 | { 125 | "domain": ".ele.me", 126 | "expiry": 1628947072.430903, 127 | "httpOnly": false, 128 | "name": "munb", 129 | "path": "/", 130 | "secure": true, 131 | "value": "2205936855488" 132 | }, 133 | { 134 | "domain": ".ele.me", 135 | "expiry": 1659878272.430941, 136 | "httpOnly": false, 137 | "name": "UTUSER", 138 | "path": "/", 139 | "secure": true, 140 | "value": "4810026826" 141 | }, 142 | { 143 | "domain": ".ele.me", 144 | "expiry": 1935928650.459585, 145 | "httpOnly": false, 146 | "name": "t", 147 | "path": "/", 148 | "secure": true, 149 | "value": "7637dec5874f0f8bd9cc147ef2bcec8f" 150 | }, 151 | { 152 | "domain": ".ele.me", 153 | "expiry": 2259033449, 154 | "httpOnly": false, 155 | "name": "cna", 156 | "path": "/", 157 | "secure": true, 158 | "value": "aAWVGdq23G8CAXjkfJXiU9Wh" 159 | }, 160 | { 161 | "domain": ".h5.ele.me", 162 | "expiry": 4070880000, 163 | "httpOnly": false, 164 | "name": "perf_ssid", 165 | "path": "/", 166 | "secure": false, 167 | "value": "6cy45kek3zuh3ci2njb6fk4a6qn14mor_2021-08-07" 168 | }, 169 | { 170 | "domain": "h5.ele.me", 171 | "expiry": 1643865448.820461, 172 | "httpOnly": false, 173 | "name": "__wpkreporterwid_", 174 | "path": "/shop", 175 | "secure": false, 176 | "value": "b574c9f7-5d90-4efc-154a-583bf4968f2c" 177 | } 178 | ] -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "5ea663381429b202e0e6e9daab1522a0c312c376c8138a7d48a3c91cfe3b8e22" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.7" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "certifi": { 20 | "hashes": [ 21 | "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee", 22 | "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8" 23 | ], 24 | "version": "==2021.5.30" 25 | }, 26 | "charset-normalizer": { 27 | "hashes": [ 28 | "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b", 29 | "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3" 30 | ], 31 | "markers": "python_version >= '3'", 32 | "version": "==2.0.4" 33 | }, 34 | "idna": { 35 | "hashes": [ 36 | "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a", 37 | "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3" 38 | ], 39 | "markers": "python_version >= '3'", 40 | "version": "==3.2" 41 | }, 42 | "numpy": { 43 | "hashes": [ 44 | "sha256:01721eefe70544d548425a07c80be8377096a54118070b8a62476866d5208e33", 45 | "sha256:0318c465786c1f63ac05d7c4dbcecd4d2d7e13f0959b01b534ea1e92202235c5", 46 | "sha256:05a0f648eb28bae4bcb204e6fd14603de2908de982e761a2fc78efe0f19e96e1", 47 | "sha256:1412aa0aec3e00bc23fbb8664d76552b4efde98fb71f60737c83efbac24112f1", 48 | "sha256:25b40b98ebdd272bc3020935427a4530b7d60dfbe1ab9381a39147834e985eac", 49 | "sha256:2d4d1de6e6fb3d28781c73fbde702ac97f03d79e4ffd6598b880b2d95d62ead4", 50 | "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50", 51 | "sha256:4a3d5fb89bfe21be2ef47c0614b9c9c707b7362386c9a3ff1feae63e0267ccb6", 52 | "sha256:635e6bd31c9fb3d475c8f44a089569070d10a9ef18ed13738b03049280281267", 53 | "sha256:73101b2a1fef16602696d133db402a7e7586654682244344b8329cdcbbb82172", 54 | "sha256:791492091744b0fe390a6ce85cc1bf5149968ac7d5f0477288f78c89b385d9af", 55 | "sha256:7a708a79c9a9d26904d1cca8d383bf869edf6f8e7650d85dbc77b041e8c5a0f8", 56 | "sha256:88c0b89ad1cc24a5efbb99ff9ab5db0f9a86e9cc50240177a571fbe9c2860ac2", 57 | "sha256:8a326af80e86d0e9ce92bcc1e65c8ff88297de4fa14ee936cb2293d414c9ec63", 58 | "sha256:8a92c5aea763d14ba9d6475803fc7904bda7decc2a0a68153f587ad82941fec1", 59 | "sha256:91c6f5fc58df1e0a3cc0c3a717bb3308ff850abdaa6d2d802573ee2b11f674a8", 60 | "sha256:95b995d0c413f5d0428b3f880e8fe1660ff9396dcd1f9eedbc311f37b5652e16", 61 | "sha256:9749a40a5b22333467f02fe11edc98f022133ee1bfa8ab99bda5e5437b831214", 62 | "sha256:978010b68e17150db8765355d1ccdd450f9fc916824e8c4e35ee620590e234cd", 63 | "sha256:9a513bd9c1551894ee3d31369f9b07460ef223694098cf27d399513415855b68", 64 | "sha256:a75b4498b1e93d8b700282dc8e655b8bd559c0904b3910b144646dbbbc03e062", 65 | "sha256:c6a2324085dd52f96498419ba95b5777e40b6bcbc20088fddb9e8cbb58885e8e", 66 | "sha256:d7a4aeac3b94af92a9373d6e77b37691b86411f9745190d2c351f410ab3a791f", 67 | "sha256:d9e7912a56108aba9b31df688a4c4f5cb0d9d3787386b87d504762b6754fbb1b", 68 | "sha256:dff4af63638afcc57a3dfb9e4b26d434a7a602d225b42d746ea7fe2edf1342fd", 69 | "sha256:e46ceaff65609b5399163de5893d8f2a82d3c77d5e56d976c8b5fb01faa6b671", 70 | "sha256:f01f28075a92eede918b965e86e8f0ba7b7797a95aa8d35e1cc8821f5fc3ad6a", 71 | "sha256:fd7d7409fa643a91d0a05c7554dd68aa9c9bb16e186f6ccfe40d6e003156e33a" 72 | ], 73 | "markers": "python_version >= '3.7'", 74 | "version": "==1.21.1" 75 | }, 76 | "pandas": { 77 | "hashes": [ 78 | "sha256:0c976e023ed580e60a82ccebdca8e1cc24d8b1fbb28175eb6521025c127dab66", 79 | "sha256:114c6789d15862508900a25cb4cb51820bfdd8595ea306bab3b53cd19f990b65", 80 | "sha256:1ee8418d0f936ff2216513aa03e199657eceb67690995d427a4a7ecd2e68f442", 81 | "sha256:22f3fcc129fb482ef44e7df2a594f0bd514ac45aabe50da1a10709de1b0f9d84", 82 | "sha256:23c7452771501254d2ae23e9e9dac88417de7e6eff3ce64ee494bb94dc88c300", 83 | "sha256:341935a594db24f3ff07d1b34d1d231786aa9adfa84b76eab10bf42907c8aed3", 84 | "sha256:45656cd59ae9745a1a21271a62001df58342b59c66d50754390066db500a8362", 85 | "sha256:527c43311894aff131dea99cf418cd723bfd4f0bcf3c3da460f3b57e52a64da5", 86 | "sha256:5c09a2538f0fddf3895070579082089ff4ae52b6cb176d8ec7a4dacf7e3676c1", 87 | "sha256:5d9acfca191140a518779d1095036d842d5e5bc8e8ad8b5eaad1aff90fe1870d", 88 | "sha256:5ee927c70794e875a59796fab8047098aa59787b1be680717c141cd7873818ae", 89 | "sha256:7150039e78a81eddd9f5a05363a11cadf90a4968aac6f086fd83e66cf1c8d1d6", 90 | "sha256:905fc3e0fcd86b0a9f1f97abee7d36894698d2592b22b859f08ea5a8fe3d3aab", 91 | "sha256:9d06661c6eb741ae633ee1c57e8c432bb4203024e263fe1a077fa3fda7817fdb", 92 | "sha256:9e1fe6722cbe27eb5891c1977bca62d456c19935352eea64d33956db46139364", 93 | "sha256:be12d77f7e03c40a2466ed00ccd1a5f20a574d3c622fe1516037faa31aa448aa", 94 | "sha256:c28760932283d2c9f6fa5e53d2f77a514163b9e67fd0ee0879081be612567195", 95 | "sha256:e323028ab192fcfe1e8999c012a0fa96d066453bb354c7e7a4a267b25e73d3c8", 96 | "sha256:fdb3b33dde260b1766ea4d3c6b8fbf6799cee18d50a2a8bc534cf3550b7c819a" 97 | ], 98 | "index": "pypi", 99 | "version": "==1.3.1" 100 | }, 101 | "python-dateutil": { 102 | "hashes": [ 103 | "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", 104 | "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" 105 | ], 106 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 107 | "version": "==2.8.2" 108 | }, 109 | "pytz": { 110 | "hashes": [ 111 | "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da", 112 | "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798" 113 | ], 114 | "version": "==2021.1" 115 | }, 116 | "requests": { 117 | "hashes": [ 118 | "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", 119 | "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" 120 | ], 121 | "index": "pypi", 122 | "version": "==2.26.0" 123 | }, 124 | "selenium": { 125 | "hashes": [ 126 | "sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c", 127 | "sha256:deaf32b60ad91a4611b98d8002757f29e6f2c2d5fcaf202e1c9ad06d6772300d" 128 | ], 129 | "index": "pypi", 130 | "version": "==3.141.0" 131 | }, 132 | "six": { 133 | "hashes": [ 134 | "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", 135 | "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" 136 | ], 137 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 138 | "version": "==1.16.0" 139 | }, 140 | "urllib3": { 141 | "hashes": [ 142 | "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4", 143 | "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f" 144 | ], 145 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", 146 | "version": "==1.26.6" 147 | } 148 | }, 149 | "develop": {} 150 | } 151 | --------------------------------------------------------------------------------