在之前的文章中,筆者有提到,我們要在實踐中去學習python,筆者有天就想着要不要爬點東西呢,躍躍欲試的節奏啊,想來想去,想到美團了,那么首先筆 者想給自己確定一個目標,就是我要爬什么樣的數據,我要爬美團的哪些東西。筆者首先確定了筆者想要爬去的界 面,http://bj.meituan.com/。就是美團網在北京的團購首頁,獲取首頁的團購,團購項目的介紹,團購售價,銷量。
1.首先確定要用的模塊,<1.>urrlib,os,re三個模塊,
2.要想獲得數據,並且一一對應起來,那么用到循環的嵌套(一開始卡殼,后來咨詢得到啟發),
3.獲取網頁的所有數據,爬去下來
4.分析這些想要或許的模塊怎么找出來,
5.找出相對於的正則來匹配,
6.獲取數據,並且找到對應的數值
7.利用循環,並且配合字典的使用,將數據完整的獲取下來,
8.保存到相應的文檔中
9.關閉文檔,
10.提示數據保存成功,結束爬去。
由於這是第一次采取這么多的信息,之前只是爬個圖片啥的,所以筆者還是十分小心的去審查每一個元素,在這里推薦利用火狐瀏覽器,感覺是真的好用使用Firebug插件審查元素。
查看元素后,可以獲得這個網站的編碼形式是utf-8,這對於我們爬取數據也是關鍵的。
在一開始呢,筆者還打開了一款軟件,fiddler,抓包
這些信息還是很多的,由於筆者截圖的時候碰到了網絡的原因,但是筆者還是找到了自己想要的信息,這樣可以在自己的代碼中加入偽裝瀏覽器的信息,那么接下來要做的事情就是定位我們想要找的數據。
分析首頁的團購信息,我們可以根據多個來確認這個信息的唯一標識符,<span>標簽中並且有class="xtitle"< /span>中間文字,那么我們的正則表達式就出來了,r'<span class="xtitle">(.+?)</span>'(正則太難,筆者一個個試出來的)
描述也是<span>標簽並且 class="short-title",</span>的文字,那么很快就匹配到了,正則出來了,r'class="short-title">(.+)</span>'
后面的就是依次類推。完成這個,那么我們就開始寫我們的爬蟲程序,導入我們想要用的模塊,定義我們想要用的變量。爬去,匹配,然后循環得出來我們的結果,寫入文檔。代碼如下
#作者:雷子
#qq:952943386
#郵箱:leileili126@163.com
#歡迎大家來點評,有問題可以進行溝通
import urllib.request
import os
import re
file=open(r'meituancde.txt','w')
url="http://bj.meituan.com/"
headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:47.0) Gecko/20100101 Firefox/47.0"}
req=urllib.request.Request(url,headers=headers)
response = urllib.request.urlopen(req)
html = response.read().decode("utf-8")
title_reg=r'<span class="xtitle">(.+?)</span>' #匹配團購
jianjie_reg=r'class="short-title">(.+)</span>' #匹配團購簡介
sellnum_reg=r'<strong class="num">(.+)</strong>' #銷售的數量
pire_reg=r'<strong>(.+)</strong>' #團購的售價
title_list = re.findall(title_reg,html)
jianjie_list=re.findall(jianjie_reg,html)
sellnum_list=re.findall(sellnum_reg,html)
pire_list=re.findall(pire_reg,html)
meitu={}
i = 0
for title in title_list:
meitu['團購'] =title_list[i]
for jianjie in jianjie_list:
meitu['簡介']=jianjie_list[i]
for sellum in sellnum_list:
meitu['銷量']=sellnum_list[i]
for pire in pire_list:
meitu['美團售價']=pire_list[i]
i+=1
print(meitu)
if len(meitu) !=0:
file.write(str(meitu))
file.write("\n")
file.close
print("寫入正確")
代碼 百度雲