當前位置:成語大全網 - 書法字典 - python可以抓取蜂巢上的數據嗎?

python可以抓取蜂巢上的數據嗎?

當然了。

爬蟲代碼分析

我們首先需要抓取頁面。

我們可以看到網址是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編碼。