Python实训day07am【爬取数据接口、webdriver、自动化测试工具selenium】
- Python實訓-15天-博客匯總表
目錄
1、網絡爬蟲-課后練習題
1.1、寫法1
1.2、寫法2
2、Selenium自動化測試工具
2.1、安裝工具
2.2、命令行操作
今天:
1、網絡爬蟲-課后練習題
爬蟲技巧 + 基礎編程能力(對數(shù)據的處理)
課后習題:爬取并分析汽油價格
網址:東方財富網-油價模塊? ?https://data.eastmoney.com/cjsj/oil_default.html
? ??
要求:
1、爬取所有汽油價格變動信息(2000-06-06至今)
2、一共漲價多少次,降價多少次
3、哪個時間段油價是最便宜的 (開始和結束的年月日)
4、哪個時間段油價是最貴的(開始和結束的年月日)
5、油價停留在2000-3000元之間的有多長時間(天數(shù))
(一小時內,看是否能完成)
提示:
接口地址:
https://datacenter-web.eastmoney.com/api/data/get?type=RPTA_WEB_YJ_BD&sty=ALL&st=dim_date&sr=-1&p=2&ps=10
? ? #2為頁碼
1.1、寫法1
''' 爬取并分析汽油價格 網址:東方財富網 - 油價模塊 https://data.eastmoney.com/cjsj/oil_default.html 要求: 1.爬取所有汽油價格變動信息(2000-06-06~至今)。 2.一共漲價多少次,降價多少次。 3.哪個時間段油價是最便宜的(開始和結束的年月日)。 4.哪個時間段油價是最貴的(開始和結束的年月日)。 5.油價停留在2000-3000元之間的有多長時間(天數(shù))。 ''' import requests as req import json import datetimehds = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'} url = 'https://datacenter-web.eastmoney.com/api/data/get?type=RPTA_WEB_YJ_BD&sty=ALL&st=dim_date&sr=-1&p={}&ps=10';infos = [];# 1.爬取所有汽油價格變動信息(2000-06-06~至今)。 for i in range(23):resp = req.get(url.format(i + 1), headers=hds)ls = json.loads(resp.content.decode('utf-8'))['result']['data'];for l in ls:r = [l['dim_date'], l['value'], l['qy_fd']]; # ['2021-07-13 00:00:00',8120,70] ;infos.append(r);print(len(infos)) print(infos)infos[-1][2] = 0; # 將最后一個None值,設為0 # ['2022-01-01 00:00:00', 8130, 140], ['2021-12-18 00:00:00', 7990, -130], # ['2021-12-04 00:00:00', 8120, -430], ['2021-11-20 00:00:00', 8550, -95], # ['2021-10-23 00:00:00', 8645, 300], ['2021-10-10 00:00:00', 8345, 345]# filter來實現(xiàn)也可以 ct_up = 0; ct_down = 0;for info in infos:if info[2] > 0:ct_up = ct_up + 1;elif info[2] < 0:ct_down = ct_down + 1;# 2.一共漲價多少次,降價多少次。 print('漲價次數(shù):', ct_up) print('降價次數(shù):', ct_down)ps = [x[1] for x in infos]; # 將所有的油價提取出來# 3.哪個時間段油價是最便宜的(開始和結束的年月日)。 minprice = min(ps); # 找到油價最低的值 print('最低價:', minprice); print('最低價日期范圍:', end='') for i, info in enumerate(infos): # 既能得到下標i,又能得到元素本身if info[1] == minprice:if i == 0: # 更嚴謹print(info[0], '~ 至今');else:print(info[0], '~', infos[i - 1][0]);# 4.哪個時間段油價是最貴的(開始和結束的年月日)。 maxprice = max(ps); # 找到油價最高的值 print('最高價:', maxprice); print('最高價日期范圍:', end='') for i, info in enumerate(infos): # 既能得到下標i,又能得到元素本身if info[1] == maxprice:if i == 0: # 更嚴謹print(info[0], '~ 至今');else:print(info[0], '~', infos[i - 1][0]);def days(startstr, endstr):start = datetime.datetime.strptime(startstr[:10], '%Y-%m-%d').date();end = datetime.datetime.strptime(endstr[:10], '%Y-%m-%d').date();return (end - start).days;# 5.油價停留在2000-3000元之間的有多長時間(天數(shù))。 infos.reverse(); # 倒序 # print(infos) totalsum = 0; for i, info in enumerate(infos):if info[1] >= 2000 and info[1] <= 3000:ds = days(info[0], infos[i + 1][0]);totalsum = totalsum + ds;print('總天數(shù):', totalsum);# 有思路(編程思維) + 有辦法(積極百度)1.2、寫法2
''' 爬取并分析汽油價格 網址:東方財富網 - 油價模塊 https://data.eastmoney.com/cjsj/oil_default.html 要求: 1.爬取所有汽油價格變動信息(2000-06-06~至今)。 2.一共漲價多少次,降價多少次。 3.哪個時間段油價是最便宜的(開始和結束的年月日)。 4.哪個時間段油價是最貴的(開始和結束的年月日)。 5.油價停留在2000-3000元之間的有多長時間(天數(shù))。 ''' import datetime import json import sysimport requestsdef daytime(str1, str2):d1 = datetime.date(int(str1[0:4]), int(str1[5:7]), int(str1[8:10]))d2 = datetime.date(int(str2[0:4]), int(str2[5:7]), int(str2[8:10]))return (d1 - d2).days# 爬取數(shù)據接口,得到數(shù)據 hds = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}url = 'https://datacenter-web.eastmoney.com/api/data/get?callback=&type=RPTA_WEB_YJ_BD&sty=ALL&st=dim_date&sr=-1&token=894050c76af8597a853f5b408b759f5d&p=1&ps=250&source=WEB&_=1641888888471'resp = requests.get(url, headers=hds)ct = resp.content.decode('utf-8')ct = json.loads(ct) ls = list(ct["result"]["data"]) ls = list(reversed(ls)) # print(ls)count_rise = 0 count_drop = 0qy_expensive = -sys.maxsize - 1 qy_cheap = sys.maxsizefor i in ls:print('時間:' + str(i['dim_date']) + '汽油價格:' + str(i['value']))if i['qy_fd'] is not None:if i['qy_fd'] > 0:count_rise += 1if i['qy_fd'] < 0:count_drop += 1if i['value'] > qy_expensive:qy_expensive = i['value']if i['value'] < qy_cheap:qy_cheap = i['value']print('上漲次數(shù):' + str(count_rise)) print('降價次數(shù):' + str(count_drop))for i, j in zip(ls, ls[1:]):if i['value'] == qy_expensive:print('最貴的價格:' + str(qy_expensive))print('最貴的時候是:' + i['dim_date'] + '到' + j['dim_date']) for i, j in zip(ls, ls[1:]):if i['value'] == qy_cheap:print('最便宜的價格:' + str(qy_cheap))print('最便宜的時候是:' + i['dim_date'] + '到' + j['dim_date']) days = 0 for i, j in zip(ls, ls[1:]):if 3000 >= i['value'] >= 2000:days += daytime(j['dim_date'], i['dim_date'])print('油價停留在2000-3000元之間的天數(shù):' + str(days))2、Selenium自動化測試工具
2.1、安裝工具
使用Selenium自動化測試工具
1、需要安裝自動化測試庫:pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/
2、下載安裝一下Chrome瀏覽器
3、查看一下瀏覽器版本:
? ? ? 版本 97.0.4692.71 (我的版本)
? ? ? 根據版本下載對應的 chromedriver ? (selenium中需要調用,跟你日常使用沒關系)
? ? ? 網址:http://npm.taobao.org/mirrors/chromedriver/
4、將chromedriver.zip解壓縮,得到chromedriver.exe文件,將該文件放入到python安裝目錄。
? ? ? 將解壓好的chromedriver.exe放入到anaconda的安裝目錄
selenium:可以通過代碼來控制瀏覽器,點擊、輸入、前進、后腿、打開、關閉、訪問網址等。
安裝命令:pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/
?
查看谷歌瀏覽器版本:
下載地址:ChromeDriver Mirror
?
?
將解壓好的chromedriver.exe放入到anaconda的安裝目錄,也就是和python.exe在同一個文件夾中。
可以通過where python來查看Python的安裝目錄。
?
2.2、命令行操作
from selenium import webdriver# 啟動 bw = webdriver.Chrome(); # bw對象,就代表你的瀏覽器窗口 # 注意,如果殺毒軟件有彈窗攔截,請點擊“允許”(永久允許) # 版本和路徑都正確,才能開啟瀏覽器。# 訪問路徑 bw.get("https://www.baidu.com"); # # 注意,沒有返回值;所有的數(shù)據變動,都體現(xiàn)在bw對象本身。# 獲取頁面內容 # 定位元素:find_elements_by_css_selector('選擇器')--->相當于 select('選擇器') sa = bw.find_elements_by_css_selector('.hotsearch-item a') print(len(sa)); # 獲取元素內容:.text---->get_text() # 獲取元素屬性:.get_attribute("屬性名")--->['屬性名']for a in sa:print(a.text);# 實現(xiàn)點擊 # 定位元素 調用click即可# 關閉 bw.close()>>> from selenium import webdriver
>>> # 啟動瀏覽器
>>> bw = webdriver.Chrome();
?
??
?
?
PyCharm導入selenium:
?
總結
以上是生活随笔為你收集整理的Python实训day07am【爬取数据接口、webdriver、自动化测试工具selenium】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python实训day06pm【网络爬虫
- 下一篇: Python实训day07pm【Sele