网站
其实垃圾分类网上很多了,利用各种方法的API(有付费的也有免费的)但是我最近看到一个网站https://www.smartmll.com可以去看看,这个里面有输入垃圾,然后选择地点,结果就会返回对应是什么垃圾,比起对接api,写个爬虫应该会更加方便。下面我们就一个个的来解决问题
怎么查
我们随意的输入如“纸张”之类的词语看到他的url变化:
https://www.smartmll.com/纸张.html
那么我们的url的格式就是简单的
www.smartmll.com+‘词汇’+.html的格式:
使用beautifulsoup就可以做简单的访问了
开搞:
import requests
find_text = input("你要找什么垃圾")
url = 'http://www.smartmll.com'
r=request.get(url + find_text + '.html')
r_text=r.text
print(demo)
获取需要的值
通过查看源码可以看到我们需要的位置在网页中的建议分类这一个项目里面它的位置是:
html->body->form.fom.forms1->p.rest->em.redes
不过一个个的定位找真的很麻烦,不如直接暴力的用BeautifulSoup来找因为源码里面没有几个em,而且在这个网页中我们需要的标签是固定位置,通过直接获取所有的em标签我们就可以直接查看到我们需要的em标签位置是第二个位置。
上代码段:
soup = BeautifulSoup(r_text,"html.parser")
text = soup.find_all('em')
rubbish_box = text[1].gettext()
修改地址
到这里其实就可以获得需要对应的垃圾的分类了,但是网页显示的所在地依然是上海(默认是上海)
跳转到网站网站中,通过Chrome按f12然后点击Application->Cookeis可以看到里面有两个和城市有关的数据city和city2
(可以复制city和city2的值,他们是HTML中的URL编码可以利用站长工具直接解码看到对应的城市)
然后切换到网页源码的位置查询city可以看到如下代码:
window.onload=function() {
//$("#catys").html('当前城市:'+getCookie('city2'));
$("#myselect").change(function() {
var opt=$("#myselect").val();
_hmt.push(['_trackEvent', '切换城市', '城市名', opt]);
setCookie2('city', opt, 30);
setCookie('city2', opt, 30);
window.location.reload();
}
);
}
这里可以笃定我们要修改Cookies中的city和city2
我这里只修改了city就可以达到效果,当然安全起见两个价都改应该就好些,但是效果达到就OK了:
所在地是南京:南京的编码是%E5%8D%97%E4%BA%AC
所以修改代码为如下内容:
find_text = input("你要找什么垃圾")
url = 'https://www.smartmll.com/'
s = requests.session()
c = requests.cookies.RequestsCookieJar()
c.set('city','%E5%8D%97%E4%BA%AC')
s.cookies.update(c)
r = requests.get(url + find_text + '.html',cookies = s.cookies)
demo = r.text
soup = BeautifulSoup(demo,"html.parser")
text = soup.find_all('em')
问题
写到这里加上一个语音识别和四个舵机控制基本就可以做一组智能垃圾桶了,但是还是有些问题的,下面简单说一下
1.这个东西假如写到树莓派或者其他设备里面会有问题,应为要联网,很多时候是不能联网的。解决办法:前期可以联网放一段时间,或者一直联网,每次使用爬虫调用的时候,都离线写一个字典,这样以后在扔相同的东西的时候就可以做到不重复了,然后加入网站没有找到的话,可以直接问人,也可以建立一个新的字典
2.这里我只用了一个网页,其实可以直接利用百度加上和header直接查什么是什么垃圾来加一个保险,不过我没空去写了
我就写了这些:
# https://www.smartmll.com/输入信息.html
# 作者:LijiaSnail
from bs4 import BeautifulSoup
from enum import Enum
import requests
class Rubbish(Enum):
pass
while(1):
find_text = input("你要找什么垃圾")
url = 'https://www.smartmll.com/'
s = requests.session()
c = requests.cookies.RequestsCookieJar()
c.set('city','%E5%8D%97%E4%BA%AC')
s.cookies.update(c)
r = requests.get(url + find_text + '.html',cookies = s.cookies)
demo = r.text
soup = BeautifulSoup(demo,"html.parser")
text = soup.find_all('em')
try:
rubbish_box = text[1].get_text()
print (find_text+'是'+rubbish_box)
rubbish_type = {
"可回收物":1,
"厨余垃圾":2,
"有害垃圾":3,
"其他垃圾":4,
}
print ("对于的垃圾桶是:{}".format(rubbish_type.get(rubbish_box)))
except Exception:
#以后写字典留下
print ('我还不知道'+find_text+'是什么垃圾')
#id = input('')
#data.add(find_text,id)
#修改cookies为需要地址
感谢
最后感谢这个网站,给我这个穷人提供了中不用付费api写智能垃圾桶的思路
需要垃圾数据库获取的可以到这个网站加这个网站作者的微信或者qq
最后我把我写的所有的代码发出来有需要的话可以直接拿过去使用(愿意的话备注一下我的名字我也会很开心),因为工作原因不再从事代码的工作了,有些可惜,不过没事还是会玩玩这些的