前言
机缘巧合,最近在学习机器学习实战,
本来要用python来做实验和开发环境
得到一个需求,要爬取大众点评中的一些商户信息,
于是开启了我的第一个爬虫的编写,里面有好多心酸,主要是第一次。
我的文章有幸被你看到的话,如果你也是个初学者,希望能让你也学习到一些东西,下面是干货。
需求:
环境:
1、windows 7 +python2.7.3+BeautifulSoup包
2、BeautifulSoup是用的最新版,4.x的,在bs4的包中,直接用pip install BeautifulSoup即可安装,前提你得有pip,或者easy_install也可以
3、这里用到BeautifulSoup,主要是获取爬下来的html文档树,然后提供了一套获取网页数据内容的API,如指定标签属性或内容等。
4、BeautifulSoup这个东西蛮好用的,但是涉及到一些特别的需求,还是要正则出马,正则我也不熟,有时间还是要专门学一下,共勉。
源码:
1 # -*- coding: utf-8 -*- 2 import urllib2 3 import re 4 from bs4 import BeautifulSoup 5 6 base_url = 'http://www.dianping.com' 7 url = 'http://www.dianping.com/search/category/1/10/g101r801' 8 html = urllib2.urlopen(url) 9 soup = BeautifulSoup(html,"html.parser") 10 flag = 0 11 12 while(url!=None): 13 html = urllib2.urlopen(url) 14 soup = BeautifulSoup(html,"html.parser") 15 16 #餐厅总数 17 Sum = soup.find(attrs={'class':'num'}).string 18 #餐厅名称 19 names = soup.find_all('a',attrs={'data-hippo-type':'shop'}) 20 #星级 21 levels = soup.find_all(['span'],attrs={'class':re.compile(r"sml-rank-stars(\s\w+)?")}) 22 #评论数 23 nums = soup.find_all('a',attrs={'class':'review-num'}) 24 #人均消费 25 prices = soup.find_all('a',attrs={'class':'mean-price'}) 26 #菜系区域 27 caixis = soup.select('div[class="tag-addr"] a') 28 #详细地址 29 addrs = soup.find_all('span',attrs={'class':'addr'}) 30 #口味、环境、服务评分 31 comments = soup.find_all('span',attrs={'class':'comment-list'}) 32 if(flag==0): 33 info = 'Sum: '+ str(Sum).replace('(','').replace(')','') + '\n' + '#########################################' 34 35 for (a,b,c,d,e,f,g) in zip(names,levels,nums,prices,caixis,addrs,comments): 36 info = info +'\n'+'name: '+ str(a.text.encode('gb18030').replace(' ','')) 37 info = info +'\n'+'level: '+ str(b.get('title').encode('gb18030').replace(' ','')) 38 info = info +'\n'+'num: '+ str(c.text.encode('gb18030').replace(' ','')) 39 info = info +'\n'+'price: '+ str(d.text.encode('gb18030').replace(' ','')) 40 info = info +'\n'+'caixi: '+ str(e.text.encode('gb18030').replace(' ','')) 41 info = info +'\n'+'addr: '+ str(f.text.encode('gb18030').replace(' ','')) 42 info = info +'\n'+'comment: '+ str(g.text.encode('gb18030').replace(' ','')) 43 info += '\n'+'#########################################' 44 45 file = open('result.txt','a') 46 file = file.write(info) 47 48 info = '' 49 flag = 1 50 51 url = soup.find('a',attrs={'class':'next','title':'下一页'}) 52 if(url!=None): 53 url = url.get('href') 54 url = base_url+str(url) 55 56 print("end")