一、前言
上篇笔记我记录了scrapy的环境搭建和项目创建和第一次demo测试。本篇我们来结合现实场景利用scrapy给我们带来便利。
有炒股或者其它理财产品的朋友经常会关心每日的个股走势,如果结合爬虫进行实时通知自己,并根据自己预想的行情进行邮件通知(比如某个股票如果到达100块钱就发邮件通知自己),这样会大大提高我们的炒股收益。
二、需求分析
- 目标网站:同花顺A股市场行情
- 目标数据:
- 股票代码
- 股票名称
- 股票价格
- 股票涨跌
三、代码实现
- 设置爬取的目标网页
def start_requests(self):
urls = [
"http://q./"
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
- 解析目标信息的网页结构
def parse(self, response):
# 股票代码列表
stock_id_list = response.css("div#maincont -pager-table td:nth-child(2) a::text").extract()
# 股票名称列表
stock_name_list = response.css("div#maincont -pager-table td:nth-child(3) a::text").extract()
# 股票价格列表
price_list = response.css("div#maincont -pager-table td:nth-child(4)::text").extract()
# 股票涨跌列表
speed_up_list = response.css("div#maincont -pager-table td:nth-child(6)::text").extract()
for i in range(len(stock_id_list)):
stock_id = stock_id_list[i]
stock_name = stock_name_list[i]
price = price_list[i]
speed_up = speed_up_list[i]
# 存到item,用来持久化
item = ScrapyDemoItem()
item["stock_id"] = stock_id
item["stock_name"] = stock_name
item["price"] = price
item["speed_up"] = speed_up
yield item
- 处理爬取的目标信息
- 将目标信息存储为html形式
def __init__(self):
self.html = '<html><head><meta charset="utf-8"></head><body><table>'
def process_item(self, item, spider):
self.html = self.html + '<tr>'
self.html = self.html + '<td>%s</td>' % item["stock_id"]
self.html = self.html + '<td>%s</td>' % item["stock_name"]
self.html = self.html + '<td>%s</td>' % item["price"]
self.html = self.html + '<td>%s</td>' % item["speed_up"]
self.html = self.html + '</tr>'
return item
def close_spider(self, spider):
self.html = self.html + '</table></body></html>'
self.send_email(self.html)
print()
- 发送邮件
结合之前写的python发邮件的知识点《Python:发送qq邮箱只需几行代码轻松搞定》,将html内容发送到邮箱中
def send_email(self, html):
# 设置邮箱账号
account = "xxx@"
# 设置邮箱授权码
token = "xxx"
# 实例化smtp对象,设置邮箱服务器,端口
smtp = smtplib.SMTP_SSL('', 465)
# 登录qq邮箱
smtp.login(account, token)
# 添加正文,创建简单邮件对象
email_content = MIMEText(html, 'html', 'utf-8')
# 设置发送者信息
email_content['From'] = 'xxx@'
# 设置接受者信息
email_content['To'] = '技术总是日积月累的'
# 设置邮件标题
email_content['Subject'] = '来自code_space的一封信'
# 发送邮件
smtp.sendmail(account, 'xxx@', email_content.as_string())
# 关闭邮箱服务
smtp.quit()
四、拓展
Scrapy是个很好用的框架,结合日常生活中的需求,我们可以写很多给我们带来便利的工具,以后会补上各种我多年来使用过的工具代码,都是基于Scrapy的使用。