python2.7+anaconda爬蟲爬取美團商家資訊
第一步,開啟美團
網https://chs.meituan.com/(谷歌瀏覽器)——點選右鍵檢查——點選左中箭頭——選中文字美食<a href=http://chs.meituan.com/meishi/,接下來我們把這些url爬取下來
def get_start_links(url):
html=requests.get(url).text#傳送請求獲取主頁文字
print html
soup=BeautifulSoup(html,'lxml')#解析網頁
links=[link.find('span').find('a')['href'] for link in soup.find_all('span',class_='nav-text-wrapper')]
print links
return links
第二步,獲取以上url,以http://chs.meituan.com/meishi/為例,在檢查網頁原始碼時,發現每個商家都有一個屬於自己的poiId,如圖所示
而我們發現上個頁面商家資訊不全面,缺少電話,經緯度資訊,選取轉轉樂涮涮鍋點進去,發現url變為http://chs.meituan.com/meishi/5140661/,5140661就是此商家的poiId,此頁面中商家資訊是完整的。
所以,我們要獲得此頁面的url,必須先獲取商家的poiId
def get_detail_id(category_url):
html=requests.get(category_url,headers=headers).text
#print html
soup=BeautifulSoup(html,'lxml')#解析網頁
#print soup
texts=soup.find_all('script')
#print texts
text=texts[14].get_text().strip()#特別說明,這裡其實可以用正則表示式,不過我不會,用了笨方法
#print text
text=text[19:-1]
result1=json.loads(text,encoding='utf-8')
#print result1
result2=result1['poiLists']
result3=result2['poiInfos']
#print result3
Info_list=[]
for it in result3:
#print it
Info_list.append(it['poiId'])
#Info_list.append(it['address'])
#Info_list.append(it['avgScore'])
#Info_list.append(it['avgPrice'])
#print Info_list
return Info_list
第三步,獲取商家資訊-右鍵點選檢視網頁原始碼可以看到商家資訊,所以我們需要做的就是把網頁原始碼的商家資訊截取出來
def get_item_info(url):
#print url
headers={
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Language':'zh-CN,zh;q=0.9',
'Cache-Control':'max-age=0',
'Proxy-Connection':'keep-alive',
'Host':'chs.meituan.com',
'Referer':'http://chs.meituan.com/',
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
'Content-Type':'text/html;charset=utf-8',
'Cookie':'_lxsdk_cuid=164c9bed44ac8-0bf488e0cbc5d9-5b193413-1fa400-164c9bed44bc8; __mta=248363576.1532393090021.1532393090021.1532393090021.1; rvct=70%2C1; ci=70; iuuid=30CB504DBAC7CCDD72645E3809496C48229D8143D427C01A5532A4DDB0D42388; cityname=%E9%95%BF%E6%B2%99; _lxsdk=30CB504DBAC7CCDD72645E3809496C48229D8143D427C01A5532A4DDB0D42388; _ga=GA1.2.1889738019.1532505689; uuid=2b2adb1787947dbe0888.1534733150.0.0.0; oc=d4TCN9aIiRPd6Py96Y94AGxfsjATZHPGsCDua9-Z_NQHsXDcp6WlG2x7iJpYzpSLttNvEucwm_D_SuJ7VRJkLcjqV6Nk8s_q3VyOJw5IsVJ6RJPL3qCgybGW3vxTkMHr9A4yChReTafbZ7f93F1PkCyUeFBQV4D-YXoVoFV5h3o; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; client-id=97664882-24cd-4743-b21c-d25de878708e; lat=28.189822; lng=112.97422; _lxsdk_s=165553df04a-bc8-311-ba7%7C%7C6',
}
html=requests.get(url,headers=headers).text
soup=BeautifulSoup(html,'lxml')
texts=soup.find_all('script')
#print texts
text2=texts[15].get_text().strip()#特別說明,這裡其實可以用正則表示式,不過我不會,用了笨方法
#print text2
text=text2[19:-1]
result4=json.loads(text,encoding='utf-8')
#print result4
result5=result4['detailInfo']
it=result5
#print result5
Info_list=[]
Info_list.append(it['name'])
Info_list.append(it['address'])
Info_list.append(it['phone'])
Info_list.append(it['longitude'])
Info_list.append(it['latitude'])
print Info_list
return Info_list
第四步,把獲取的商家資訊寫入excel表中。