一:前言
近日,一个名为【wuhan2020】的开源项目登上了GitHub Trending TOP榜,已收获4k+ Star
这是一个武汉新型冠状病毒防疫信息收集平台的开源项目,针对 2020 年初在武汉爆发的新型冠状病毒疫情,本项目旨在收集各医院、酒店、工厂、物流、捐赠、捐款、预防、治疗、动态等信息,统一收集,统一发布,以便各方之间进行信息互通,有效调配社会资源。疫情无情人有情,在疫情面前,众志成城,中国开发者们也都行动起来了,想着最近身边的人都买不到口罩,而口罩又是防疫中重要的一环,搜了搜京东,各大店铺均已售罄,想着就等到货通知吧,但是还没通知就被抢购一空,所以萌生了一个通过python爬虫的方式去抓取到货通知,这样一来,只要到货了第一时间邮件就能收到了,避免了错过抢购的最佳时机
二:爬虫实现思路
抓取京东店铺网页关键信息,当捕捉到无货信息时代表此时的口罩是售空的,否则就会通过qq邮件发送到自己的邮箱
三:主要使用到的Python模块
requests模块
模块说明:
1.Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码
2.在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作
3.requests会自动实现持久连接keep-alive
通过这个模块我们就可以完成两个重要的功能,一个是网页抓取,一个是邮件发送
如果未安装该模块,可以使用以下命令获取并安装
pip install requests
下面直接上代码
###########################################
#
#京东店铺口罩到货实时通知
#
###########################################
import requests
import time
from email.mime.text import MIMEText
from pip._internal.utils.outdated import SELFCHECK_DATE_FMT
from email._header_value_parser import Header
import smtplib
from email.mime.text import MIMEText #用于构建邮件内容
from email.header import Header #用于构建邮件头
# 商品链接
Url = [
'https://c0.3.cn/stock?skuId=100011293950&area=19_1607_4773_0&venderId=1000078145&buyNum=1&choseSuitSkuIds=&cat=9192,12190,1517&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=&pduid=1580214678781491106132&ch=1&callback=jQuery4173314',
'https://c0.3.cn/stock?skuId=100002810158&area=2_2824_51916_0&venderId=646174&buyNum=1&choseSuitSkuIds=&cat=9192,12190,1517&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=&pduid=1580214678781491106132&ch=1&callback=jQuery4188953',
]
class Mail:
'定义一个邮箱类'
Msgs = ''
#初始化发送方,接收方的邮箱信息
def __init__(self, FromMail, Authentication, ToMail, Msg):
self.frommail = FromMail
self.password = Authentication
self.tomail = ToMail
self.msg = Msg
def make_mail(self, url):
self.Msgs = MIMEText(url + self.msg, 'plain', 'utf-8')
self.Msgs['From'] = Header(self.frommail)
self.Msgs['To'] = Header(self.tomail)
self.Msgs['Subject'] = Header(self.msg)
def send_mail(self, url):
self.make_mail(url)
print("开启邮件服务")
server = smtplib.SMTP_SSL(host='smtp.qq.com') # 开启发信服务,这里使用的是加密传输
print("连接服务器")
server.connect(host='smtp.qq.com', port=465)
print("登录服务器")
server.login(self.frommail, self.password)
print("发送邮件")
server.sendmail(self.frommail, self.tomail, self.Msgs.as_string())
print("发送邮件成功")
server.quit() # 关闭服务器
times = 1
if __name__ == "__main__":
mail = Mail('[email protected]', 'zndzkblqgpobjfid', '[email protected]', '口罩到货啦!!!')
while True:
try:
print('第' + str(times) + '次 ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
times += 1
session = requests.Session()
session.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/531.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
"Connection": "keep-alive"
}
for i in Url:
skuidUrl = 'https://item.jd.com/' + i.split('skuId=')[1].split('&')[0] + '.html'
response = session.get(i)
#print(response.text)
if (response.text.find('无货') > 0):
print("商品链接:%s 口罩已售空" % skuidUrl)
else:
print("商品链接:%s 口罩已到货!!! " % skuidUrl)
mail.send_mail(skuidUrl)
time.sleep(60)
except Exception as e:
print("异常!!!")
time.sleep(10)
四:开通POP3/SMTP服务
这里因为是第三方登录邮箱,所以需要开通qq邮箱的POP3/SMTP
开通方法如下:
五:运行结果
第1次 2020-02-02 19:46:58
商品链接:https://item.jd.com/100011293950.html 口罩已售空
商品链接:https://item.jd.com/100002810158.html 口罩已到货!!!
开启邮件服务
连接服务器
登录服务器
发送邮件
发送邮件成功
第2次 2020-02-02 19:47:59
商品链接:https://item.jd.com/100011293950.html 口罩已售空
商品链接:https://item.jd.com/100002810158.html 口罩已到货!!!
开启邮件服务
连接服务器
登录服务器
发送邮件
发送邮件成功
邮箱收件如下
六:如何增加自己要搜索的店铺
本篇文章到此介绍完口罩店铺到货情况爬虫思路及代码实现,希望对你们有帮助,谢谢!如果有不正确或者需要补充的地方,欢迎评论区留言!