爬蟲代碼分析
我們首先需要抓取頁面。
我們可以看到網址是www.mafengwo.cn/group/s.php? Q =曼谷&;p=1。t =凱特& ampkt=1 .主要參數是q?,p?,t,其中q是城市名,p是頁碼,t是分類,cate是美食,kt是不影響的參數。
需要獲取的頁面,detail是域名後的參數,這個函數可以用來獲取域名下的網頁主頁。
#獲取下壹頁
def getDetailPage(detailURL):
嘗試:
url = ""+detailURL "
request = urllib2。請求(url)
response = urllib2.urlopen(請求)
#使用urllib2的request方法返回壹個Request對象,並用urlopen打開它。
page = response.read()
#使用read()方法讀取頁面內容,輸入:打印頁面輸出:頁面html。
page code = re . sub(r ' & lt;br[ ]?/?& gt',' \n ',第頁)
#從html中刪除回車空行
返回頁面代碼
除了urllib2。URLError,e:
if hasattr(e,“原因”):
打印e .原因
return none 1234567891011213141516
要獲得每個美食商店的鏈接,首先檢查元素以查看鏈接的位置。
#獲取美食單頁商店的鏈接
def getFoodHref(self,pageid):
url = "/group/s.php?q = "+self . city+" & amp;p = "+str(pageid)+" & amp;t =凱特& ampkt=1 "
Page = getDetailPage(url) #調用getDetailPage獲取頁面。
Soup = BeautifulSoup (page,' html。解析器))#使用美湯進行頁面解析。
FoodHref = []
FoodLists =?soup.find(name="div ",attrs={'data-category':'poi'})。保險商實驗所
Foodfhreflist = foodlists。find _ all ("H3") #了解
對於FoodHrefList中的FoodHrefs:
food website = foodfhrefs . A[' href ']#循環遍歷列表,找出A標簽的href屬性的值,這是商店的url。
Foodfhrefshort = str(美食網站)。replace(' ',' ')#去掉url前的域名,這樣以後就可以調用getDetaiL函數,傳入它來獲取商店頁面。
FoodHref.append(FoodHrefShort)返回food href 1234567891011213141516171765438
接下來再次調用getDetailPage(),傳入FoodHref,就可以得到店鋪的頁面,通過BeautifulSoup得到信息。但是我在搶的時候遇到了壹個問題。?
這是壹家資料齊全的店鋪,但是有的店鋪沒有網站,沒有流量信息。像這樣?
檢查完元素後發現標簽是壹樣的,無法通過標簽的唯壹屬性或者class的值定向捕獲。使用< div class="bd " >無法檢查的子節點和同級節點。後來我想出了壹個辦法。
寫壹個匹配的函數hasAttr,list,list參數是中文的完整信息名稱列表。在getShopInfo方法中,列表的內容用捕獲的
#判斷是否有信息列表。
def hasAttr(自身,列表):
soup = BeautifulSoup(page,' html.parser ')
col = soup.find("div ",class_="col-main ")。find("div ",class_="bd ")
str _ col = str(col)if list in str _ col:返回True
否則:返回False
#獲取商店信息
def getShopInfo(self,page):
shopInfoList = ['brief ',' localName ',' location ',' telephone ',' website ',' ticket ',' openTime ',' shopName ',' shopScore']
InfoItem = ['簡介','英文名','地址','電話','網站','門票','開放時間','姓名','星級']
soup = BeautifulSoup(page,' html.parser ')
shopName = soup.find("div ",class _ = " wrapper "). h 1 . string。
Shopscore = soup.find ("div ",class _ = "col-main ")。span.em.string for i in range (0,6): #信息項循環搜索。
if self.hasAttr(page,infoItem[i]):
pattern _ shopinfo = re . compile(' & lt;div class="col-main。*?& ltdiv class="bd " >。*?+info item[I]+' & lt;/H3 & gt;。*?& gt(.*?)& lt/p & gt;,回復。s)
shoppinfos = re . find all(pattern _ shopinfo,page) #如果這個項目存在,使用正則化取出它的標簽內容。
對於shopInfos中的shopInfo:
ShopInfoList[i] = shopInfo else: #繼續查找下壹項。
繼續
商店信息列表[7] =商店名稱
shop infolist[8]= shop score return shop infolist 123456789101121314151617181920212228
最後,將數據添加到字典中。如果壹個鍵有很多值,比如dict = {a:[]},調用set default(鍵名,[])。追加(列表值)?
dict.setdefault('comment ',[])。附件(註釋)
然後json.dumps (dict,indent = 1)。decode ("unicode _ escape ")。Indent參數用於以json樹的形式表示數據。如果內容中有中文,應該使用decode("unicode_escape "),否則結果是" \u "unicode編碼。