存儲數(shù)據(jù)
如果你需要一個快速簡單的方法收集網(wǎng)上的文檔饱苟,然后存到你的硬盤里孩擂,那么可能需要創(chuàng)建一個文件流( file stream) 來實現(xiàn)。如果還要為偶然事件提個醒兒箱熬,或者每天定時收集當天累計的數(shù)據(jù)类垦,就給自己發(fā)一封郵件吧!
1.媒體文件
存儲媒體文件有兩種主要的方式:只獲取文件URL鏈接城须,或者直接把源文件下載下來蚤认。
urllib.request.urlretrieve 可以根據(jù)文件的 URL 下載文件
//這段程序從 http://pythonscraping.com 下載 logo 圖片,然后在程序運行的文件夾里保存為logo.jpg 文件糕伐。
from urllib.request import urlretrieve
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com")
bsObj = BeautifulSoup(html)
imageLocation = bsObj.find("a", {"id": "logo"}).find("img")["src"]
urlretrieve (imageLocation, "logo.jpg")
2.把數(shù)據(jù)存儲到CSV
CSV( Comma-SeparatedValues砰琢,逗號分隔值)是存儲表格數(shù)據(jù)的常用文件格式。 MicrosoftExcel 和很多應(yīng)用都支持 CSV 格式.
eg:
fruit,cost
apple,1.00
banana,0.30
pear,1.25
Python 的 csv 庫可以非常簡單地修改CSV文件良瞧,甚至從零開始創(chuàng)建一個 CSV 文件
import csv
csvFile = open("../files/test.csv", 'w+')
try:
writer = csv.writer(csvFile)
writer.writerow(('number', 'number plus 2', 'number times 2'))
for i in range(10):
writer.writerow( (i, i+2, i*2))
finally:
csvFile.close()
網(wǎng)絡(luò)數(shù)據(jù)采集的一個常用功能就是獲取 HTML 表格并寫入 CSV 文件陪汽。
import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://en.wikipedia.org/wiki/Comparison_of_text_editors")
bsObj = BeautifulSoup(html)
# 主對比表格是當前頁面上的第一個表格
table = bsObj.findAll("table",{"class":"wikitable"})[0]
rows = table.findAll("tr")
csvFile = open("../files/editors.csv", 'wt', newline=", encoding='utf-8')
writer = csv.writer(csvFile)
try:
for row in rows:
csvRow = []
for cell in row.findAll(['td', 'th']):
csvRow.append(cell.get_text())
writer.writerow(csvRow)
finally:
csvFile.close()
3.MySQL
Python 沒有內(nèi)置的MySQL支持工具。不過褥蚯,有很多開源的庫可以用來與 MySQL 做交互挚冤,Python 2.x和Python 3.x版本都支持。最有名的一個庫就是 PyMySQL(https://github.com/PyMySQL/PyMySQL)赞庶。
4.Email
與網(wǎng)頁通過 HTTP 協(xié)議傳輸一樣训挡,郵件是通過 SMTP( Simple Mail Transfer Protocol,簡單郵件傳輸協(xié)議)傳輸?shù)钠缜俊6依奖。湍阌镁W(wǎng)絡(luò)服務(wù)器的客戶端(瀏覽器)處理那些通過HTTP 協(xié)議傳輸?shù)木W(wǎng)頁一樣, Email 服務(wù)器也有客戶端摊册,像 Sendmail肤京、 Postfix 和 Mailman等,都可以收發(fā)郵件茅特。
下面的代碼運行的前提是你的電腦已經(jīng)可以正常地運行一個 SMTP 客戶端忘分。(如果要調(diào)整代碼用于遠程 SMTP 客戶端,請把 localhost 改成遠程服務(wù)器地址温治。)
import smtplib
from email.mime.text import MIMEText
msg = MIMEText("The body of the email is here")
msg['Subject'] = "An Email Alert"
msg['From'] = "ryan@pythonscraping.com"
msg['To'] = "webmaster@pythonscraping.com"
s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()
Python 有兩個包可以發(fā)送郵件: smtplib 和 email.
- email 模塊里包含了許多實用的郵件格式設(shè)置函數(shù)饭庞,可以用來創(chuàng)建郵件“包裹”。下面的示例中使用的 MIMEText 對象熬荆,為底層的 MIME(Multipurpose Internet MailExtensions舟山,多用途互聯(lián)網(wǎng)郵件擴展類型)協(xié)議傳輸創(chuàng)建了一封空郵件, 最后通過高層的SMTP 協(xié)議發(fā)送出去。 MIMEText 對象 msg包括收發(fā)郵箱地址累盗、郵件正文和主題寒矿, Python 通過它就可以創(chuàng)建一封格式正確的郵件。
- smtplib 模塊用來設(shè)置服務(wù)器連接的相關(guān)信息若债。就像 MySQL 服務(wù)器的連接一樣符相,這個連接必須在用完之后及時關(guān)閉,以避免同時創(chuàng)建太多連接而浪費資源蠢琳。
import smtplib
from email.mime.text import MIMEText
from bs4 import BeautifulSoup
from urllib.request import urlopen
import time
def sendMail(subject, body):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = "christmas_alerts@pythonscraping.com"
msg['To'] = "ryan@pythonscraping.com"
s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()
bsObj = BeautifulSoup(urlopen("https://isitchristmas.com/"))
while(bsObj.find("a", {"id":"answer"}).attrs['title'] == "NO"):
print("It is not Christmas yet.")
time.sleep(3600)
bsObj = BeautifulSoup(urlopen("https://isitchristmas.com/"))
sendMail("It's Christmas!","According to http://itischristmas.com, it is Christmas!"