python 怎么爬桌软件数据_如何利用Python爬取并分析红岭创投的数据?
第一步:爬取數據
通過 selenium + Firefox 的無頭模式將需要的數據爬取出來,代碼實現不在贅述,詳細步驟可查看我的上一篇圖文(如何利用Python爬取網易新聞), 由于 selenium3.11.0 版本已經停止對 phantomjs 的支持,現在可以使用 chrome 和 firefox 的無頭模式實現該功能。
打開無頭模式:from?selenium.webdriver.firefox.options?import?Options
firefox_options=webdriver.FirefoxOptions()
firefox_options.add_argument("--headless")
firefox_options.add_argument("--disable-gpu")
一個疑問:
使用 ubuntu 的 crontab 定時任務運行此爬蟲腳本時,如果不打開無頭模式,報錯如下:selenium.comm.exception.WebDriverException:message:invalid?argument?:can't?kill?an?exited?process
沒能理解這個報錯的原因,希望與大家一起討論。
第二步:存儲數據
數據庫這次選擇了 Mysql,首先需要建立自己的數據庫,建立相應表格,這里推薦使用 ?Navicat,能夠將數據庫操作圖形化。Navicat 需要做一些配置,網上有大量教程,建表時需要注意類型,選擇正確的類型在后續使用時會減少很多麻煩,例如:
VARCHAR和CHAR類型
varchar適用場景:字符串列的最大長度比平均長度大很多
字符串列很少被更新
使用了多字節字符集存儲字符串(如utf8中的中文和英文)
char適用場景:存儲長度近似的值(md5值,如密碼)
存儲短字符串
存儲經常被更新的字符串列
日期類型
TIMESTAMP類型:以yyyy-MM-dd HH:mm:ss格式顯示,占用4個字節
時間范圍:1970-1-1 到 2038-01-19
DATATIME類型:以yyyy-MM-dd HH:mm:ss格式顯示,占用8個字節
時間范圍:1000-1-1 00:00:00至9999-12-31 23:59:59
插入數據db=pymysql.connect(host='localhost',user='root',password='xxxx',db='hlct',charset='utf8')
sql="INSERT?INTO?data_1?VALUES('"?+?dic['借款人']?+?"','"?+dic['時間']\
+?"','"?+?dic['借款金額'].replace(',',?'')+?"','"?+?dic['利率']?+\
"','"?+?dic['期限']?+?"','"?+?dic['還款方式']?+?"');"
cursor?=db.cursor()??#獲取操作游標
cursor.execute(sql)??#執行sql語句
db.commit()??????????#提交到數據庫執行
db.close()
此時,數據已經靜悄悄的待在數據庫中了。img01
第三步:利用echarts將數據可視化作圖
針對這次的目標,折線圖是最好的展現數據方式。數據庫原始數據需要做出一定處理,根據具體用途處理就好。import?pyecharts_snapshot
from?datetime?import?datetime?,date,?timedelta
from?pyecharts?import?Linedef?rLine(y_rate):
x_axis?=["00",?"01",?"02",?"03",?"04",?"05",?"06",?"07",
"08",?"09",?"10"?,"11","12",?"13",?"14",?"15",?"16",?"17",?"18",?"19",
"20",?"21","22","23"]
aver=[];max=[];min=[]
for?y?in?y_rate:
aver.append(y[0])
max.append(y[1])
min.append(y[2])
line?=?Line("紅嶺創投利率曲線"'('+Date+')')
line.use_theme("dark")
line.add("最高利率",?x_axis=x_axis,y_axis=max,yaxis_max=9,
yaxis_min=8,yaxis_force_interval=0.1,
yaxis_formatter='%')
line.render(path='/home/lsgo18/PycharmProjects/honglingchuangtou/rate.png')x_axis:橫軸數據
y_axis:縱軸數據
line.add():添加數據作圖
yaxis_max:設置縱軸刻度范圍
yaxis_force_interval:設置刻度精度
line.use_theme:主題顏色
line.render():生成文件
img02img03
第四步:crontab定時任務
觀察了紅嶺創投網站一段時間后,發現只能顯示近十分鐘左右的即時數據,不可能每過幾分鐘手動點擊程序運行,團隊的小伙伴向我推薦了一個非常好用的指令crontab,crontab 是用來讓使用者在固定時間或固定間隔執行程序之用,換句話說,也就是類似使用者的時程表,并且在后臺運行,不會打擾到我們的學習和工作。
打開crontab:sudo?vim?/etc/cronta
界面如下(通過vim打開)img04
基本格式**???*???*???*???command
分??時??日??月??周??命令第1列表示分鐘1~59 每分鐘用*或者 */1表示
第2列表示小時1~23(0表示0點)
第3列表示日期1~31
第4列表示月份1~12
第5列標識號星期0~6(0表示星期天)
第6列要運行的命令
通常需要將 python 環境絕對路徑,程序絕對路徑寫入命令,保證能正常運行。如果 crontab沒有運行,大概率的原因就在此,圖中倒數第四行黃色部分就是運行爬蟲的指令,最后/auto.log部分是輸出日志,將每一次運行的結果寫進日志文件,以便檢查運行情況。
第五步:smtplib 發送郵件
每天處理數據做出折線圖后,將圖片發送給團隊老大,smtplib 是不錯的選擇,結合crontab就能每天自動運行,成就感超強。import?smtplib
from?email?import?encoders
from?email.header?import?Header
from?email.mime.text?import?MIMEText
from?email.mime.base?import?MIMEBase
from?email.mime.multipart?import?MIMEMultipart
from?email.utils?import?parseaddr,?formataddrdef?send(self):
from_addr?=?"74400xxxx@qq.com"??#?發件人?Email?地址和口令
password?=?"xxxxxxx"
smtp_server?=?"smtp.qq.com"??#?SMTP?服務器地址
to_addr?=?"xxxx@qq.com"??#?收件人地址
#?郵件頭
msg?=?MIMEMultipart()#代表郵件本身
msg['From']?=?self._format_addr('lsgo?'?%?from_addr)
msg['To']?=?self._format_addr('lsgo?'?%?to_addr)
msg['Subject']?=?Header('紅嶺創投',?'utf-8').encode()??#?標題
#?郵件正文
#?msg.attach(MIMEText('……',?'plain',?'utf-8'))
#?添加附件
self.addfile(msg)
try:
server?=?smtplib.SMTP(smtp_server,?25)
server.set_debuglevel(1)
server.starttls()
server.login(from_addr,?password)
server.sendmail(from_addr,?[to_addr],?msg.as_string())
server.quit()
print("郵件發送成功")
except?smtplib.SMTPException:
self.send()
print("Error:?發送郵件失敗,正在重試!")
在郵件中添加附件:def?_format_addr(self,s):
name,?addr=parseaddr(s)
return?formataddr((Header(name,'utf-8').encode(),addr))
def?_getfile(self):
file='/home/lsgo18/PycharmProjects/honglingchuangtou/'
return?[file+'money.png',file+'rate.png']
def?addfile(self,msg):
files=self._getfile()
#設置附件的MIME和文件名
attr1?=?MIMEBase('image',?'png',?filename='file.png')
#必要的頭信息
attr1.add_header('Content-Disposition',?'attachment',?filename=files[0][-9:])
attr1.add_header('Content-ID',?'<0>')
attr1.add_header('X-Attachment-Id',?'0')
#讀取附件內容
attr1.set_payload(open(files[0],?'rb+').read())
#用Base64編碼
encoders.encode_base64(attr1)
#添加到MIMEMuptipart
msg.attach(attr1)
#?附件2
attr2?=?MIMEBase('image',?'png',?filename='file.png')
attr2.add_header('Content-Disposition',?'attachment',filename=files[1][-8:])
attr2.add_header('Content-ID',?'<0>')
attr2.add_header('X-Attachment-Id',?'0')
attr2.set_payload(open(files[1],?'rb').read())
encoders.encode_base64(attr2)
msg.attach(attr2)
到這里,任務就全部搞定了。怎么樣,感興趣的同學也可以按照思路來玩一下。今天就到這里吧,See You!
本篇圖文由團隊 余江銀 同學提供,他的 CSDN Blog 地址為:
https://blog.csdn.net/YYYYYJY
總結
以上是生活随笔為你收集整理的python 怎么爬桌软件数据_如何利用Python爬取并分析红岭创投的数据?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 取input 输入_tensorRT动态
- 下一篇: kettle获取当前日期_kettle中