存储数据
如果你需要一个快速简单的方法收集网上的文档,然后存到你的硬盘里,那么可能需要创建一个文件流( file stream) 来实现。如果还要为偶然事件提个醒儿,或者每天定时收集当天累计的数据,就给自己发一封邮件吧!
1.媒体文件
存储媒体文件有两种主要的方式:只获取文件URL链接,或者直接把源文件下载下来。
urllib.request.urlretrieve 可以根据文件的 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.把数据存储到CSV
CSV( Comma-SeparatedValues,逗号分隔值)是存储表格数据的常用文件格式。 MicrosoftExcel 和很多应用都支持 CSV 格式.
eg:
fruit,cost
apple,1.00
banana,0.30
pear,1.25
Python 的 csv 库可以非常简单地修改CSV文件,甚至从零开始创建一个 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()
网络数据采集的一个常用功能就是获取 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 没有内置的MySQL支持工具。不过,有很多开源的库可以用来与 MySQL 做交互,Python 2.x和Python 3.x版本都支持。最有名的一个库就是 PyMySQL(https://github.com/PyMySQL/PyMySQL)。
4.Email
与网页通过 HTTP 协议传输一样,邮件是通过 SMTP( Simple Mail Transfer Protocol,简单邮件传输协议)传输的。而且,和你用网络服务器的客户端(浏览器)处理那些通过HTTP 协议传输的网页一样, Email 服务器也有客户端,像 Sendmail、 Postfix 和 Mailman等,都可以收发邮件。
下面的代码运行的前提是你的电脑已经可以正常地运行一个 SMTP 客户端。(如果要调整代码用于远程 SMTP 客户端,请把 localhost 改成远程服务器地址。)
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 有两个包可以发送邮件: smtplib 和 email.
- email 模块里包含了许多实用的邮件格式设置函数,可以用来创建邮件“包裹”。下面的示例中使用的 MIMEText 对象,为底层的 MIME(Multipurpose Internet MailExtensions,多用途互联网邮件扩展类型)协议传输创建了一封空邮件, 最后通过高层的SMTP 协议发送出去。 MIMEText 对象 msg包括收发邮箱地址、邮件正文和主题, Python 通过它就可以创建一封格式正确的邮件。
- smtplib 模块用来设置服务器连接的相关信息。就像 MySQL 服务器的连接一样,这个连接必须在用完之后及时关闭,以避免同时创建太多连接而浪费资源。
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!"