最近所做课题需要获得大量的食物信息,但很难找到相关匹配的数据库。由于本人的专业不是偏算法的,所以对于爬虫这方面的知识是一片空白。在结合拜读了一些博主有关于爬虫的文章,以及自己实际的测试爬虫过程遇到的一些问题,最后写下这篇小小的感想。由于本人知识有限,如有错误,欢迎各位大佬赐教。个人的学习记录分享,仅供参考学习。
一、爬取分析
在浏览了一些有关于食物的网站后,发现一个比较符合本人项目要求的网站。
网址:http://db.foodmate.net/yingyang/type_0%3A1%3A0_1.html
首先我们先打开浏览器的开发者工具,查看分析html代码是否直接带有所需的信息。
这个网站的html代码刚好就带有我们所需的食物信息,所以可以考虑直接从代码上爬取这些信息。
下面给出实现的参考代码:
from urllib.parse import urlencode
import requests
from lxml import etree
import openpyxl
# 创建Excel表并写入数据
book=openpyxl.Workbook()
sh=book.active
sh.title='食物信息'
sh['A1'] = '食物名称'
sh['B1'] = '热量(千卡)'
sh['C1'] = '硫胺素(毫克)'
sh['D1'] = '钙(毫克)'
sh['E1'] = '蛋白质(克)'
sh['F1'] = '核黄素(毫克)'
sh['G1'] = '镁(毫克)'
sh['H1'] = '脂肪(克)'
sh['I1'] = '烟酸(毫克)'
sh['J1'] = '铁(毫克)'
sh['K1'] = '碳水化合物(克)'
sh['L1'] = '维生素C(毫克)'
sh['M1'] = '锰(毫克)'
sh['N1'] = '膳食纤维(克)'
sh['O1'] = '维生素E(毫克)'
sh['P1'] = '锌(毫克)'
sh['Q1'] = '维生素A(微克)'
sh['R1'] = '胆固醇(毫克)'
sh['S1'] = '铜(毫克)'
sh['T1'] = '胡罗卜素(微克)'
sh['U1'] = '钾(毫克)'
sh['V1'] = '磷(毫克)'
sh['W1'] = '视黄醇当量(微克)'
sh['X1'] = '钠(毫克)'
sh['Y1'] = '硒(微克)'
sh['Z1'] = '网址'
row=2
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240"
#如url = "http://db.foodmate.net/yingyang/type_0%3A6%3A0_6.html"
#多页爬取
food=[]
nutrient=[]
number=[]
address=[]
for i in range(21,22): #食物种类
for j in range(0,50): #食物种类下各种食物
url = "http://db.foodmate.net/yingyang/type_0%3A" + str(i) +"%3A" + str(j) +"_"+str(i) +".html"#网址
with requests.request('GET',url,headers = {'User-agent':ua}) as res:
content = res.text #获取HTML的内容
html = etree.HTML(content) #分析HTML,返回DOM根节点
name = html.xpath("//*[@id='rightlist']/center/font/b/text()")#食物名称
information_name = html.xpath( "//*[@id='rightlist']/div/div/text()") #营养素
information_number = html.xpath( "//*[@id='rightlist']/div/text()") #含量
for j in range(0,len(information_name)):
sh.cell(row,j+2).value=str(information_number[j])
for m in range(0,len(name)):
sh.cell(row,26).value=str(url)
sh.cell(row,1).value=str(name[m])
row+=1
print(1)
#food.append(name)
#nutrient.append(information_name)
#number.append(information_number)
#address.append(url)
book.save('药食及其他.xlsx')
#print(food)
#print(nutrient)
#print(number)
#print(address)
该参考代码是实现爬取“药食及其他”的数据爬取并输出一个Excel表格。如果想要爬取其他的只需要修改“食物种类对应网址与现在对应的不同即可,一般都是有规律的,这里的是只需要修改代码中的:for i in range(21,22): #食物种类”里面的对应数字即可。如果该页面下的种类下各种食物:for j in range(0,50): #食物种类下各种食物 里面的数字即可。最后输出的表格如下: