多协程实践
打开网址,查看所要获取的信息的存取地方
我们讲过判断数据存储在哪里的方法。请你打开http://www.boohee.com/food/group/1网站,右击打开“检查”工具,并点击Network
,然后刷新页面。点击第0个请求1
,看Response
。
我们能在Response里找到食物的信息,说明我们想要的数据存在HTML里。
再看第0个请求1的Headers,可以发现薄荷网的网页请求方式是get。
知道了请求方式是get,我们就知道可以用requests.get()获取数据。
找寻不同网页的规律
from gevent import monkey
monkey.patch_all()
#让程序变为异步模式
import gevent,requests,bs4,csv
from gevent.queue import Queue
from bs4 import BeautifulSoup
import time
import csv
# url_list=[]
# for i in range(1,4):
# for j in range(1,4):
# url_list.append('http://www.boohee.com/food/group/' + str(i) + '?page=' + str(j))
# for i in range(1,4):
# url_list.append('http://www.boohee.com/food/view_menu/?page='+str(j))
# for url in url_list:
# print(url)
work=Queue()
#创建队列对象,并赋值给work
#前三个常见食物分类的前三页的食物网址的记录
url_1='http://www.boohee.com/food/group/{type}?page={page}'
for i in range(1,4):
for j in range(1,4):
url_1_real=url_1.format(type=i,page=j)
work.put_nowait(url_1_real)
url_2='http://www.boohee.com/food/view_menu/?page={page}'
for i in range(1,4):
url_2_real=url_2.format(page=i)
work.put_nowait(url_2_real)
#print(work)
def crawler():
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'}
#模拟浏览器头,防止反爬虫
while not work.empty():
url=work.get_nowait()
# print(url)
res=requests.get(url,headers=headers)
# print(res.text)
#获取网页源代码
soup=BeautifulSoup(res.text,'html.parser')
#用BeautifulSoup解析网页源代码
foods=soup.find_all('li',class_='item clearfix')
for food in foods:
food_name=food.find_all('a')[1]['title']
# print(food_name)
food_heat=food.find('p').text
food_url = 'http://www.boohee.com' + food.find_all('a')[1]['href']
# print(food_heat)
writer.writerow([food_name, food_heat, food_url])
# 借助writerow()函数,把提取到的数据:食物名称、食物热量、食物详情链接,写入csv文件。
csv_file=open('boohee.csv','w',newline='')
csv_file= open('boohee.csv', 'w', newline='')
#调用open()函数打开csv文件,传入参数:文件名“boohee.csv”、写入模式“w”、newline=''。
writer = csv.writer(csv_file)
# 用csv.writer()函数创建一个writer对象。
writer.writerow(['食物', '热量', '链接'])
#借助writerow()函数往csv文件里写入文字:食物、热量、链接
task_list=[]
#创建5个爬虫
for x in range(5):
task=gevent.spawn(crawler)
#创建任务
task_list.append(task)
#添加任务队列
start_time=time.time()
gevent.joinall(task_list)
end_time=time.time()
print('time='+str(end_time-start_time))