python爬取螞蜂窩教程(python爬取數據的原理)

本文目錄一覽:

python 可以在螞蜂窩上爬數據嗎

當然可以。

爬蟲代碼分析

我們首先需要爬取得頁面為 

我們可以看到url為曼谷p=1t=catekt=1。主要參數有q ,p ,t,其中q為城市名,p為頁碼,t為分類,cate為美食,kt為不影響參數。

需要獲取該頁面,detail為域名以後的參數,這個函數可以用於獲得域名主頁下的網頁

#獲取下級頁面

def getDetailPage(detailURL):

try:

url = “”+detailURL”

request = urllib2.Request(url)

response = urllib2.urlopen(request)

#利用urllib2的Request方法返回一個request對象並用urlopen打開

page = response.read()

#用read()方法讀取頁面內容,Input: print page Output: 頁面html

pageCode = re.sub(r’br[ ]?/?’, ‘\n’, page)

#去掉html里的回車空行

return pageCode

except urllib2.URLError, e:

if hasattr(e, “reason”):

print e.reason

return None12345678910111213141516

獲得每家美食店鋪的鏈接,首先進行元素檢查查看鏈接位於的位置

#獲得美食單頁店鋪鏈接

def getFoodHref(self,pageid):

url = “/group/s.php?q=”+self.city+”p=” +str(pageid)+ “t=catekt=1”

page = getDetailPage(url)        #調用getDetailPage獲得頁面

soup = BeautifulSoup(page,’html.parser’)        #用BeautifulSoup進行頁面解析

FoodHref = []

FoodLists =  soup.find(name=”div”,attrs={‘data-category’:’poi’}).ul

FoodHrefList = FoodLists.find_all(“h3″)        #找出div class=”_j_search_section” data-category=”poi”標籤下所有的h3標籤的內容,結果為店鋪列表的html

for FoodHrefs in FoodHrefList:

FoodWebsite = FoodHrefs.a[‘href’]            #對列表循環找出a標籤href屬性的值,即為店鋪的url

FoodHrefShort = str(FoodWebsite).replace(”,”)            #去掉url前的域名,以便等會調用getDetaiL函數,傳入它獲得店鋪頁面

FoodHref.append(FoodHrefShort)        return FoodHref123456789101112131415161718

接下來再次調用getDetailPage(),傳入FoodHref,即可可以獲得店鋪的頁面,通過BeautifulSoup進行信息獲取了。但我在抓取的時候遇到一個問題。 

這是一個信息齊全的店鋪,但有的店鋪沒有網址,沒有交通信息該怎麼辦。比如這個 

經過元素檢查發現標籤也是一樣的,無法通過標籤特有的屬性或者class的值進行定向抓取。用div class=”bd”的子節點兄弟節點查也不行。後來想出一個方法。

先寫一個匹配函數hasAttr,list參數為一個中文的完整信息名列表,在getShopInfo方法里通過循環列表內容與抓取的div class=”bd”標籤內容匹配,如果返回True則表示存在該信息項,否則繼續匹配下一項。比如上面的圖,先匹配簡介,匹配失敗,繼續匹配英文名字,也失敗,知道匹配到地址,成功,保存地址下一個標籤的內容。直到獲得所有信息。

#判斷是否存在信息列表

def hasAttr(self,list):

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:            return True

else:            return 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”).h1.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(                            ‘div class=”col-main.*?div class=”bd”.*?’+ infoItem[i] +’/h3.*?(.*?)/p’, re.S)

shopInfos = re.findall(pattern_shopinfo, page)                        #存在該項則用正則取出其標籤內容

for shopInfo in shopInfos:

shopInfoList[i] = shopInfo                else:                        #繼續查找下一項

continue

shopInfoList[7] = shopName

shopInfoList[8] = shopScore            return shopInfoList1234567891011121314151617181920212223242526272829303132333435

最後將數據加入字典,如果一鍵對多值,比如dict = {a:[]},調用set default(鍵名,[]).append(列表值) 

dict.setdefault(‘comment’,[]).appnd(comment)

然後json.dumps(dict,indent=1).decode(“unicode_escape”)。indent參數是為了以json樹形式表現出數據,如果內容中有中文要用decode(“unicode_escape”),否則結果為」\u」的unicode編碼

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/196178.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-03 09:54
下一篇 2024-12-03 09:54

相關推薦

  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • MQTT使用教程

    MQTT是一種輕量級的消息傳輸協議,適用於物聯網領域中的設備與雲端、設備與設備之間的數據傳輸。本文將介紹使用MQTT實現設備與雲端數據傳輸的方法和注意事項。 一、準備工作 在使用M…

    編程 2025-04-29
  • Python3.6.5下載安裝教程

    Python是一種面向對象、解釋型計算機程序語言。它是一門動態語言,因為它不會對程序員提前聲明變數類型,而是在變數第一次賦值時自動識別該變數的類型。 Python3.6.5是Pyt…

    編程 2025-04-29
  • Deepin系統分區設置教程

    本教程將會詳細介紹Deepin系統如何進行分區設置,分享多種方式讓您了解如何規劃您的硬碟。 一、分區的基本知識 在進行Deepin系統分區設置之前,我們需要了解一些基本分區概念。 …

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • Python兩張表數據匹配

    本篇文章將詳細闡述如何使用Python將兩張表格中的數據匹配。以下是具體的解決方法。 一、數據匹配的概念 在生活和工作中,我們常常需要對多組數據進行比對和匹配。在數據量較小的情況下…

    編程 2025-04-29

發表回復

登錄後才能評論